History

avcodec/mpegvideo_enc: Fix unnecessary linear growth of buffer

If one encodes MJPEG with a single slice and uses input with AV_FRAME_DATA_ICC_PROFILE side data, the current allocation code in ff_mpv_encode_picture() will always increase the size of the temporary buffer used for allocating packets by the size needed for to write the ICC chunk even when the current buffer is actually large enough. This commit fixes this.

Andreas Rheinhardt committed 4 years ago

Commit c3047da1 parent 4487dd81 file · +3 −3Browse files

Showing the changes to libavcodec (1 of 1 file). Show all

Unified · Split

libavcodec/mpegvideo_enc.c+3−3
@@ -1684,9 +1684,8 @@ int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, · 1683 unmodified lines
16841684 /* output? */
16851685 if (s->new_picture->data[0]) {
16861686 int growing_buffer = context_count == 1 && !pkt->data && !s->data_partitioning;
1687− size_t pkt_size = growing_buffer ? FFMAX(s->mb_width*s->mb_height*64+10000, avctx->internal->byte_buffer_size) - AV_INPUT_BUFFER_PADDING_SIZE
1688− :
1689− s->mb_width*s->mb_height*(MAX_MB_BYTES+100)+10000;
1687+ size_t pkt_size = 10000 + s->mb_width * s->mb_height *
1688+ (growing_buffer ? 64 : (MAX_MB_BYTES + 100));
16901689 if (CONFIG_MJPEG_ENCODER && avctx->codec_id == AV_CODEC_ID_MJPEG) {
16911690 ret = ff_mjpeg_add_icc_profile_size(avctx, s->new_picture, &pkt_size);
16921691 if (ret < 0)
@@ -1694,6 +1693,7 @@ int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, · 1 unmodified line
16941693 }
16951694 if ((ret = ff_alloc_packet(avctx, pkt, pkt_size)) < 0)
16961695 return ret;
1696+ pkt->size = avctx->internal->byte_buffer_size - AV_INPUT_BUFFER_PADDING_SIZE;
16971697 if (s->mb_info) {
16981698 s->mb_info_ptr = av_packet_new_side_data(pkt,
16991699 AV_PKT_DATA_H263_MB_INFO,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t