diff mbox

[FFmpeg-devel,01/10] avformat/mpegtsenc: allow any sensible PID for elementary and pmt pids

Message ID 20191112212906.18539-1-cus@passwd.hu
State New
Headers show

Commit Message

Marton Balint Nov. 12, 2019, 9:28 p.m. UTC
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 <cus@passwd.hu>
---
 doc/muxers.texi         |  7 ++++---
 libavformat/mpegts.h    |  4 ++++
 libavformat/mpegtsenc.c | 21 ++++++++++++++-------
 3 files changed, 22 insertions(+), 10 deletions(-)

Comments

Limin Wang Nov. 13, 2019, 2:04 a.m. UTC | #1
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 <cus@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-request@ffmpeg.org with subject "unsubscribe".
diff mbox

Patch

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}.
 
 @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 },