summaryrefslogtreecommitdiff
path: root/libavcodec/mpegvideo.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2014-01-01 20:04:53 +0100
committerAnton Khirnov <anton@khirnov.net>2014-01-20 12:50:14 +0100
commit024db24912a39316b0ef0b7d793307d62da038f4 (patch)
tree6df7cf00dfa2e97a3fcb8f687565d4c5c3833eaa /libavcodec/mpegvideo.c
parentf7e85ee996b3886c2b13e928b83277382311af96 (diff)
mpegvideo: allocate edges when encoding.
Allocating edges will be removed from generic code, so the encoder must handle this explicitly.
Diffstat (limited to 'libavcodec/mpegvideo.c')
-rw-r--r--libavcodec/mpegvideo.c22
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) {