Mercurial > libavcodec.hg
comparison rv10.c @ 1655:c92147a61d97 libavcodec
rv20 (h263) b frame decoding support
author | michael |
---|---|
date | Thu, 04 Dec 2003 18:34:47 +0000 |
parents | 834922115010 |
children | aaaa1767acc2 |
comparison
equal
deleted
inserted
replaced
1654:1c123e036890 | 1655:c92147a61d97 |
---|---|
338 } | 338 } |
339 | 339 |
340 static int rv20_decode_picture_header(MpegEncContext *s) | 340 static int rv20_decode_picture_header(MpegEncContext *s) |
341 { | 341 { |
342 int seq, mb_pos, i; | 342 int seq, mb_pos, i; |
343 | |
344 if(s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){ | |
345 if (get_bits(&s->gb, 3)){ | |
346 av_log(s->avctx, AV_LOG_ERROR, "unknown triplet set\n"); | |
347 return -1; | |
348 } | |
349 } | |
343 | 350 |
344 i= get_bits(&s->gb, 2); | 351 i= get_bits(&s->gb, 2); |
345 switch(i){ | 352 switch(i){ |
346 case 0: s->pict_type= I_TYPE; break; | 353 case 0: s->pict_type= I_TYPE; break; |
347 case 1: s->pict_type= I_TYPE; break; //hmm ... | 354 case 1: s->pict_type= I_TYPE; break; //hmm ... |
360 s->qscale = get_bits(&s->gb, 5); | 367 s->qscale = get_bits(&s->gb, 5); |
361 if(s->qscale==0){ | 368 if(s->qscale==0){ |
362 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n"); | 369 av_log(s->avctx, AV_LOG_ERROR, "error, qscale:0\n"); |
363 return -1; | 370 return -1; |
364 } | 371 } |
365 | 372 if(s->avctx->sub_id == 0x30203002){ |
366 if(s->avctx->sub_id == 0x20200002) | 373 if (get_bits(&s->gb, 1)){ |
367 seq= get_bits(&s->gb, 16); | 374 av_log(s->avctx, AV_LOG_ERROR, "unknown bit2 set\n"); |
368 else | 375 return -1; |
369 seq= get_bits(&s->gb, 8); | 376 } |
370 | 377 } |
378 | |
379 if(s->avctx->sub_id == 0x20200002 || s->avctx->sub_id == 0x30202002 || s->avctx->sub_id == 0x30203002){ | |
380 if (get_bits(&s->gb, 1)){ | |
381 av_log(s->avctx, AV_LOG_ERROR, "unknown bit3 set\n"); | |
382 return -1; | |
383 } | |
384 seq= get_bits(&s->gb, 15); | |
385 }else | |
386 seq= get_bits(&s->gb, 8)*128; | |
387 //printf("%d\n", seq); | |
388 seq |= s->time &~0x7FFF; | |
389 if(seq - s->time > 0x4000) seq -= 0x8000; | |
390 if(seq - s->time < -0x4000) seq += 0x8000; | |
391 if(seq != s->time){ | |
392 if(s->pict_type!=B_TYPE){ | |
393 s->time= seq; | |
394 s->pp_time= s->time - s->last_non_b_time; | |
395 s->last_non_b_time= s->time; | |
396 }else{ | |
397 s->time= seq; | |
398 s->pb_time= s->pp_time - (s->last_non_b_time - s->time); | |
399 if(s->pp_time <=s->pb_time || s->pp_time <= s->pp_time - s->pb_time || s->pp_time<=0){ | |
400 printf("messed up order, seeking?, skiping current b frame\n"); | |
401 return FRAME_SKIPED; | |
402 } | |
403 } | |
404 } | |
405 // printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time); | |
406 | |
371 for(i=0; i<6; i++){ | 407 for(i=0; i<6; i++){ |
372 if(s->mb_width*s->mb_height < ff_mba_max[i]) break; | 408 if(s->mb_width*s->mb_height < ff_mba_max[i]) break; |
373 } | 409 } |
374 mb_pos= get_bits(&s->gb, ff_mba_length[i]); | 410 mb_pos= get_bits(&s->gb, ff_mba_length[i]); |
375 s->mb_x= mb_pos % s->mb_width; | 411 s->mb_x= mb_pos % s->mb_width; |
388 if(s->avctx->debug & FF_DEBUG_PICT_INFO){ | 424 if(s->avctx->debug & FF_DEBUG_PICT_INFO){ |
389 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n", | 425 av_log(s->avctx, AV_LOG_INFO, "num:%5d x:%2d y:%2d type:%d qscale:%2d rnd:%d\n", |
390 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding); | 426 seq, s->mb_x, s->mb_y, s->pict_type, s->qscale, s->no_rounding); |
391 } | 427 } |
392 | 428 |
393 if (s->pict_type == B_TYPE){ | 429 assert(s->pict_type != B_TYPE || !s->low_delay); |
394 av_log(s->avctx, AV_LOG_ERROR, "b frame not supported\n"); | |
395 return -1; | |
396 } | |
397 | 430 |
398 return s->mb_width*s->mb_height - mb_pos; | 431 return s->mb_width*s->mb_height - mb_pos; |
399 } | 432 } |
400 | 433 |
401 static int rv10_decode_init(AVCodecContext *avctx) | 434 static int rv10_decode_init(AVCodecContext *avctx) |
412 | 445 |
413 switch(avctx->sub_id){ | 446 switch(avctx->sub_id){ |
414 case 0x10000000: | 447 case 0x10000000: |
415 s->rv10_version= 0; | 448 s->rv10_version= 0; |
416 s->h263_long_vectors=0; | 449 s->h263_long_vectors=0; |
450 s->low_delay=1; | |
417 break; | 451 break; |
418 case 0x10003000: | 452 case 0x10003000: |
419 s->rv10_version= 3; | 453 s->rv10_version= 3; |
420 s->h263_long_vectors=1; | 454 s->h263_long_vectors=1; |
455 s->low_delay=1; | |
421 break; | 456 break; |
422 case 0x10003001: | 457 case 0x10003001: |
423 s->rv10_version= 3; | 458 s->rv10_version= 3; |
424 s->h263_long_vectors=0; | 459 s->h263_long_vectors=0; |
460 s->low_delay=1; | |
425 break; | 461 break; |
426 case 0x20001000: | 462 case 0x20001000: |
427 case 0x20100001: //ok | 463 case 0x20100001: //ok |
428 case 0x20200002: | 464 case 0x20200002: |
429 case 0x20101001: //ok | 465 case 0x20101001: //ok |
611 return -1; | 647 return -1; |
612 } | 648 } |
613 | 649 |
614 if(s->mb_y>=s->mb_height){ | 650 if(s->mb_y>=s->mb_height){ |
615 MPV_frame_end(s); | 651 MPV_frame_end(s); |
652 | |
653 if(s->pict_type==B_TYPE || s->low_delay){ | |
654 *pict= *(AVFrame*)&s->current_picture; | |
655 ff_print_debug_info(s, s->current_picture_ptr); | |
656 } else { | |
657 *pict= *(AVFrame*)&s->last_picture; | |
658 ff_print_debug_info(s, s->last_picture_ptr); | |
659 } | |
616 | 660 |
617 *pict= *(AVFrame*)&s->current_picture; | |
618 | |
619 *data_size = sizeof(AVFrame); | 661 *data_size = sizeof(AVFrame); |
620 }else{ | 662 }else{ |
621 *data_size = 0; | 663 *data_size = 0; |
622 } | 664 } |
623 | 665 |
645 NULL, | 687 NULL, |
646 rv10_decode_end, | 688 rv10_decode_end, |
647 rv10_decode_frame, | 689 rv10_decode_frame, |
648 CODEC_CAP_DR1 | 690 CODEC_CAP_DR1 |
649 }; | 691 }; |
692 |