changeset 2848:78ad77267785 libavcodec

error concealment fix
author michael
date Thu, 01 Sep 2005 00:15:12 +0000
parents 712c84b9d8ce
children c4311f623fd5
files rv10.c
diffstat 1 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/rv10.c	Tue Aug 30 20:03:19 2005 +0000
+++ b/rv10.c	Thu Sep 01 00:15:12 2005 +0000
@@ -620,8 +620,14 @@
 //if(s->pict_type == P_TYPE) return 0;
 
     if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
+        if(s->current_picture_ptr){ //FIXME write parser so we always have complete frames?
+            ff_er_frame_end(s);
+            MPV_frame_end(s);
+            s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0;
+        }
         if(MPV_frame_start(s, avctx) < 0)
             return -1;
+        ff_er_frame_start(s);
     }
 
 #ifdef DEBUG
@@ -673,7 +679,7 @@
         s->mv_type = MV_TYPE_16X16; 
         ret=ff_h263_decode_mb(s, s->block);
 
-        if (ret == SLICE_ERROR) {
+        if (ret == SLICE_ERROR || s->gb.size_in_bits < get_bits_count(&s->gb)) {
             av_log(s->avctx, AV_LOG_ERROR, "ERROR at MB %d %d\n", s->mb_x, s->mb_y);
             return -1;
         }
@@ -693,6 +699,8 @@
         if(ret == SLICE_END) break;
     }
 
+    ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
+
     return buf_size;
 }
 
@@ -723,15 +731,14 @@
             else
                 size= avctx->slice_offset[i+1] - offset;
 
-            if( rv10_decode_packet(avctx, buf+offset, size) < 0 )
-                return -1;
+            rv10_decode_packet(avctx, buf+offset, size);
         }
     }else{
-        if( rv10_decode_packet(avctx, buf, buf_size) < 0 )
-            return -1;
+        rv10_decode_packet(avctx, buf, buf_size);
     }
     
     if(s->mb_y>=s->mb_height){
+        ff_er_frame_end(s);
         MPV_frame_end(s);
     
         if(s->pict_type==B_TYPE || s->low_delay){
@@ -743,6 +750,7 @@
         }
         if(s->last_picture_ptr || s->low_delay)
             *data_size = sizeof(AVFrame);
+        s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...)
     }
 
     return buf_size;