---
 libavcodec/mpegvideo.c |   23 ++++++++++++++---------
 1 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 8928ab5..25c9b1f 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -901,7 +901,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
 {
     int i;
     AVFrame *pic;
-    s->mb_skipped = s->edge_y = 0;
+    s->mb_skipped = 0;
 
     assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
 
@@ -1029,7 +1029,7 @@ alloc:
 /* generic function for encode/decode called after a frame has been coded/decoded */
 void MPV_frame_end(MpegEncContext *s)
 {
-    int i;
+    int i, edge_y = s->error_count ? 0 : s->edge_y;
     /* draw edge for correct motion prediction if outside */
 #ifdef HAVE_XVMC
 //just to make sure that all data is rendered.
@@ -1037,11 +1037,16 @@ void MPV_frame_end(MpegEncContext *s)
         XVMC_field_end(s);
     }else
 #endif
-    if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE) && (s->edge_y < s->v_edge_pos)) {
-            s->dsp.draw_edges(s->current_picture.data[0], s->linesize  , s->h_edge_pos   , s->v_edge_pos   , EDGE_WIDTH  , EDGE_TOP|EDGE_BOTTOM);
-            s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2, EDGE_TOP|EDGE_BOTTOM);
-            s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2, EDGE_TOP|EDGE_BOTTOM);
+    if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE) && (edge_y < s->v_edge_pos)) {
+        int edges = EDGE_BOTTOM, h = s->v_edge_pos - edge_y;
+        if (edge_y < EDGE_WIDTH) edges |= EDGE_TOP;
+
+            s->dsp.draw_edges(s->current_picture.data[0] +  edge_y    *  s->linesize, s->linesize  , s->h_edge_pos   , h   , EDGE_WIDTH  , edges);
+            s->dsp.draw_edges(s->current_picture.data[1] + (edge_y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges);
+            s->dsp.draw_edges(s->current_picture.data[2] + (edge_y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges);
     }
+    s->edge_y = 0;
+
     emms_c();
 
     s->last_pict_type    = s->pict_type;
@@ -2121,9 +2126,9 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
 
         assert(y + h >= EDGE_WIDTH && s->edge_y <= s->v_edge_pos);
 
-        s->dsp.draw_edges(s->current_picture.data[0] + s->edge_y     *s->linesize  , s->linesize  , s->h_edge_pos   , h   , EDGE_WIDTH  , sides);
-        s->dsp.draw_edges(s->current_picture.data[1] + (s->edge_y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, sides);
-        s->dsp.draw_edges(s->current_picture.data[2] + (s->edge_y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, sides);
+        s->dsp.draw_edges(s->current_picture.data[0] +  y    *s->linesize  , s->linesize  , s->h_edge_pos   , h   , EDGE_WIDTH  , sides);
+        s->dsp.draw_edges(s->current_picture.data[1] + (y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, sides);
+        s->dsp.draw_edges(s->current_picture.data[2] + (y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, sides);
 
         s->edge_y += h;
     }
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc

Reply via email to