aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2008-07-19 02:53:57 +0000
committerMichael Niedermayer <michaelni@gmx.at>2008-07-19 02:53:57 +0000
commitdf8a7dff29e21056e8f676b6aea02c62c11bae64 (patch)
tree50649f550aa8ef8daac18df5c4e641e35c3d6134
parent1b547abaa34a416d10891202ec09cf918d30d329 (diff)
downloadffmpeg-df8a7dff29e21056e8f676b6aea02c62c11bae64.tar.gz
Remove delayed_output_pic, I do not understand what this variable was good for.
It is simpler and might be faster now. Originally committed as revision 14289 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/h264.c30
-rw-r--r--libavcodec/h264.h2
2 files changed, 12 insertions, 20 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index a40d4d7b6e..02f71d5bf4 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -3269,15 +3269,11 @@ static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){
if (pic->reference &= refmask) {
return 0;
} else {
- if(pic == h->delayed_output_pic)
- pic->reference=DELAYED_PIC_REF;
- else{
for(i = 0; h->delayed_pic[i]; i++)
if(pic == h->delayed_pic[i]){
pic->reference=DELAYED_PIC_REF;
break;
}
- }
return 1;
}
}
@@ -3312,9 +3308,7 @@ static void flush_dpb(AVCodecContext *avctx){
h->delayed_pic[i]->reference= 0;
h->delayed_pic[i]= NULL;
}
- if(h->delayed_output_pic)
- h->delayed_output_pic->reference= 0;
- h->delayed_output_pic= NULL;
+ h->outputed_poc= INT_MIN;
idr(h);
if(h->s.current_picture_ptr)
h->s.current_picture_ptr->reference= 0;
@@ -7783,7 +7777,6 @@ static int decode_frame(AVCodecContext *avctx,
if(!(s->flags2 & CODEC_FLAG2_CHUNKS) || (s->mb_y >= s->mb_height && s->mb_height)){
Picture *out = s->current_picture_ptr;
Picture *cur = s->current_picture_ptr;
- Picture *prev = h->delayed_output_pic;
int i, pics, cross_idr, out_of_order, out_idx;
s->mb_y= 0;
@@ -7860,21 +7853,21 @@ static int decode_frame(AVCodecContext *avctx,
out_idx = i;
}
- out_of_order = !cross_idr && prev && out->poc < prev->poc;
+ out_of_order = !cross_idr && out->poc < h->outputed_poc;
- if(prev && pics <= s->avctx->has_b_frames || out_of_order)
- out = prev;
+ if(pics <= s->avctx->has_b_frames || out_of_order)
+ out = NULL;
if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames)
{ }
else if((out_of_order && pics-1 == s->avctx->has_b_frames && pics < 15)
|| (s->low_delay &&
- ((!cross_idr && prev && out->poc > prev->poc + 2)
+ ((!cross_idr && out && out->poc > h->outputed_poc + 2)
|| cur->pict_type == FF_B_TYPE)))
{
s->low_delay = 0;
s->avctx->has_b_frames++;
- out = prev;
+ out= NULL;
}
if(out_of_order || pics > s->avctx->has_b_frames){
@@ -7882,13 +7875,12 @@ static int decode_frame(AVCodecContext *avctx,
h->delayed_pic[i] = h->delayed_pic[i+1];
}
- if(prev == out)
- *data_size = 0;
- else
+ if(out){
*data_size = sizeof(AVFrame);
- if(prev && prev != out && prev->reference == DELAYED_PIC_REF)
- prev->reference = 0;
- h->delayed_output_pic = out;
+
+ out->reference &= ~DELAYED_PIC_REF;
+ h->outputed_poc = out->poc;
+ }
#endif
if(out)
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index fa2fcf14b5..520a73f4f5 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -337,7 +337,7 @@ typedef struct H264Context{
Reordered version of default_ref_list
according to picture reordering in slice header */
Picture *delayed_pic[MAX_DELAYED_PIC_COUNT+2]; //FIXME size?
- Picture *delayed_output_pic;
+ int outputed_poc;
/**
* memory management control operations buffer.