summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2019-01-23 01:28:26 +0100
committerMarton Balint <cus@passwd.hu>2019-02-04 21:43:30 +0100
commit56c58b99d0670c8baff64b8b35bc06c9a9f35ef8 (patch)
tree76625f2e3fb160b956ac15f157818eab421d92af
parent1eb6bfbc1ff5d9f670ae51b4ca41d0053a6fd486 (diff)
avformat/mpegts: cache PID discard values
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@passwd.hu>
-rw-r--r--libavformat/mpegts.c7
1 files 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;
ts->current_pid = pid;
afc = (packet[3] >> 4) & 3;