[SCM] libav/experimental: Remove delayed_output_pic, I do not understand what this variable was good for. It is simpler and might be faster now.

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:25:36 UTC 2013


The following commit has been merged in the experimental branch:
commit df8a7dff29e21056e8f676b6aea02c62c11bae64
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Sat Jul 19 02:53:57 2008 +0000

    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

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index a40d4d7..02f71d5 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 fa2fcf1..520a73f 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.

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list