aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAman Gupta <aman@tmm1.net>2018-05-08 12:49:43 -0700
committerAman Gupta <aman@tmm1.net>2018-05-18 12:04:57 -0700
commite24d768a76b14a1cbea0ec622c89573f7d06fdee (patch)
tree88acef3630441cfdeccb295d5152458262e24a21
parent2940af9389e5cb2a7509655195e5ccb928577ed2 (diff)
downloadffmpeg-e24d768a76b14a1cbea0ec622c89573f7d06fdee.tar.gz
avformat/mpegts: add skip_unknown_pmt option
Some filtered mpegts streams may erroneously include PMTs for programs that are not advertised in the PAT. This confuses ffmpeg and most players because multiple audio/video streams are created and it is unclear which ones actually contain data. See for example https://tmm1.s3.amazonaws.com/unknown-pmts.ts In this sample, the PAT advertises exactly one program. But the pid it points to for the program's PMT contains PMTs for other programs as well. This is because the broadcaster decided to re-use the same pid for multiple program PMTs. The hardware that filtered the original multi-program stream into a single-program stream did so by rewriting the PAT to contain only the program that was requested. But since it just passed through the PMT pid referenced in the PAT, multiple PMTs are still present for the other programs. Before: Input #0, mpegts, from 'unknown-pmts.ts': Duration: 00:00:10.11, start: 80741.189700, bitrate: 9655 kb/s Program 4 Stream #0:2[0x41]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 11063 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc Stream #0:3[0x44](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s Stream #0:4[0x45](spa): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 128 kb/s No Program Stream #0:0[0x31]: Video: mpeg2video ([2][0][0][0] / 0x0002), none(tv), 90k tbr, 90k tbn, 90k tbc Stream #0:1[0x34](eng): Audio: ac3 (AC-3 / 0x332D4341), 0 channels, fltp Stream #0:5[0x51]: Video: mpeg2video ([2][0][0][0] / 0x0002), none, 90k tbr, 90k tbn Stream #0:6[0x54](eng): Audio: ac3 (AC-3 / 0x332D4341), 0 channels With skip_unknown_pmt=1: Input #0, mpegts, from 'unknown-pmts.ts': Duration: 00:00:10.11, start: 80741.189700, bitrate: 9655 kb/s Program 4 Stream #0:0[0x41]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], Closed Captions, 11063 kb/s, 59.94 fps, 59.94 tbr, 90k tbn, 119.88 tbc Stream #0:1[0x44](eng): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 384 kb/s Stream #0:2[0x45](spa): Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 128 kb/s Signed-off-by: Aman Gupta <aman@tmm1.net>
-rw-r--r--doc/demuxers.texi3
-rw-r--r--libavformat/mpegts.c5
2 files changed, 8 insertions, 0 deletions
diff --git a/doc/demuxers.texi b/doc/demuxers.texi
index e7c2abce57..1d2ee5bf37 100644
--- a/doc/demuxers.texi
+++ b/doc/demuxers.texi
@@ -538,6 +538,9 @@ This demuxer accepts the following options:
Set size limit for looking up a new synchronization. Default value is
65536.
+@item skip_unknown_pmt
+Skip PMTs for programs not defined in the PAT. Default value is 0.
+
@item fix_teletext_pts
Override teletext packet PTS and DTS values with the timestamps calculated
from the PCR of the first program which the teletext stream is part of and is
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index fc9bb3940e..18df1afd9d 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -143,6 +143,7 @@ struct MpegTSContext {
int skip_changes;
int skip_clear;
+ int skip_unknown_pmt;
int scan_all_pmts;
@@ -172,6 +173,8 @@ static const AVOption options[] = {
{.i64 = 0}, 0, 0, AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY },
{"scan_all_pmts", "scan and combine all PMTs", offsetof(MpegTSContext, scan_all_pmts), AV_OPT_TYPE_BOOL,
{.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM },
+ {"skip_unknown_pmt", "skip PMTs for programs not advertised in the PAT", offsetof(MpegTSContext, skip_unknown_pmt), AV_OPT_TYPE_BOOL,
+ {.i64 = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM },
{"skip_changes", "skip changing / adding streams / programs", offsetof(MpegTSContext, skip_changes), AV_OPT_TYPE_BOOL,
{.i64 = 0}, 0, 1, 0 },
{"skip_clear", "skip clearing programs", offsetof(MpegTSContext, skip_clear), AV_OPT_TYPE_BOOL,
@@ -2028,6 +2031,8 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
if (!ts->scan_all_pmts && ts->skip_changes)
return;
+ if (ts->skip_unknown_pmt && !get_program(ts, h->id))
+ return;
if (!ts->skip_clear)
clear_program(ts, h->id);