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 };