00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #include "libavutil/imgutils.h"
00029 #include "avcodec.h"
00030 #include "dsputil.h"
00031 #include "mpegvideo.h"
00032 #include "mpeg4video.h"
00033 #include "h263.h"
00034
00035
00036
00037 #define DC_VLC_BITS 14 //FIXME find a better solution
00038
00039 static const uint16_t rv_lum_code[256] =
00040 {
00041 0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
00042 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
00043 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
00044 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
00045 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
00046 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
00047 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
00048 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
00049 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
00050 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
00051 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
00052 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
00053 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
00054 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
00055 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
00056 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
00057 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
00058 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
00059 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
00060 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
00061 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
00062 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
00063 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
00064 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
00065 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
00066 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
00067 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
00068 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
00069 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
00070 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
00071 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
00072 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
00073 };
00074
00075 static const uint8_t rv_lum_bits[256] =
00076 {
00077 14, 12, 12, 12, 12, 12, 12, 12,
00078 12, 12, 12, 12, 12, 12, 12, 12,
00079 12, 12, 12, 12, 12, 12, 12, 12,
00080 12, 12, 12, 12, 12, 12, 12, 12,
00081 12, 12, 12, 12, 12, 12, 12, 12,
00082 12, 12, 12, 12, 12, 12, 12, 12,
00083 12, 12, 12, 12, 12, 12, 12, 12,
00084 12, 12, 12, 12, 12, 12, 12, 12,
00085 12, 10, 10, 10, 10, 10, 10, 10,
00086 10, 10, 10, 10, 10, 10, 10, 10,
00087 10, 10, 10, 10, 10, 10, 10, 10,
00088 10, 10, 10, 10, 10, 10, 10, 10,
00089 10, 8, 8, 8, 8, 8, 8, 8,
00090 8, 8, 8, 8, 8, 8, 8, 8,
00091 8, 7, 7, 7, 7, 7, 7, 7,
00092 7, 6, 6, 6, 6, 5, 5, 4,
00093 2, 4, 5, 5, 6, 6, 6, 6,
00094 7, 7, 7, 7, 7, 7, 7, 7,
00095 8, 8, 8, 8, 8, 8, 8, 8,
00096 8, 8, 8, 8, 8, 8, 8, 8,
00097 10, 10, 10, 10, 10, 10, 10, 10,
00098 10, 10, 10, 10, 10, 10, 10, 10,
00099 10, 10, 10, 10, 10, 10, 10, 10,
00100 10, 10, 10, 10, 10, 10, 10, 10,
00101 12, 12, 12, 12, 12, 12, 12, 12,
00102 12, 12, 12, 12, 12, 12, 12, 12,
00103 12, 12, 12, 12, 12, 12, 12, 12,
00104 12, 12, 12, 12, 12, 12, 12, 12,
00105 12, 12, 12, 12, 12, 12, 12, 12,
00106 12, 12, 12, 12, 12, 12, 12, 12,
00107 12, 12, 12, 12, 12, 12, 12, 12,
00108 12, 12, 12, 12, 12, 12, 12, 12,
00109 };
00110
00111 static const uint16_t rv_chrom_code[256] =
00112 {
00113 0xfe7f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
00114 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
00115 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
00116 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
00117 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
00118 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
00119 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
00120 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
00121 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
00122 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
00123 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
00124 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
00125 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
00126 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
00127 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
00128 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
00129 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
00130 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
00131 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
00132 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
00133 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
00134 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
00135 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
00136 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
00137 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
00138 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
00139 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
00140 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
00141 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
00142 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
00143 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
00144 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
00145 };
00146
00147 static const uint8_t rv_chrom_bits[256] =
00148 {
00149 16, 14, 14, 14, 14, 14, 14, 14,
00150 14, 14, 14, 14, 14, 14, 14, 14,
00151 14, 14, 14, 14, 14, 14, 14, 14,
00152 14, 14, 14, 14, 14, 14, 14, 14,
00153 14, 14, 14, 14, 14, 14, 14, 14,
00154 14, 14, 14, 14, 14, 14, 14, 14,
00155 14, 14, 14, 14, 14, 14, 14, 14,
00156 14, 14, 14, 14, 14, 14, 14, 14,
00157 14, 12, 12, 12, 12, 12, 12, 12,
00158 12, 12, 12, 12, 12, 12, 12, 12,
00159 12, 12, 12, 12, 12, 12, 12, 12,
00160 12, 12, 12, 12, 12, 12, 12, 12,
00161 12, 10, 10, 10, 10, 10, 10, 10,
00162 10, 10, 10, 10, 10, 10, 10, 10,
00163 10, 8, 8, 8, 8, 8, 8, 8,
00164 8, 6, 6, 6, 6, 4, 4, 3,
00165 2, 3, 4, 4, 6, 6, 6, 6,
00166 8, 8, 8, 8, 8, 8, 8, 8,
00167 10, 10, 10, 10, 10, 10, 10, 10,
00168 10, 10, 10, 10, 10, 10, 10, 10,
00169 12, 12, 12, 12, 12, 12, 12, 12,
00170 12, 12, 12, 12, 12, 12, 12, 12,
00171 12, 12, 12, 12, 12, 12, 12, 12,
00172 12, 12, 12, 12, 12, 12, 12, 12,
00173 14, 14, 14, 14, 14, 14, 14, 14,
00174 14, 14, 14, 14, 14, 14, 14, 14,
00175 14, 14, 14, 14, 14, 14, 14, 14,
00176 14, 14, 14, 14, 14, 14, 14, 14,
00177 14, 14, 14, 14, 14, 14, 14, 14,
00178 14, 14, 14, 14, 14, 14, 14, 14,
00179 14, 14, 14, 14, 14, 14, 14, 14,
00180 14, 14, 14, 14, 14, 14, 14, 14,
00181 };
00182
00183 static VLC rv_dc_lum, rv_dc_chrom;
00184
00185 int rv_decode_dc(MpegEncContext *s, int n)
00186 {
00187 int code;
00188
00189 if (n < 4) {
00190 code = get_vlc2(&s->gb, rv_dc_lum.table, DC_VLC_BITS, 2);
00191 if (code < 0) {
00192
00193
00194
00195 code = get_bits(&s->gb, 7);
00196 if (code == 0x7c) {
00197 code = (int8_t)(get_bits(&s->gb, 7) + 1);
00198 } else if (code == 0x7d) {
00199 code = -128 + get_bits(&s->gb, 7);
00200 } else if (code == 0x7e) {
00201 if (get_bits1(&s->gb) == 0)
00202 code = (int8_t)(get_bits(&s->gb, 8) + 1);
00203 else
00204 code = (int8_t)(get_bits(&s->gb, 8));
00205 } else if (code == 0x7f) {
00206 skip_bits(&s->gb, 11);
00207 code = 1;
00208 }
00209 } else {
00210 code -= 128;
00211 }
00212 } else {
00213 code = get_vlc2(&s->gb, rv_dc_chrom.table, DC_VLC_BITS, 2);
00214
00215 if (code < 0) {
00216 code = get_bits(&s->gb, 9);
00217 if (code == 0x1fc) {
00218 code = (int8_t)(get_bits(&s->gb, 7) + 1);
00219 } else if (code == 0x1fd) {
00220 code = -128 + get_bits(&s->gb, 7);
00221 } else if (code == 0x1fe) {
00222 skip_bits(&s->gb, 9);
00223 code = 1;
00224 } else {
00225 av_log(s->avctx, AV_LOG_ERROR, "chroma dc error\n");
00226 return 0xffff;
00227 }
00228 } else {
00229 code -= 128;
00230 }
00231 }
00232 return -code;
00233 }
00234
00235
00236 static int rv10_decode_picture_header(MpegEncContext *s)
00237 {
00238 int mb_count, pb_frame, marker, mb_xy;
00239
00240 marker = get_bits1(&s->gb);
00241
00242 if (get_bits1(&s->gb))
00243 s->pict_type = AV_PICTURE_TYPE_P;
00244 else
00245 s->pict_type = AV_PICTURE_TYPE_I;
00246 if(!marker) av_log(s->avctx, AV_LOG_ERROR, "marker missing\n");
00247 pb_frame = get_bits1(&s->gb);
00248
00249 av_dlog(s->avctx, "pict_type=%d pb_frame=%d\n", s->pict_type, pb_frame);
00250
00251 if (pb_frame){
00252 av_log(s->avctx, AV_LOG_ERROR, "pb frame not supported\n");
00253 return -1;
00254 }
00255
00256 s->qscale = get_bits(&s->gb, 5);
00257 if(s->qscale==0){
00258 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
00259 return -1;
00260 }
00261
00262 if (s->pict_type == AV_PICTURE_TYPE_I) {
00263 if (s->rv10_version == 3) {
00264
00265 s->last_dc[0] = get_bits(&s->gb, 8);
00266 s->last_dc[1] = get_bits(&s->gb, 8);
00267 s->last_dc[2] = get_bits(&s->gb, 8);
00268 av_dlog(s->avctx, "DC:%d %d %d\n", s->last_dc[0],
00269 s->last_dc[1], s->last_dc[2]);
00270 }
00271 }
00272
00273
00274
00275 mb_xy= s->mb_x + s->mb_y*s->mb_width;
00276 if(show_bits(&s->gb, 12)==0 || (mb_xy && mb_xy < s->mb_num)){
00277 s->mb_x = get_bits(&s->gb, 6);
00278 s->mb_y = get_bits(&s->gb, 6);
00279 mb_count = get_bits(&s->gb, 12);
00280 } else {
00281 s->mb_x = 0;
00282 s->mb_y = 0;
00283 mb_count = s->mb_width * s->mb_height;
00284 }
00285 skip_bits(&s->gb, 3);
00286 s->f_code = 1;
00287 s->unrestricted_mv = 1;
00288
00289 return mb_count;
00290 }
00291
00292 static int rv20_decode_picture_header(MpegEncContext *s)
00293 {
00294 int seq, mb_pos, i;
00295
00296 #if 0
00297 GetBitContext gb= s->gb;
00298 for(i=0; i<64; i++){
00299 av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&gb));
00300 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
00301 }
00302 av_log(s->avctx, AV_LOG_DEBUG, "\n");
00303 #endif
00304 #if 0
00305 av_log(s->avctx, AV_LOG_DEBUG, "%3dx%03d/%02Xx%02X ", s->width, s->height, s->width/4, s->height/4);
00306 for(i=0; i<s->avctx->extradata_size; i++){
00307 av_log(s->avctx, AV_LOG_DEBUG, "%02X ", ((uint8_t*)s->avctx->extradata)[i]);
00308 if(i%4==3) av_log(s->avctx, AV_LOG_DEBUG, " ");
00309 }
00310 av_log(s->avctx, AV_LOG_DEBUG, "\n");
00311 #endif
00312
00313 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){
00314 if (get_bits(&s->gb, 3)){
00315 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n");
00316 return -1;
00317 }
00318 }
00319
00320 i= get_bits(&s->gb, 2);
00321 switch(i){
00322 case 0: s->pict_type= AV_PICTURE_TYPE_I; break;
00323 case 1: s->pict_type= AV_PICTURE_TYPE_I; break;
00324 case 2: s->pict_type= AV_PICTURE_TYPE_P; break;
00325 case 3: s->pict_type= AV_PICTURE_TYPE_B; break;
00326 default:
00327 av_log(s->avctx, AV_LOG_ERROR, "unknown frame type\n");
00328 return -1;
00329 }
00330
00331 if(s->last_picture_ptr==NULL && s->pict_type==AV_PICTURE_TYPE_B){
00332 av_log(s->avctx, AV_LOG_ERROR, "early B pix\n");
00333 return -1;
00334 }
00335
00336 if (get_bits1(&s->gb)){
00337 av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n");
00338 return -1;
00339 }
00340
00341 s->qscale = get_bits(&s->gb, 5);
00342 if(s->qscale==0){
00343 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n");
00344 return -1;
00345 }
00346 if(s->avctx->sub_id == 0x30203002){
00347 if (get_bits1(&s->gb)){
00348 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n");
00349 return -1;
00350 }
00351 }
00352
00353 if(s->avctx->has_b_frames){
00354 int f, new_w, new_h;
00355 int v= s->avctx->extradata_size >= 4 ? 7&((uint8_t*)s->avctx->extradata)[1] : 0;
00356
00357 if (get_bits1(&s->gb)){
00358 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n");
00359 }
00360 seq= get_bits(&s->gb, 13)<<2;
00361
00362 f= get_bits(&s->gb, av_log2(v)+1);
00363
00364 if(f){
00365 new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f];
00366 new_h= 4*((uint8_t*)s->avctx->extradata)[7+2*f];
00367 }else{
00368 new_w= s->orig_width ;
00369 new_h= s->orig_height;
00370 }
00371 if(new_w != s->width || new_h != s->height){
00372 av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h);
00373 if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0)
00374 return -1;
00375 MPV_common_end(s);
00376 avcodec_set_dimensions(s->avctx, new_w, new_h);
00377 s->width = new_w;
00378 s->height = new_h;
00379 if (MPV_common_init(s) < 0)
00380 return -1;
00381 }
00382
00383 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
00384 av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v);
00385 }
00386 }else{
00387 seq= get_bits(&s->gb, 8)*128;
00388 }
00389
00390
00391 mb_pos= ff_h263_decode_mba(s);
00392
00393
00394
00395
00396
00397
00398 seq |= s->time &~0x7FFF;
00399 if(seq - s->time > 0x4000) seq -= 0x8000;
00400 if(seq - s->time < -0x4000) seq += 0x8000;
00401 if(seq != s->time){
00402 if(s->pict_type!=AV_PICTURE_TYPE_B){
00403 s->time= seq;
00404 s->pp_time= s->time - s->last_non_b_time;
00405 s->last_non_b_time= s->time;
00406 }else{
00407 s->time= seq;
00408 s->pb_time= s->pp_time - (s->last_non_b_time - s->time);
00409 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){
00410 av_log(s->avctx, AV_LOG_DEBUG, "messed up order, possible from seeking? skipping current b frame\n");
00411 return FRAME_SKIPPED;
00412 }
00413 ff_mpeg4_init_direct_mv(s);
00414 }
00415 }
00416
00417
00418
00419
00420
00421 s->no_rounding= get_bits1(&s->gb);
00422
00423 s->f_code = 1;
00424 s->unrestricted_mv = 1;
00425 s->h263_aic= s->pict_type == AV_PICTURE_TYPE_I;
00426
00427
00428
00429 s->modified_quant=1;
00430 if(!s->avctx->lowres)
00431 s->loop_filter=1;
00432
00433 if(s->avctx->debug & FF_DEBUG_PICT_INFO){
00434 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n",
00435 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding);
00436 }
00437
00438 assert(s->pict_type != AV_PICTURE_TYPE_B || !s->low_delay);
00439
00440 return s->mb_width*s->mb_height - mb_pos;
00441 }
00442
00443 static av_cold int rv10_decode_init(AVCodecContext *avctx)
00444 {
00445 MpegEncContext *s = avctx->priv_data;
00446 static int done=0;
00447
00448 if (avctx->extradata_size < 8) {
00449 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
00450 return -1;
00451 }
00452
00453 MPV_decode_defaults(s);
00454
00455 s->avctx= avctx;
00456 s->out_format = FMT_H263;
00457 s->codec_id= avctx->codec_id;
00458
00459 s->orig_width = s->width = avctx->coded_width;
00460 s->orig_height= s->height = avctx->coded_height;
00461
00462 s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1;
00463 avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4);
00464
00465 if (avctx->sub_id == 0x10000000) {
00466 s->rv10_version= 0;
00467 s->low_delay=1;
00468 } else if (avctx->sub_id == 0x10001000) {
00469 s->rv10_version= 3;
00470 s->low_delay=1;
00471 } else if (avctx->sub_id == 0x10002000) {
00472 s->rv10_version= 3;
00473 s->low_delay=1;
00474 s->obmc=1;
00475 } else if (avctx->sub_id == 0x10003000) {
00476 s->rv10_version= 3;
00477 s->low_delay=1;
00478 } else if (avctx->sub_id == 0x10003001) {
00479 s->rv10_version= 3;
00480 s->low_delay=1;
00481 } else if ( avctx->sub_id == 0x20001000
00482 || (avctx->sub_id >= 0x20100000 && avctx->sub_id < 0x201a0000)) {
00483 s->low_delay=1;
00484 } else if ( avctx->sub_id == 0x30202002
00485 || avctx->sub_id == 0x30203002
00486 || (avctx->sub_id >= 0x20200002 && avctx->sub_id < 0x20300000)) {
00487 s->low_delay=0;
00488 s->avctx->has_b_frames=1;
00489 } else
00490 av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id);
00491
00492 if(avctx->debug & FF_DEBUG_PICT_INFO){
00493 av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1);
00494 }
00495
00496 avctx->pix_fmt = PIX_FMT_YUV420P;
00497
00498 if (MPV_common_init(s) < 0)
00499 return -1;
00500
00501 h263_decode_init_vlc(s);
00502
00503
00504 if (!done) {
00505 INIT_VLC_STATIC(&rv_dc_lum, DC_VLC_BITS, 256,
00506 rv_lum_bits, 1, 1,
00507 rv_lum_code, 2, 2, 16384);
00508 INIT_VLC_STATIC(&rv_dc_chrom, DC_VLC_BITS, 256,
00509 rv_chrom_bits, 1, 1,
00510 rv_chrom_code, 2, 2, 16388);
00511 done = 1;
00512 }
00513
00514 return 0;
00515 }
00516
00517 static av_cold int rv10_decode_end(AVCodecContext *avctx)
00518 {
00519 MpegEncContext *s = avctx->priv_data;
00520
00521 MPV_common_end(s);
00522 return 0;
00523 }
00524
00525 static int rv10_decode_packet(AVCodecContext *avctx,
00526 const uint8_t *buf, int buf_size, int buf_size2)
00527 {
00528 MpegEncContext *s = avctx->priv_data;
00529 int mb_count, mb_pos, left, start_mb_x;
00530
00531 init_get_bits(&s->gb, buf, buf_size*8);
00532 if(s->codec_id ==CODEC_ID_RV10)
00533 mb_count = rv10_decode_picture_header(s);
00534 else
00535 mb_count = rv20_decode_picture_header(s);
00536 if (mb_count < 0) {
00537 av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
00538 return -1;
00539 }
00540
00541 if (s->mb_x >= s->mb_width ||
00542 s->mb_y >= s->mb_height) {
00543 av_log(s->avctx, AV_LOG_ERROR, "POS ERROR %d %d\n", s->mb_x, s->mb_y);
00544 return -1;
00545 }
00546 mb_pos = s->mb_y * s->mb_width + s->mb_x;
00547 left = s->mb_width * s->mb_height - mb_pos;
00548 if (mb_count > left) {
00549 av_log(s->avctx, AV_LOG_ERROR, "COUNT ERROR\n");
00550 return -1;
00551 }
00552
00553 if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
00554 if(s->current_picture_ptr){
00555 ff_er_frame_end(s);
00556 MPV_frame_end(s);
00557 s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0;
00558 }
00559 if(MPV_frame_start(s, avctx) < 0)
00560 return -1;
00561 ff_er_frame_start(s);
00562 } else {
00563 if (s->current_picture_ptr->pict_type != s->pict_type) {
00564 av_log(s->avctx, AV_LOG_ERROR, "Slice type mismatch\n");
00565 return -1;
00566 }
00567 }
00568
00569
00570 av_dlog(avctx, "qscale=%d\n", s->qscale);
00571
00572
00573 if(s->codec_id== CODEC_ID_RV10){
00574 if(s->mb_y==0) s->first_slice_line=1;
00575 }else{
00576 s->first_slice_line=1;
00577 s->resync_mb_x= s->mb_x;
00578 }
00579 start_mb_x= s->mb_x;
00580 s->resync_mb_y= s->mb_y;
00581 if(s->h263_aic){
00582 s->y_dc_scale_table=
00583 s->c_dc_scale_table= ff_aic_dc_scale_table;
00584 }else{
00585 s->y_dc_scale_table=
00586 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
00587 }
00588
00589 if(s->modified_quant)
00590 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
00591
00592 ff_set_qscale(s, s->qscale);
00593
00594 s->rv10_first_dc_coded[0] = 0;
00595 s->rv10_first_dc_coded[1] = 0;
00596 s->rv10_first_dc_coded[2] = 0;
00597 s->block_wrap[0]=
00598 s->block_wrap[1]=
00599 s->block_wrap[2]=
00600 s->block_wrap[3]= s->b8_stride;
00601 s->block_wrap[4]=
00602 s->block_wrap[5]= s->mb_stride;
00603 ff_init_block_index(s);
00604
00605
00606 for(s->mb_num_left= mb_count; s->mb_num_left>0; s->mb_num_left--) {
00607 int ret;
00608 ff_update_block_index(s);
00609 av_dlog(avctx, "**mb x=%d y=%d\n", s->mb_x, s->mb_y);
00610
00611 s->mv_dir = MV_DIR_FORWARD;
00612 s->mv_type = MV_TYPE_16X16;
00613 ret=ff_h263_decode_mb(s, s->block);
00614
00615 if (ret != SLICE_ERROR && s->gb.size_in_bits < get_bits_count(&s->gb) && 8*buf_size2 >= get_bits_count(&s->gb)){
00616 av_log(avctx, AV_LOG_DEBUG, "update size from %d to %d\n", s->gb.size_in_bits, 8*buf_size2);
00617 s->gb.size_in_bits= 8*buf_size2;
00618 ret= SLICE_OK;
00619 }
00620
00621 if (ret == SLICE_ERROR || s->gb.size_in_bits < get_bits_count(&s->gb)) {
00622 av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
00623 return -1;
00624 }
00625 if(s->pict_type != AV_PICTURE_TYPE_B)
00626 ff_h263_update_motion_val(s);
00627 MPV_decode_mb(s, s->block);
00628 if(s->loop_filter)
00629 ff_h263_loop_filter(s);
00630
00631 if (++s->mb_x == s->mb_width) {
00632 s->mb_x = 0;
00633 s->mb_y++;
00634 ff_init_block_index(s);
00635 }
00636 if(s->mb_x == s->resync_mb_x)
00637 s->first_slice_line=0;
00638 if(ret == SLICE_END) break;
00639 }
00640
00641 ff_er_add_slice(s, start_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
00642
00643 return s->gb.size_in_bits;
00644 }
00645
00646 static int get_slice_offset(AVCodecContext *avctx, const uint8_t *buf, int n)
00647 {
00648 if(avctx->slice_count) return avctx->slice_offset[n];
00649 else return AV_RL32(buf + n*8);
00650 }
00651
00652 static int rv10_decode_frame(AVCodecContext *avctx,
00653 void *data, int *data_size,
00654 AVPacket *avpkt)
00655 {
00656 const uint8_t *buf = avpkt->data;
00657 int buf_size = avpkt->size;
00658 MpegEncContext *s = avctx->priv_data;
00659 int i;
00660 AVFrame *pict = data;
00661 int slice_count;
00662 const uint8_t *slices_hdr = NULL;
00663
00664 av_dlog(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size);
00665 s->flags = avctx->flags;
00666 s->flags2 = avctx->flags2;
00667
00668
00669 if (buf_size == 0) {
00670 return 0;
00671 }
00672
00673 if(!avctx->slice_count){
00674 slice_count = (*buf++) + 1;
00675 buf_size--;
00676 slices_hdr = buf + 4;
00677 buf += 8 * slice_count;
00678 buf_size -= 8 * slice_count;
00679 if (buf_size <= 0)
00680 return AVERROR_INVALIDDATA;
00681 }else
00682 slice_count = avctx->slice_count;
00683
00684 for(i=0; i<slice_count; i++){
00685 int offset= get_slice_offset(avctx, slices_hdr, i);
00686 int size, size2;
00687
00688 if(i+1 == slice_count)
00689 size= buf_size - offset;
00690 else
00691 size= get_slice_offset(avctx, slices_hdr, i+1) - offset;
00692
00693 if(i+2 >= slice_count)
00694 size2= buf_size - offset;
00695 else
00696 size2= get_slice_offset(avctx, slices_hdr, i+2) - offset;
00697
00698 if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size)
00699 i++;
00700 }
00701
00702 if(s->current_picture_ptr != NULL && s->mb_y>=s->mb_height){
00703 ff_er_frame_end(s);
00704 MPV_frame_end(s);
00705
00706 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
00707 *pict= *(AVFrame*)s->current_picture_ptr;
00708 } else if (s->last_picture_ptr != NULL) {
00709 *pict= *(AVFrame*)s->last_picture_ptr;
00710 }
00711
00712 if(s->last_picture_ptr || s->low_delay){
00713 *data_size = sizeof(AVFrame);
00714 ff_print_debug_info(s, pict);
00715 }
00716 s->current_picture_ptr= NULL;
00717 }
00718
00719 return avpkt->size;
00720 }
00721
00722 AVCodec ff_rv10_decoder = {
00723 "rv10",
00724 AVMEDIA_TYPE_VIDEO,
00725 CODEC_ID_RV10,
00726 sizeof(MpegEncContext),
00727 rv10_decode_init,
00728 NULL,
00729 rv10_decode_end,
00730 rv10_decode_frame,
00731 CODEC_CAP_DR1,
00732 .max_lowres = 3,
00733 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
00734 .pix_fmts= ff_pixfmt_list_420,
00735 };
00736
00737 AVCodec ff_rv20_decoder = {
00738 "rv20",
00739 AVMEDIA_TYPE_VIDEO,
00740 CODEC_ID_RV20,
00741 sizeof(MpegEncContext),
00742 rv10_decode_init,
00743 NULL,
00744 rv10_decode_end,
00745 rv10_decode_frame,
00746 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
00747 .flush= ff_mpeg_flush,
00748 .max_lowres = 3,
00749 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
00750 .pix_fmts= ff_pixfmt_list_420,
00751 };