---
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