--- 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 _______________________________________________ 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".