Mercurial > libavcodec.hg
comparison h263dec.c @ 924:3814e9115672 libavcodec
cleanup / messup?
fixes 20% speedloss bug
removes redundant variables from MpegEncContext
release buffers in avcodec_flush_buffers() (untested)
author | michaelni |
---|---|
date | Mon, 09 Dec 2002 00:29:17 +0000 |
parents | f633377858b6 |
children | 7fccaa0d699d |
comparison
equal
deleted
inserted
replaced
923:3b5d9ecedc73 | 924:3814e9115672 |
---|---|
53 | 53 |
54 // set defaults | 54 // set defaults |
55 s->quant_precision=5; | 55 s->quant_precision=5; |
56 s->progressive_sequence=1; | 56 s->progressive_sequence=1; |
57 s->decode_mb= ff_h263_decode_mb; | 57 s->decode_mb= ff_h263_decode_mb; |
58 s->low_delay= 1; | |
58 | 59 |
59 /* select sub codec */ | 60 /* select sub codec */ |
60 switch(avctx->codec->id) { | 61 switch(avctx->codec->id) { |
61 case CODEC_ID_H263: | 62 case CODEC_ID_H263: |
62 s->gob_number = 0; | 63 s->gob_number = 0; |
63 break; | 64 break; |
64 case CODEC_ID_MPEG4: | 65 case CODEC_ID_MPEG4: |
65 s->time_increment_bits = 4; /* default value for broken headers */ | 66 s->time_increment_bits = 4; /* default value for broken headers */ |
66 s->h263_pred = 1; | 67 s->h263_pred = 1; |
67 s->has_b_frames = 1; //default, might be overriden in the vol header during header parsing | 68 s->low_delay = 0; //default, might be overriden in the vol header during header parsing |
68 break; | 69 break; |
69 case CODEC_ID_MSMPEG4V1: | 70 case CODEC_ID_MSMPEG4V1: |
70 s->h263_msmpeg4 = 1; | 71 s->h263_msmpeg4 = 1; |
71 s->h263_pred = 1; | 72 s->h263_pred = 1; |
72 s->msmpeg4_version=1; | 73 s->msmpeg4_version=1; |
428 } | 429 } |
429 ret = ff_mpeg4_decode_picture_header(s, &s->gb); | 430 ret = ff_mpeg4_decode_picture_header(s, &s->gb); |
430 | 431 |
431 if(s->flags& CODEC_FLAG_LOW_DELAY) | 432 if(s->flags& CODEC_FLAG_LOW_DELAY) |
432 s->low_delay=1; | 433 s->low_delay=1; |
433 | |
434 s->has_b_frames= !s->low_delay; | |
435 } else if (s->h263_intel) { | 434 } else if (s->h263_intel) { |
436 ret = intel_h263_decode_picture_header(s); | 435 ret = intel_h263_decode_picture_header(s); |
437 } else { | 436 } else { |
438 ret = h263_decode_picture_header(s); | 437 ret = h263_decode_picture_header(s); |
439 } | 438 } |
440 avctx->has_b_frames= s->has_b_frames; | 439 avctx->has_b_frames= !s->low_delay; |
441 | 440 |
442 if(s->workaround_bugs&FF_BUG_AUTODETECT){ | 441 if(s->workaround_bugs&FF_BUG_AUTODETECT){ |
443 if(s->avctx->fourcc == ff_get_fourcc("XVIX")) | 442 if(s->avctx->fourcc == ff_get_fourcc("XVIX")) |
444 s->workaround_bugs|= FF_BUG_XVID_ILACE; | 443 s->workaround_bugs|= FF_BUG_XVID_ILACE; |
445 #if 0 | 444 #if 0 |
529 // for hurry_up==5 | 528 // for hurry_up==5 |
530 s->current_picture.pict_type= s->pict_type; | 529 s->current_picture.pict_type= s->pict_type; |
531 s->current_picture.key_frame= s->pict_type == I_TYPE; | 530 s->current_picture.key_frame= s->pict_type == I_TYPE; |
532 | 531 |
533 /* skip b frames if we dont have reference frames */ | 532 /* skip b frames if we dont have reference frames */ |
534 if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); | 533 if(s->last_picture.data[0]==NULL && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); |
535 /* skip b frames if we are in a hurry */ | 534 /* skip b frames if we are in a hurry */ |
536 if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); | 535 if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); |
537 /* skip everything if we are in a hurry>=5 */ | 536 /* skip everything if we are in a hurry>=5 */ |
538 if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size); | 537 if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size); |
539 | 538 |
674 } | 673 } |
675 } | 674 } |
676 | 675 |
677 } | 676 } |
678 #endif | 677 #endif |
679 if(s->pict_type==B_TYPE || (!s->has_b_frames)){ | 678 if(s->pict_type==B_TYPE || s->low_delay){ |
680 *pict= *(AVVideoFrame*)&s->current_picture; | 679 *pict= *(AVVideoFrame*)&s->current_picture; |
681 } else { | 680 } else { |
682 *pict= *(AVVideoFrame*)&s->last_picture; | 681 *pict= *(AVVideoFrame*)&s->last_picture; |
683 } | 682 } |
684 | 683 |
685 /* Return the Picture timestamp as the frame number */ | 684 /* Return the Picture timestamp as the frame number */ |
686 /* we substract 1 because it is added on utils.c */ | 685 /* we substract 1 because it is added on utils.c */ |
687 avctx->frame_number = s->picture_number - 1; | 686 avctx->frame_number = s->picture_number - 1; |
688 | 687 |
689 /* dont output the last pic after seeking | 688 /* dont output the last pic after seeking */ |
690 note we allready added +1 for the current pix in MPV_frame_end(s) */ | 689 if(s->last_picture.data[0] || s->low_delay) |
691 if(s->num_available_buffers>=2 || (!s->has_b_frames)) | |
692 *data_size = sizeof(AVVideoFrame); | 690 *data_size = sizeof(AVVideoFrame); |
693 #ifdef PRINT_FRAME_TIME | 691 #ifdef PRINT_FRAME_TIME |
694 printf("%Ld\n", rdtsc()-time); | 692 printf("%Ld\n", rdtsc()-time); |
695 #endif | 693 #endif |
696 return get_consumed_bytes(s, buf_size); | 694 return get_consumed_bytes(s, buf_size); |