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