On Mon, Aug 31, 2015 at 11:23 AM, Hendrik Leppkes <[email protected]> wrote: > On Mon, Aug 31, 2015 at 11:22 AM, Luca Barbato <[email protected]> wrote: >> On 30/08/15 16:46, Vittorio Giovara wrote: >>> From: Michael Niedermayer <[email protected]> >>> >>> Despite '417792' being reported in the binary decoder, the buffer at >>> encoding time needs to be bigger to avoid running out of space due to >>> interlace handling. >>> >>> Signed-off-by: Vittorio Giovara <[email protected]> >>> --- >>> libavcodec/dnxhddata.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/libavcodec/dnxhddata.c b/libavcodec/dnxhddata.c >>> index 85e3829..9d2e4e8 100644 >>> --- a/libavcodec/dnxhddata.c >>> +++ b/libavcodec/dnxhddata.c >>> @@ -1103,7 +1103,7 @@ const CIDEntry ff_dnxhd_cid_table[] = { >>> dnxhd_1237_ac_flags, >>> dnxhd_1237_run_codes, dnxhd_1237_run_bits, dnxhd_1237_run, >>> { 63, 84, 100, 110 } }, >>> - { 1260, 1440, 1080, 1, 417792, 417792, 4, 8, 3, >>> + { 1260, 1440, 1080, 1, 835584, 417792, 4, 8, 3, >>> dnxhd_1260_luma_weight, dnxhd_1260_chroma_weight, >>> dnxhd_1237_dc_codes, dnxhd_1237_dc_bits, >>> dnxhd_1237_ac_codes, dnxhd_1237_ac_bits, dnxhd_1237_ac_level, >>> >> >> Is it needed only there or for each cid when interlaced is set? >> >> Something like >> >> diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c >> index 228ee46..d6d08f0 100644 >> --- a/libavcodec/dnxhdenc.c >> +++ b/libavcodec/dnxhdenc.c >> @@ -1043,10 +1043,14 @@ static int dnxhd_encode_picture(AVCodecContext >> *avctx, AVPacket *pkt, >> { >> DNXHDEncContext *ctx = avctx->priv_data; >> int first_field = 1; >> + int frame_size = ctx->cid_table->frame_size; >> int offset, i, ret; >> uint8_t *buf, *sd; >> >> - if ((ret = ff_alloc_packet(pkt, ctx->cid_table->frame_size)) < 0) { >> + if (ctx->interlaced) >> + frame_size *= 2; >> + >> + if ((ret = ff_alloc_packet(pkt, frame_size)) < 0) { >> av_log(avctx, AV_LOG_ERROR, >> "output buffer is too small to compress picture\n"); >> return ret; >> >> >> Seems slightly future-proof. >> > > Its also future-proof to just set the proper frame sizes in the > tables, since you need to specify one anyway, it might as well be > correct, and not doubled in the encoder later.
The "proper frame size" should be the one reported in the binary decoder, it's not like a * 2 multiplication affects performance. However his is a particular case in which the two profiles (1259/1260) are basically identical except the 'interlace' flag, and I don't know if this has been done for other interlaced profiles. In that case it should be properly documented, feel free to send a patch in that regard, if you want. -- Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
