[FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
Marton Balint
cus at passwd.hu
Thu Apr 2 21:15:24 EEST 2020
On Thu, 2 Apr 2020, James Almer wrote:
> On 3/29/2020 6:07 PM, James Almer wrote:
>> This produces a small speed up in demuxing
>>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>> libavformat/mpegts.c | 20 ++++++++++++++++----
>> 1 file changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
>> index 7f56bacb2c..7746a524c4 100644
>> --- a/libavformat/mpegts.c
>> +++ b/libavformat/mpegts.c
>> @@ -157,6 +157,8 @@ struct MpegTSContext {
>> int resync_size;
>> int merge_pmt_versions;
>>
>> + AVBufferPool *pool;
>> +
>> /******************************************/
>> /* private mpegts data */
>> /* scan context */
>> @@ -1177,8 +1179,7 @@ static int mpegts_push_data(MpegTSFilter *filter,
>> pes->total_size = MAX_PES_PAYLOAD;
>>
>> /* allocate pes buffer */
>> - pes->buffer = av_buffer_alloc(pes->total_size +
>> - AV_INPUT_BUFFER_PADDING_SIZE);
>> + pes->buffer = av_buffer_pool_get(ts->pool);
>> if (!pes->buffer)
>> return AVERROR(ENOMEM);
>>
>> @@ -1351,8 +1352,7 @@ skip:
>> if (ret < 0)
>> return ret;
>> pes->total_size = MAX_PES_PAYLOAD;
>> - pes->buffer = av_buffer_alloc(pes->total_size +
>> - AV_INPUT_BUFFER_PADDING_SIZE);
>> + pes->buffer = av_buffer_pool_get(ts->pool);
>> if (!pes->buffer)
>> return AVERROR(ENOMEM);
>> ts->stop_parse = 1;
>> @@ -3032,6 +3032,10 @@ static int mpegts_read_header(AVFormatContext *s)
>> ts->stream = s;
>> ts->auto_guess = 0;
>>
>> + ts->pool = av_buffer_pool_init(MAX_PES_PAYLOAD + AV_INPUT_BUFFER_PADDING_SIZE, NULL);
>> + if (!ts->pool)
>> + return AVERROR(ENOMEM);
>> +
>> if (s->iformat == &ff_mpegts_demuxer) {
>> /* normal demux */
>>
>> @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts)
>>
>> clear_programs(ts);
>>
>> + av_buffer_pool_uninit(&ts->pool);
>> +
>> for (i = 0; i < NB_PID_MAX; i++)
>> if (ts->pids[i])
>> mpegts_close_filter(ts, ts->pids[i]);
>> @@ -3295,6 +3301,12 @@ MpegTSContext *avpriv_mpegts_parse_open(AVFormatContext *s)
>> ts->stream = s;
>> ts->auto_guess = 1;
>>
>> + ts->pool = av_buffer_pool_init(MAX_PES_PAYLOAD + AV_INPUT_BUFFER_PADDING_SIZE, NULL);
>> + if (!ts->pool) {
>> + av_free(ts);
>> + return NULL;
>> + }
>> +
>> mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1);
>> mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
>> mpegts_open_section_filter(ts, EIT_PID, eit_cb, ts, 1);
>
> Will apply soon if no one objects.
LGTM.
Thanks,
Marton
More information about the ffmpeg-devel
mailing list