summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2019-11-11 00:06:01 +0100
committerMarton Balint <cus@passwd.hu>2020-04-21 21:28:29 +0200
commit422f0a61367f068fb8b1b9ab8cc2eee1808c803c (patch)
tree1df3603c274f5e18adc6751151ff6b3dcadfd336
parent561ba15c973120c9565a8f75a7439f3e8a10e04d (diff)
avformat/mpegtsenc: use standard pids for m2ts
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r--doc/muxers.texi6
-rw-r--r--libavformat/mpegts.h10
-rw-r--r--libavformat/mpegtsenc.c44
3 files changed, 57 insertions, 3 deletions
diff --git a/doc/muxers.texi b/doc/muxers.texi
index 1a1cdb910a..cb2bb42c32 100644
--- a/doc/muxers.texi
+++ b/doc/muxers.texi
@@ -1660,11 +1660,13 @@ Advanced Codec Digital HDTV service.
@item mpegts_pmt_start_pid @var{integer}
Set the first PID for PMTs. Default is @code{0x1000}, minimum is @code{0x0020},
-maximum is @code{0x1ffa}.
+maximum is @code{0x1ffa}. This option has no effect in m2ts mode where the PMT
+PID is fixed @code{0x0100}.
@item mpegts_start_pid @var{integer}
Set the first PID for elementary streams. Default is @code{0x0100}, minimum is
-@code{0x0020}, maximum is @code{0x1ffa}.
+@code{0x0020}, maximum is @code{0x1ffa}. This option has no effect in m2ts mode
+where the elementary stream PIDs are fixed.
@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 86a3eba4e2..059b693f07 100644
--- a/libavformat/mpegts.h
+++ b/libavformat/mpegts.h
@@ -65,6 +65,16 @@
* streams and other data tables */
#define NULL_PID 0x1FFF /* Null packet (used for fixed bandwidth padding) */
+/* m2ts pids */
+#define M2TS_PMT_PID 0x0100
+#define M2TS_PCR_PID 0x1001
+#define M2TS_VIDEO_PID 0x1011
+#define M2TS_AUDIO_START_PID 0x1100
+#define M2TS_PGSSUB_START_PID 0x1200
+#define M2TS_TEXTSUB_PID 0x1800
+#define M2TS_SECONDARY_AUDIO_START_PID 0x1A00
+#define M2TS_SECONDARY_VIDEO_START_PID 0x1B00
+
/* 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 ccb631d746..bee996ad49 100644
--- a/libavformat/mpegtsenc.c
+++ b/libavformat/mpegtsenc.c
@@ -94,6 +94,10 @@ typedef struct MpegTSWrite {
int pmt_start_pid;
int start_pid;
int m2ts_mode;
+ int m2ts_video_pid;
+ int m2ts_audio_pid;
+ int m2ts_pgssub_pid;
+ int m2ts_textsub_pid;
int pcr_period_ms;
#define MPEGTS_FLAG_REEMIT_PAT_PMT 0x01
@@ -860,6 +864,14 @@ static int mpegts_init(AVFormatContext *s)
}
}
+ ts->m2ts_video_pid = M2TS_VIDEO_PID;
+ ts->m2ts_audio_pid = M2TS_AUDIO_START_PID;
+ ts->m2ts_pgssub_pid = M2TS_PGSSUB_START_PID;
+ ts->m2ts_textsub_pid = M2TS_TEXTSUB_PID;
+
+ if (ts->m2ts_mode)
+ ts->pmt_start_pid = M2TS_PMT_PID;
+
if (s->max_delay < 0) /* Not set by the caller */
s->max_delay = 0;
@@ -923,7 +935,37 @@ 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) {
- ts_st->pid = ts->start_pid + i;
+ if (ts->m2ts_mode) {
+ switch (st->codecpar->codec_type) {
+ case AVMEDIA_TYPE_VIDEO:
+ ts_st->pid = ts->m2ts_video_pid++;
+ break;
+ case AVMEDIA_TYPE_AUDIO:
+ ts_st->pid = ts->m2ts_audio_pid++;
+ break;
+ case AVMEDIA_TYPE_SUBTITLE:
+ switch (st->codecpar->codec_id) {
+ case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
+ ts_st->pid = ts->m2ts_pgssub_pid++;
+ break;
+ case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
+ ts_st->pid = ts->m2ts_textsub_pid++;
+ break;
+ }
+ break;
+ }
+ if (ts->m2ts_video_pid > M2TS_VIDEO_PID + 1 ||
+ ts->m2ts_audio_pid > M2TS_AUDIO_START_PID + 32 ||
+ ts->m2ts_pgssub_pid > M2TS_PGSSUB_START_PID + 32 ||
+ ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1 ||
+ ts_st->pid < 16) {
+ av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index);
+ ret = AVERROR(EINVAL);
+ goto fail;
+ }
+ } else {
+ ts_st->pid = ts->start_pid + i;
+ }
} else {
ts_st->pid = st->id;
}