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; }