[FFmpeg-devel] [PATCH 3/3] avformat/mpegts: add support for non-standard NIT pid

Anthony Delannoy anthony.2lannoy at gmail.com
Thu Oct 3 15:43:52 EEST 2019


---
 libavformat/mpegts.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 5a3e71d9ab..02da272325 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -169,6 +169,7 @@ struct MpegTSContext {
     MpegTSFilter *pids[NB_PID_MAX];
     int current_pid;
 
+    int nit_pid;
     AVStream *epg_stream, *nit_stream;
 };
 
@@ -2432,15 +2433,6 @@ static void nit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
     const uint8_t *p, *p_end;
     SectionHeader h1, *h = &h1;
 
-    if (!ts->nit_stream) {
-        ts->nit_stream = avformat_new_stream(ts->stream, NULL);
-        if (!ts->nit_stream)
-            return;
-        ts->nit_stream->id = NIT_PID;
-        ts->nit_stream->codecpar->codec_type = AVMEDIA_TYPE_DATA;
-        ts->nit_stream->codecpar->codec_id = AV_CODEC_ID_NIT;
-    }
-
     if (ts->nit_stream->discard == AVDISCARD_ALL)
         return;
 
@@ -2508,7 +2500,25 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
 
         if (sid == 0x0000) {
             /* NIT info */
-            // XXX for now we only use default NIT_PID
+            if (!ts->nit_stream) {
+                ts->nit_pid = pmt_pid;
+
+                if (ts->nit_pid != NIT_PID)
+                    av_log(ts->stream, AV_LOG_WARNING,
+                           "Using non-standard PID %i for NIT table.\n", pmt_pid);
+
+                if (ts->pids[ts->nit_pid])
+                    mpegts_close_filter(ts, ts->pids[ts->nit_pid]);
+
+                mpegts_open_section_filter(ts, ts->nit_pid, nit_cb, ts, 1);
+
+                ts->nit_stream = avformat_new_stream(ts->stream, NULL);
+                if (!ts->nit_stream)
+                    return;
+                ts->nit_stream->id = ts->nit_pid;
+                ts->nit_stream->codecpar->codec_type = AVMEDIA_TYPE_DATA;
+                ts->nit_stream->codecpar->codec_id = AV_CODEC_ID_NIT;
+            }
         } else {
             MpegTSFilter *fil = ts->pids[pmt_pid];
             program = av_new_program(ts->stream, sid);
@@ -3084,7 +3094,6 @@ static int mpegts_read_header(AVFormatContext *s)
         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);
-        mpegts_open_section_filter(ts, NIT_PID, nit_cb, ts, 1);
 
         handle_packets(ts, probesize / ts->raw_packet_size);
         /* if could not find service, enable auto_guess */
@@ -3343,7 +3352,6 @@ MpegTSContext *avpriv_mpegts_parse_open(AVFormatContext *s)
     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);
-    mpegts_open_section_filter(ts, NIT_PID, nit_cb, ts, 1);
 
     return ts;
 }
-- 
2.23.0



More information about the ffmpeg-devel mailing list