[SCM] libav/experimental: Improve error concealment of lost frames If a frame is lost, replace it with data from the previous valid frame.

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:16:20 UTC 2013


The following commit has been merged in the experimental branch:
commit e2983d6eac7b0bb563886c6f97c4ce0385b2018d
Author: Jason Garrett-Glaser <darkshikari at gmail.com>
Date:   Mon Sep 27 04:43:41 2010 +0000

    Improve error concealment of lost frames
    If a frame is lost, replace it with data from the previous valid frame.
    
    Originally committed as revision 25218 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 49bbe30..0b0d96b 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -25,6 +25,7 @@
  * @author Michael Niedermayer <michaelni at gmx.at>
  */
 
+#include "libavcore/imgutils.h"
 #include "internal.h"
 #include "dsputil.h"
 #include "avcodec.h"
@@ -1905,6 +1906,17 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
             s->current_picture_ptr->frame_num= h->prev_frame_num;
             ff_generate_sliding_window_mmcos(h);
             ff_h264_execute_ref_pic_marking(h, h->mmco, h->mmco_index);
+            /* Error concealment: if a ref is missing, copy the previous ref in its place.
+             * FIXME: avoiding a memcpy would be nice, but ref handling makes many assumptions
+             * about there being no actual duplicates.
+             * FIXME: this doesn't copy padding for out-of-frame motion vectors.  Given we're
+             * concealing a lost frame, this probably isn't noticable by comparison, but it should
+             * be fixed. */
+            av_image_copy(h->short_ref[0]->data, h->short_ref[0]->linesize,
+                          (const uint8_t**)h->short_ref[1]->data, h->short_ref[1]->linesize,
+                          PIX_FMT_YUV420P, s->mb_width*16, s->mb_height*16);
+            h->short_ref[0]->frame_num = h->prev_frame_num;
+            h->short_ref[0]->poc = h->short_ref[1]->poc+2;
         }
 
         /* See if we have a decoded first field looking for a pair... */

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list