diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-05-31 17:07:12 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-05-31 17:16:44 +0200 |
commit | e692c9672b28230419c912f90f4f3852cdd71dd0 (patch) | |
tree | 5d1e0e9354c38495a22fefee9be7ae1d03dab1c1 /libavcodec/asvenc.c | |
parent | 879aa062f973bf0f357bde8e5722522bc85d1884 (diff) | |
download | ffmpeg-e692c9672b28230419c912f90f4f3852cdd71dd0.tar.gz |
avcodec/asvenc: fix encoding dimensions %16 != 0
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/asvenc.c')
-rw-r--r-- | libavcodec/asvenc.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/libavcodec/asvenc.c b/libavcodec/asvenc.c index b098f47fb7..39e23155c5 100644 --- a/libavcodec/asvenc.c +++ b/libavcodec/asvenc.c @@ -181,6 +181,48 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, int size, ret; int mb_x, mb_y; + if (pict->width % 16 || pict->height % 16) { + AVFrame *clone = av_frame_alloc(); + int i; + + if (!clone) + return AVERROR(ENOMEM); + clone->format = pict->format; + clone->width = FFALIGN(pict->width, 16); + clone->height = FFALIGN(pict->height, 16); + ret = av_frame_get_buffer(clone, 32); + if (ret < 0) { + av_frame_free(&clone); + return ret; + } + + ret = av_frame_copy(clone, pict); + if (ret < 0) { + av_frame_free(&clone); + return ret; + } + + for (i = 0; i<3; i++) { + int x, y; + int w = FF_CEIL_RSHIFT(pict->width, !!i); + int h = FF_CEIL_RSHIFT(pict->height, !!i); + int w2 = FF_CEIL_RSHIFT(clone->width, !!i); + int h2 = FF_CEIL_RSHIFT(clone->height, !!i); + for (y=0; y<h; y++) + for (x=w; x<w2; x++) + clone->data[i][x + y*clone->linesize[i]] = + clone->data[i][w - 1 + y*clone->linesize[i]]; + for (y=h; y<h2; y++) + for (x=0; x<w2; x++) + clone->data[i][x + y*clone->linesize[i]] = + clone->data[i][x + (h-1)*clone->linesize[i]]; + } + ret = encode_frame(avctx, pkt, clone, got_packet); + + av_frame_free(&clone); + return ret; + } + if ((ret = ff_alloc_packet2(avctx, pkt, a->mb_height*a->mb_width*MAX_MB_SIZE + FF_MIN_BUFFER_SIZE)) < 0) return ret; |