From ecda0e2f9b0e01a62f06cfb00684d11de6eb6dc2 Mon Sep 17 00:00:00 2001 From: Andreas Hakon Date: Tue, 23 Apr 2019 12:05:40 +0100 Subject: [PATCH] libavformat: forced PCR pid in mpegts muxer This patch provides a new optional parameter for the mpegtsenc muxer. The parameter "-force_prc_pid" can be used to override the default PCR pid. By default FFmpeg selects the first video stream, or the first one in the service if no video stream is found. With this new parameter any of the pids in the service can be used to carry the PCR clock. This can be handy for many reasons. Example: $ ffmpeg -i input.mpg -c:v libx264 -c:a mp2 \ -f mpegts -mpegts_pmt_start_pid 200 -streamid 0:201 -streamid 1:202 \ -force_pcr_pid 202 output.ts All then the output audio stream (with pid:202) will host the PCR marks. Signed-off-by: Andreas Hakon --- doc/muxers.texi | 3 +++ libavformat/mpegtsenc.c | 11 ++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/doc/muxers.texi b/doc/muxers.texi index 83ae017..8b6d9d3 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -1590,6 +1590,9 @@ is @code{-1}, which results in shifting timestamps so that they start from 0. @item omit_video_pes_length @var{boolean} Omit the PES packet length for video packets. Default is @code{1} (true). +@item force_pcr_pid @var{integer} +Override the pid for carring the PCR clock. + @item pcr_period @var{integer} Override the default PCR retransmission time in milliseconds. Ignored if variable muxrate is selected. Default is @code{20}. diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index fc0ea22..b839b10 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -96,6 +96,7 @@ typedef struct MpegTSWrite { int pmt_start_pid; int start_pid; + int pcr_forced_pid; int m2ts_mode; int reemit_pat_pmt; // backward compatibility @@ -913,9 +914,9 @@ static int mpegts_init(AVFormatContext *s) ts_st->first_pts_check = 1; ts_st->cc = 15; ts_st->discontinuity = ts->flags & MPEGTS_FLAG_DISCONT; - /* update PCR pid by using the first video stream */ - if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && - service->pcr_pid == 0x1fff) { + /* update PCR pid by: forced pid or using the first video stream */ + if (ts_st->pid == ts->pcr_forced_pid || + (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && service->pcr_pid == 0x1fff)) { service->pcr_pid = ts_st->pid; pcr_st = st; } @@ -960,6 +961,7 @@ static int mpegts_init(AVFormatContext *s) service->pcr_pid = ts_st->pid; } else ts_st = pcr_st->priv_data; + av_log(s, AV_LOG_VERBOSE, "PCR in pid %d (%d) \n", service->pcr_pid, st->index); if (ts->mux_rate > 1) { service->pcr_packet_period = (int64_t)ts->mux_rate * ts->pcr_period / @@ -1917,6 +1919,9 @@ static const AVOption options[] = { { "mpegts_start_pid", "Set the first pid.", offsetof(MpegTSWrite, start_pid), AV_OPT_TYPE_INT, { .i64 = 0x0100 }, 0x0010, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM }, + { "force_pcr_pid", "Force the pid carring PCR.", + offsetof(MpegTSWrite, pcr_forced_pid), AV_OPT_TYPE_INT, + { .i64 = 0x0000 }, 0x0010, 0x1ffe, 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 }, -- 1.7.10.4