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; ydata[i][x + y*clone->linesize[i]] = + clone->data[i][w - 1 + y*clone->linesize[i]]; + for (y=h; ydata[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;