Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On 4/2/2020 4:54 PM, Marton Balint wrote: > > > On Thu, 2 Apr 2020, James Almer wrote: > >> On 4/2/2020 3:49 PM, Marton Balint wrote: >>> >>> >>> On Thu, 2 Apr 2020, James Almer wrote: >>> On 4/2/2020 3:27 PM, Marton Balint wrote: > > > On Thu, 2 Apr 2020, Marton Balint wrote: > >> >> >> 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 --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); + av_buffer_pool_uninit(>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. > > On second thought aint this going to waste too much memory on small > packets? If packets are queued somewhere it can make a huge difference > if every buffer is 200kb... > > Does the speedup goes away if only unbound packets make use of the > buffer pool? > > Thanks, > Marton I tried these two LG 4k HDR sample videos, and the pool was never bigger than 3 to 5 buffers for the entire demuxing process. >>> >>> That is the case if there is no packet buffering, like in ffmpeg using a >>> single input. But in ffplay or a lot of other apps packets are >>> pre-buffered to remove the latency of the source media. An app could >>> have assumed that if it buffers 1 MB of packets it will not consume a >>> lot more than 1 MB of memory. >>> I'll bench again with your suggestion, but i don't think it will be a problem even as is. >>> >>> Maybe we should create log2(MAX_PACKET_SIZE) number of buffer pools >>> instead? In that case the memory wasted is at most 100%... Still not >>> very good, but a lot more acceptable. >> >> I don't think that's possible, or worth trying. There's currently no way >> to query the amount of buffers in a given pool, and definitely no way to >> know what buffers
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On Thu, 2 Apr 2020, James Almer wrote: On 4/2/2020 3:49 PM, Marton Balint wrote: On Thu, 2 Apr 2020, James Almer wrote: On 4/2/2020 3:27 PM, Marton Balint wrote: On Thu, 2 Apr 2020, Marton Balint wrote: 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 --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); + av_buffer_pool_uninit(>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. On second thought aint this going to waste too much memory on small packets? If packets are queued somewhere it can make a huge difference if every buffer is 200kb... Does the speedup goes away if only unbound packets make use of the buffer pool? Thanks, Marton I tried these two LG 4k HDR sample videos, and the pool was never bigger than 3 to 5 buffers for the entire demuxing process. That is the case if there is no packet buffering, like in ffmpeg using a single input. But in ffplay or a lot of other apps packets are pre-buffered to remove the latency of the source media. An app could have assumed that if it buffers 1 MB of packets it will not consume a lot more than 1 MB of memory. I'll bench again with your suggestion, but i don't think it will be a problem even as is. Maybe we should create log2(MAX_PACKET_SIZE) number of buffer pools instead? In that case the memory wasted is at most 100%... Still not very good, but a lot more acceptable. I don't think that's possible, or worth trying. There's currently no way to query the amount of buffers in a given pool, and definitely no way to know what buffers will be returned to a pool once all their references are freed, other than keeping track of them within the muxer. I meant something like this: required_size = pes->total_size + AV_INPUT_BUFFER_PADDING; index = av_log2(requred_size); if (!ts->pools[index]) { pool_size = FFMIN(MAX_PES_PAYLOAD + AV_INPUT_BUFFER_PADDING, 2 << index); ts->pools[index] = av_buffer_pool_init(pool_size); } pes->buffer = av_buffer_pool_get(ts->pool[index]); I'll try limiting the usage of the pool to unbound packets only, but i suspect it will not make much of a difference compared to no pool usage at all. Yeah, I expect this outcome as well. Regards, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On 4/2/2020 3:49 PM, Marton Balint wrote: > > > On Thu, 2 Apr 2020, James Almer wrote: > >> On 4/2/2020 3:27 PM, Marton Balint wrote: >>> >>> >>> On Thu, 2 Apr 2020, Marton Balint wrote: >>> 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 >> --- >> 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 == _mpegts_demuxer) { >> /* normal demux */ >> >> @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) >> >> clear_programs(ts); >> >> + av_buffer_pool_uninit(>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. >>> >>> On second thought aint this going to waste too much memory on small >>> packets? If packets are queued somewhere it can make a huge difference >>> if every buffer is 200kb... >>> >>> Does the speedup goes away if only unbound packets make use of the >>> buffer pool? >>> >>> Thanks, >>> Marton >> >> I tried these two LG 4k HDR sample videos, and the pool was never bigger >> than 3 to 5 buffers for the entire demuxing process. > > That is the case if there is no packet buffering, like in ffmpeg using a > single input. But in ffplay or a lot of other apps packets are > pre-buffered to remove the latency of the source media. An app could > have assumed that if it buffers 1 MB of packets it will not consume a > lot more than 1 MB of memory. > >> >> I'll bench again with your suggestion, but i don't think it will be a >> problem even as is. > > Maybe we should create log2(MAX_PACKET_SIZE) number of buffer pools > instead? In that case the memory wasted is at most 100%... Still not > very good, but a lot more acceptable. I don't think that's possible, or worth trying. There's currently no way to query the amount of buffers in a given pool, and definitely no way to know what buffers will be returned to a pool once all their references are freed, other than keeping track of them within the muxer. I'll try limiting the usage of the pool to unbound packets only, but i suspect it will not make much of a difference compared to no pool usage at all. > > Regards, > Marton > ___ > ffmpeg-devel mailing list >
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On Thu, 2 Apr 2020, James Almer wrote: On 4/2/2020 3:27 PM, Marton Balint wrote: On Thu, 2 Apr 2020, Marton Balint wrote: 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 --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); + av_buffer_pool_uninit(>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. On second thought aint this going to waste too much memory on small packets? If packets are queued somewhere it can make a huge difference if every buffer is 200kb... Does the speedup goes away if only unbound packets make use of the buffer pool? Thanks, Marton I tried these two LG 4k HDR sample videos, and the pool was never bigger than 3 to 5 buffers for the entire demuxing process. That is the case if there is no packet buffering, like in ffmpeg using a single input. But in ffplay or a lot of other apps packets are pre-buffered to remove the latency of the source media. An app could have assumed that if it buffers 1 MB of packets it will not consume a lot more than 1 MB of memory. I'll bench again with your suggestion, but i don't think it will be a problem even as is. Maybe we should create log2(MAX_PACKET_SIZE) number of buffer pools instead? In that case the memory wasted is at most 100%... Still not very good, but a lot more acceptable. Regards, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On 4/2/2020 3:27 PM, Marton Balint wrote: > > > On Thu, 2 Apr 2020, Marton Balint wrote: > >> >> >> 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 --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); + av_buffer_pool_uninit(>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. > > On second thought aint this going to waste too much memory on small > packets? If packets are queued somewhere it can make a huge difference > if every buffer is 200kb... > > Does the speedup goes away if only unbound packets make use of the > buffer pool? > > Thanks, > Marton I tried these two LG 4k HDR sample videos, and the pool was never bigger than 3 to 5 buffers for the entire demuxing process. I'll bench again with your suggestion, but i don't think it will be a problem even as is. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On Thu, 2 Apr 2020, Marton Balint wrote: 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 --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); +av_buffer_pool_uninit(>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. On second thought aint this going to waste too much memory on small packets? If packets are queued somewhere it can make a huge difference if every buffer is 200kb... Does the speedup goes away if only unbound packets make use of the buffer pool? Thanks, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
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 --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); +av_buffer_pool_uninit(>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 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
On 3/29/2020 6:07 PM, James Almer wrote: > This produces a small speed up in demuxing > > Signed-off-by: James Almer > --- > 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 == _mpegts_demuxer) { > /* normal demux */ > > @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) > > clear_programs(ts); > > +av_buffer_pool_uninit(>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. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH] avformat/mpegts: use a buffer pool for PES payloads
This produces a small speed up in demuxing Signed-off-by: James Almer --- 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 == _mpegts_demuxer) { /* normal demux */ @@ -3200,6 +3204,8 @@ static void mpegts_free(MpegTSContext *ts) clear_programs(ts); +av_buffer_pool_uninit(>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); -- 2.25.2 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".