[FFmpeg-devel] [PATCH 2/3] avformat/mpegts: cache PID discard values
Marton Balint
cus at passwd.hu
Fri Jan 25 20:51:10 EET 2019
On Fri, 25 Jan 2019, Michael Niedermayer wrote:
> On Thu, Jan 24, 2019 at 09:38:00PM +0100, Marton Balint wrote:
>> discard_pid can be quite expensive, so let's cache it and recalculate it on
>> every packet start.
>>
>> ffmpeg -y -i samples/MPEG-VOB/sdtv/RAI.ts -c copy -map 0:v:0 -map 0:a:0 -f mpegts /dev/null
>>
>> Before:
>> 1685 decicycles in handle_packet, 523483 runs, 805 skips
>>
>> After:
>> 883 decicycles in handle_packet, 523505 runs, 783 skips
>>
>> Signed-off-by: Marton Balint <cus at passwd.hu>
>> ---
>> libavformat/mpegts.c | 7 +++++--
>> 1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
>> index 300db110d4..b04fd7b4f4 100644
>> --- a/libavformat/mpegts.c
>> +++ b/libavformat/mpegts.c
>> @@ -91,6 +91,7 @@ struct MpegTSFilter {
>> int es_id;
>> int last_cc; /* last cc code (-1 if first packet) */
>> int64_t last_pcr;
>> + int discard;
>> enum MpegTSFilterType type;
>> union {
>> MpegTSPESFilter pes_filter;
>> @@ -2474,8 +2475,6 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
>> int64_t pos;
>>
>> pid = AV_RB16(packet + 1) & 0x1fff;
>> - if (pid && discard_pid(ts, pid))
>> - return 0;
>> is_start = packet[1] & 0x40;
>> tss = ts->pids[pid];
>> if (ts->auto_guess && !tss && is_start) {
>> @@ -2484,6 +2483,10 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
>> }
>> if (!tss)
>> return 0;
>> + if (is_start)
>> + tss->discard = discard_pid(ts, pid);
>> + if (tss->discard)
>> + return 0;
>
> this is moving the discard check over the auto_guess /add_pes_stream()
> have you checked or know that this is ok ?
> its not immedeatly obviouls (to me) why this would have no side effects
As far as I see that code is used to add streams which are not part of
the detected programs. Therefore program discards should not concern them.
Regards,
Marton
More information about the ffmpeg-devel
mailing list