avformat/matroskaenc: Avoid allocation for small dynamic buffers

By using avio_get_dyn_buf() + ffio_free_dyn_buf() instead of
avio_close_dyn_buf() + av_free() one can avoid an allocation + copy for
small dynamic buffers (i.e. small master elements).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2019-11-27 13:22:10 +01:00 committed by James Almer
parent aad82270b6
commit 3a58ec7c77

View File

@ -845,11 +845,11 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb,
ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX); ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX);
} }
codecpriv_size = avio_close_dyn_buf(dyn_cp, &codecpriv); codecpriv_size = avio_get_dyn_buf(dyn_cp, &codecpriv);
if (codecpriv_size) if (codecpriv_size)
put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv, put_ebml_binary(pb, MATROSKA_ID_CODECPRIVATE, codecpriv,
codecpriv_size); codecpriv_size);
av_free(codecpriv); ffio_free_dyn_buf(&dyn_cp);
return ret; return ret;
} }
@ -933,13 +933,13 @@ static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStre
end_ebml_master(dyn_cp, meta_element); end_ebml_master(dyn_cp, meta_element);
} }
colorinfo_size = avio_close_dyn_buf(dyn_cp, &colorinfo_ptr); colorinfo_size = avio_get_dyn_buf(dyn_cp, &colorinfo_ptr);
if (colorinfo_size) { if (colorinfo_size) {
ebml_master colorinfo = start_ebml_master(pb, MATROSKA_ID_VIDEOCOLOR, colorinfo_size); ebml_master colorinfo = start_ebml_master(pb, MATROSKA_ID_VIDEOCOLOR, colorinfo_size);
avio_write(pb, colorinfo_ptr, colorinfo_size); avio_write(pb, colorinfo_ptr, colorinfo_size);
end_ebml_master(pb, colorinfo); end_ebml_master(pb, colorinfo);
} }
av_free(colorinfo_ptr); ffio_free_dyn_buf(&dyn_cp);
return 0; return 0;
} }