On Tue, Nov 12, 2019 at 10:28:57PM +0100, Marton Balint wrote: > Also make sure that assigned PID numbers are valid and fix the error message > for the previous PID collision checks. > > Signed-off-by: Marton Balint <c...@passwd.hu> > --- > doc/muxers.texi | 7 ++++--- > libavformat/mpegts.h | 4 ++++ > libavformat/mpegtsenc.c | 21 ++++++++++++++------- > 3 files changed, 22 insertions(+), 10 deletions(-) > > diff --git a/doc/muxers.texi b/doc/muxers.texi > index 09ded7d48a..c36ae60f19 100644 > --- a/doc/muxers.texi > +++ b/doc/muxers.texi > @@ -1582,11 +1582,12 @@ Advanced Codec Digital HDTV service. > @end table > > @item mpegts_pmt_start_pid @var{integer} > -Set the first PID for PMT. Default is @code{0x1000}. Max is @code{0x1f00}. > +Set the first PID for PMTs. Default is @code{0x1000}, minimum is > @code{0x0010}, > +maximum is @code{0x1ffe}.
I think the valid pid range can consider change to [0x20, 0x1ffa] as 0x0010-0x001F is used by DVB metadata, like NIT, SDT etc, it'll valid both for DVB and ATSC standard. ARIB standard is reserved x20-0x2F, but it's not well known. 0x1ff0-0x1ffe is reserved by ATSC atandard, 0x1FFB is used by PSIP and EA data(A/65), 0x1ffe is used by DOCSIS. I notice AWS Elemental encoder allow maximum is 0x1ff6. reference link: https://en.wikipedia.org/wiki/MPEG_transport_stream https://docs.aws.amazon.com/medialive/latest/apireference/channels-channelid-start.html https://www.scte.org/SCTEDocs/Standards/SCTE%20137-6%202017.pdf https://www.atsc.org/wp-content/uploads/2015/03/A53-Part-3-2013.pdf > > @item mpegts_start_pid @var{integer} > -Set the first PID for data packets. Default is @code{0x0100}. Max is > -@code{0x0f00}. > +Set the first PID for elementary streams. Default is @code{0x0100}, minimum > is > +@code{0x0010}, maximum is @code{0x1ffe}. > > @item mpegts_m2ts_mode @var{boolean} > Enable m2ts mode if set to @code{1}. Default value is @code{-1} which > diff --git a/libavformat/mpegts.h b/libavformat/mpegts.h > index ecc3d3374c..9a7f2c1d11 100644 > --- a/libavformat/mpegts.h > +++ b/libavformat/mpegts.h > @@ -63,6 +63,10 @@ > * streams and other data tables */ > #define NULL_PID 0x1FFF /* Null packet (used for fixed bandwidth > padding) */ > > +/* PMT and elementary stream PID range */ > +#define FIRST_OTHER_PID 0x0010 > +#define LAST_OTHER_PID 0x1FFE > + > /* table ids */ > #define PAT_TID 0x00 /* Program Association section */ > #define CAT_TID 0x01 /* Conditional Access section */ > diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c > index 9f8f1715c9..fbc7305dc1 100644 > --- a/libavformat/mpegtsenc.c > +++ b/libavformat/mpegtsenc.c > @@ -912,19 +912,26 @@ static int mpegts_init(AVFormatContext *s) > > /* MPEG pid values < 16 are reserved. Applications which set st->id > in > * this range are assigned a calculated pid. */ > - if (st->id < 16) { > + if (st->id < FIRST_OTHER_PID) { > ts_st->pid = ts->start_pid + i; > - } else if (st->id < 0x1FFF) { > - ts_st->pid = st->id; > } else { > + ts_st->pid = st->id; > + } > + if (ts_st->pid > LAST_OTHER_PID) { > av_log(s, AV_LOG_ERROR, > - "Invalid stream id %d, must be less than 8191\n", st->id); > + "Invalid stream id %d, must be less than %d\n", st->id, > LAST_OTHER_PID + 1); > ret = AVERROR(EINVAL); > goto fail; > } > for (j = 0; j < ts->nb_services; j++) { > + if (ts->services[j]->pmt.pid > LAST_OTHER_PID) { > + av_log(s, AV_LOG_ERROR, > + "Invalid PMT PID %d, must be less than %d\n", > ts->services[j]->pmt.pid, LAST_OTHER_PID + 1); > + ret = AVERROR(EINVAL); > + goto fail; > + } > if (ts_st->pid == ts->services[j]->pmt.pid) { > - av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", > ts_st->pid); > + av_log(s, AV_LOG_ERROR, "PID %d cannot be both elementary > and PMT PID\n", ts_st->pid); > ret = AVERROR(EINVAL); > goto fail; > } > @@ -1888,10 +1895,10 @@ static const AVOption options[] = { > AV_OPT_FLAG_ENCODING_PARAM, "mpegts_service_type" }, > { "mpegts_pmt_start_pid", "Set the first pid of the PMT.", > offsetof(MpegTSWrite, pmt_start_pid), AV_OPT_TYPE_INT, > - { .i64 = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM }, > + { .i64 = 0x1000 }, FIRST_OTHER_PID, LAST_OTHER_PID, > AV_OPT_FLAG_ENCODING_PARAM }, > { "mpegts_start_pid", "Set the first pid.", > offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT, > - { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM }, > + { .i64 = 0x0100 }, FIRST_OTHER_PID, LAST_OTHER_PID, > AV_OPT_FLAG_ENCODING_PARAM }, > { "mpegts_m2ts_mode", "Enable m2ts mode.", > offsetof(MpegTSWrite, m2ts_mode), AV_OPT_TYPE_BOOL, > { .i64 = -1 }, -1, 1, AV_OPT_FLAG_ENCODING_PARAM }, > -- > 2.16.4 > > _______________________________________________ > 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". _______________________________________________ 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".