Old version was based on lots of guesswork which had different hacks based on
32-bit version field instead of splitting it into major/minor/micro version.
RV2 picture header parser also had a few places where it deviated from binary
decoder.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
... | ... |
@@ -34,6 +34,10 @@ |
34 | 34 |
|
35 | 35 |
//#define DEBUG |
36 | 36 |
|
37 |
+#define RV_GET_MAJOR_VER(x) ((x) >> 28) |
|
38 |
+#define RV_GET_MINOR_VER(x) (((x) >> 20) & 0xFF) |
|
39 |
+#define RV_GET_MICRO_VER(x) (((x) >> 12) & 0xFF) |
|
40 |
+ |
|
37 | 41 |
#define DC_VLC_BITS 14 //FIXME find a better solution |
38 | 42 |
|
39 | 43 |
static const uint16_t rv_lum_code[256] = |
... | ... |
@@ -292,13 +296,7 @@ static int rv10_decode_picture_header(MpegEncContext *s) |
292 | 292 |
static int rv20_decode_picture_header(MpegEncContext *s) |
293 | 293 |
{ |
294 | 294 |
int seq, mb_pos, i; |
295 |
- |
|
296 |
- if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){ |
|
297 |
- if (get_bits(&s->gb, 3)){ |
|
298 |
- av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n"); |
|
299 |
- return -1; |
|
300 |
- } |
|
301 |
- } |
|
295 |
+ int rpr_bits; |
|
302 | 296 |
|
303 | 297 |
i= get_bits(&s->gb, 2); |
304 | 298 |
switch(i){ |
... | ... |
@@ -317,7 +315,7 @@ static int rv20_decode_picture_header(MpegEncContext *s) |
317 | 317 |
} |
318 | 318 |
|
319 | 319 |
if (get_bits1(&s->gb)){ |
320 |
- av_log(s->avctx, AV_LOG_ERROR, "unknown bit set\n"); |
|
320 |
+ av_log(s->avctx, AV_LOG_ERROR, "reserved bit set\n"); |
|
321 | 321 |
return -1; |
322 | 322 |
} |
323 | 323 |
|
... | ... |
@@ -326,23 +324,21 @@ static int rv20_decode_picture_header(MpegEncContext *s) |
326 | 326 |
av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n"); |
327 | 327 |
return -1; |
328 | 328 |
} |
329 |
- if(s->avctx->sub_id == 0x30203002){ |
|
330 |
- if (get_bits1(&s->gb)){ |
|
331 |
- av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n"); |
|
332 |
- return -1; |
|
333 |
- } |
|
334 |
- } |
|
335 | 329 |
|
336 |
- if(s->avctx->has_b_frames){ |
|
337 |
- int f, new_w, new_h; |
|
338 |
- int v= s->avctx->extradata_size >= 4 ? 7&((uint8_t*)s->avctx->extradata)[1] : 0; |
|
330 |
+ if(RV_GET_MINOR_VER(s->avctx->sub_id) >= 2) |
|
331 |
+ s->loop_filter = get_bits1(&s->gb); |
|
339 | 332 |
|
340 |
- if (get_bits1(&s->gb)){ |
|
341 |
- av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n"); |
|
342 |
- } |
|
343 |
- seq= get_bits(&s->gb, 13)<<2; |
|
333 |
+ if(RV_GET_MINOR_VER(s->avctx->sub_id) <= 1) |
|
334 |
+ seq = get_bits(&s->gb, 8) << 7; |
|
335 |
+ else |
|
336 |
+ seq = get_bits(&s->gb, 13) << 2; |
|
337 |
+ |
|
338 |
+ rpr_bits = s->avctx->extradata[1] & 7; |
|
339 |
+ if(rpr_bits){ |
|
340 |
+ int f, new_w, new_h; |
|
341 |
+ rpr_bits = FFMIN((rpr_bits >> 1) + 1, 3); |
|
344 | 342 |
|
345 |
- f= get_bits(&s->gb, av_log2(v)+1); |
|
343 |
+ f = get_bits(&s->gb, rpr_bits); |
|
346 | 344 |
|
347 | 345 |
if(f){ |
348 | 346 |
new_w= 4*((uint8_t*)s->avctx->extradata)[6+2*f]; |
... | ... |
@@ -364,19 +360,12 @@ static int rv20_decode_picture_header(MpegEncContext *s) |
364 | 364 |
} |
365 | 365 |
|
366 | 366 |
if(s->avctx->debug & FF_DEBUG_PICT_INFO){ |
367 |
- av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, v); |
|
367 |
+ av_log(s->avctx, AV_LOG_DEBUG, "F %d/%d\n", f, rpr_bits); |
|
368 | 368 |
} |
369 |
- }else{ |
|
370 |
- seq= get_bits(&s->gb, 8)*128; |
|
371 | 369 |
} |
372 | 370 |
|
373 |
-// if(s->avctx->sub_id <= 0x20201002){ //0x20201002 definitely needs this |
|
374 |
- mb_pos= ff_h263_decode_mba(s); |
|
375 |
-/* }else{ |
|
376 |
- mb_pos= get_bits(&s->gb, av_log2(s->mb_num-1)+1); |
|
377 |
- s->mb_x= mb_pos % s->mb_width; |
|
378 |
- s->mb_y= mb_pos / s->mb_width; |
|
379 |
- }*/ |
|
371 |
+ mb_pos = ff_h263_decode_mba(s); |
|
372 |
+ |
|
380 | 373 |
//av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq); |
381 | 374 |
seq |= s->time &~0x7FFF; |
382 | 375 |
if(seq - s->time > 0x4000) seq -= 0x8000; |
... | ... |
@@ -403,6 +392,9 @@ static int rv20_decode_picture_header(MpegEncContext *s) |
403 | 403 |
av_log(s->avctx, AV_LOG_DEBUG, "\n");*/ |
404 | 404 |
s->no_rounding= get_bits1(&s->gb); |
405 | 405 |
|
406 |
+ if(RV_GET_MINOR_VER(s->avctx->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B) |
|
407 |
+ skip_bits(&s->gb, 5); // binary decoder reads 3+2 bits here but they don't seem to be used |
|
408 |
+ |
|
406 | 409 |
s->f_code = 1; |
407 | 410 |
s->unrestricted_mv = 1; |
408 | 411 |
s->h263_aic= s->pict_type == AV_PICTURE_TYPE_I; |
... | ... |
@@ -427,6 +419,7 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) |
427 | 427 |
{ |
428 | 428 |
MpegEncContext *s = avctx->priv_data; |
429 | 429 |
static int done=0; |
430 |
+ int major_ver, minor_ver, micro_ver; |
|
430 | 431 |
|
431 | 432 |
if (avctx->extradata_size < 8) { |
432 | 433 |
av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n"); |
... | ... |
@@ -445,32 +438,27 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) |
445 | 445 |
s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1; |
446 | 446 |
avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4); |
447 | 447 |
|
448 |
- if (avctx->sub_id == 0x10000000) { |
|
449 |
- s->rv10_version= 0; |
|
450 |
- s->low_delay=1; |
|
451 |
- } else if (avctx->sub_id == 0x10001000) { |
|
452 |
- s->rv10_version= 3; |
|
453 |
- s->low_delay=1; |
|
454 |
- } else if (avctx->sub_id == 0x10002000) { |
|
455 |
- s->rv10_version= 3; |
|
456 |
- s->low_delay=1; |
|
457 |
- s->obmc=1; |
|
458 |
- } else if (avctx->sub_id == 0x10003000) { |
|
459 |
- s->rv10_version= 3; |
|
460 |
- s->low_delay=1; |
|
461 |
- } else if (avctx->sub_id == 0x10003001) { |
|
462 |
- s->rv10_version= 3; |
|
463 |
- s->low_delay=1; |
|
464 |
- } else if ( avctx->sub_id == 0x20001000 |
|
465 |
- || (avctx->sub_id >= 0x20100000 && avctx->sub_id < 0x201a0000)) { |
|
466 |
- s->low_delay=1; |
|
467 |
- } else if ( avctx->sub_id == 0x30202002 |
|
468 |
- || avctx->sub_id == 0x30203002 |
|
469 |
- || (avctx->sub_id >= 0x20200002 && avctx->sub_id < 0x20300000)) { |
|
470 |
- s->low_delay=0; |
|
471 |
- s->avctx->has_b_frames=1; |
|
472 |
- } else |
|
448 |
+ major_ver = RV_GET_MAJOR_VER(avctx->sub_id); |
|
449 |
+ minor_ver = RV_GET_MINOR_VER(avctx->sub_id); |
|
450 |
+ micro_ver = RV_GET_MICRO_VER(avctx->sub_id); |
|
451 |
+ |
|
452 |
+ s->low_delay = 1; |
|
453 |
+ switch (major_ver) { |
|
454 |
+ case 1: |
|
455 |
+ s->rv10_version = micro_ver ? 3 : 1; |
|
456 |
+ s->obmc = micro_ver == 2; |
|
457 |
+ break; |
|
458 |
+ case 2: |
|
459 |
+ if (minor_ver >= 2) { |
|
460 |
+ s->low_delay = 0; |
|
461 |
+ s->avctx->has_b_frames = 1; |
|
462 |
+ } |
|
463 |
+ break; |
|
464 |
+ default: |
|
473 | 465 |
av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id); |
466 |
+ av_log_missing_feature(avctx, "RV1/2 version", 1); |
|
467 |
+ return AVERROR_PATCHWELCOME; |
|
468 |
+ } |
|
474 | 469 |
|
475 | 470 |
if(avctx->debug & FF_DEBUG_PICT_INFO){ |
476 | 471 |
av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1); |