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