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