diff options
author | Anton Khirnov <anton@khirnov.net> | 2014-01-01 20:04:53 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2014-01-20 12:50:14 +0100 |
commit | 024db24912a39316b0ef0b7d793307d62da038f4 (patch) | |
tree | 6df7cf00dfa2e97a3fcb8f687565d4c5c3833eaa | |
parent | f7e85ee996b3886c2b13e928b83277382311af96 (diff) | |
download | ffmpeg-024db24912a39316b0ef0b7d793307d62da038f4.tar.gz |
mpegvideo: allocate edges when encoding.
Allocating edges will be removed from generic code, so the encoder must
handle this explicitly.
-rw-r--r-- | libavcodec/mpegvideo.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 6ecfd727c1..a80f737e05 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -422,15 +422,21 @@ fail: */ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) { + int edges_needed = av_codec_is_encoder(s->avctx->codec); int r, ret; pic->tf.f = &pic->f; if (s->codec_id != AV_CODEC_ID_WMV3IMAGE && s->codec_id != AV_CODEC_ID_VC1IMAGE && - s->codec_id != AV_CODEC_ID_MSS2) + s->codec_id != AV_CODEC_ID_MSS2) { + if (edges_needed) { + pic->f.width = s->avctx->width + 2 * EDGE_WIDTH; + pic->f.height = s->avctx->height + 2 * EDGE_WIDTH; + } + r = ff_thread_get_buffer(s->avctx, &pic->tf, pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); - else { + } else { pic->f.width = s->avctx->width; pic->f.height = s->avctx->height; pic->f.format = s->avctx->pix_fmt; @@ -443,6 +449,18 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) return -1; } + if (edges_needed) { + int i; + for (i = 0; pic->f.data[i]; i++) { + int offset = (EDGE_WIDTH >> (i ? s->chroma_y_shift : 0)) * + pic->f.linesize[i] + + (EDGE_WIDTH >> (i ? s->chroma_x_shift : 0)); + pic->f.data[i] += offset; + } + pic->f.width = s->avctx->width; + pic->f.height = s->avctx->height; + } + if (s->avctx->hwaccel) { assert(!pic->hwaccel_picture_private); if (s->avctx->hwaccel->priv_data_size) { |