+@@ -763,6 +755,7 @@ static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
+ service->pmt.pid = ts->pmt_start_pid + ts->nb_services;
+ service->sid = sid;
+ service->pcr_pid = 0x1fff;
++ service->pcr_sid = 0x1fff;
+ if (encode_str8(service->provider_name, provider_name) < 0 ||
+ encode_str8(service->name, service_name) < 0) {
+ av_log(s, AV_LOG_ERROR, "Too long service or provider name\n");
+@@ -788,30 +781,32 @@ static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream *pcr_s
+ MpegTSWrite *ts = s->priv_data;
+ MpegTSWriteStream *ts_st = pcr_st->priv_data;
+
+- if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
+- int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME : ts->pcr_period_ms;
+- ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE, 1000);
+- } else {
++ int64_t pcr_period = -1;
++ if (ts->pcr_period_ms >= 0)
++ pcr_period = av_rescale(ts->pcr_period_ms, PCR_TIME_BASE, 1000);
++ else if (ts->mux_rate == 1) {
+ /* By default, for VBR we select the highest multiple of frame duration which is less than 100 ms. */
+ int64_t frame_period = 0;
+ if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
+ int frame_size = av_get_audio_frame_duration2(pcr_st->codecpar, 0);
+- if (!frame_size) {
++ if (frame_size > 0)
++ frame_period = av_rescale_rnd(frame_size, PCR_TIME_BASE, pcr_st->codecpar->sample_rate, AV_ROUND_UP);
++ else
+ av_log(s, AV_LOG_WARNING, "frame size not set\n");
+- frame_size = 512;
+- }
+- frame_period = av_rescale_rnd(frame_size, PCR_TIME_BASE, pcr_st->codecpar->sample_rate, AV_ROUND_UP);
+ } else if (pcr_st->avg_frame_rate.num) {
+ frame_period = av_rescale_rnd(pcr_st->avg_frame_rate.den, PCR_TIME_BASE, pcr_st->avg_frame_rate.num, AV_ROUND_UP);
+ }
+- if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10)
+- ts_st->pcr_period = frame_period * (PCR_TIME_BASE / 10 / frame_period);
+- else
+- ts_st->pcr_period = 1;
++ if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10) {
++ int pcr_frames = (PCR_TIME_BASE / 10) / frame_period;
++ if( pcr_frames > 0 )
++ pcr_period = frame_period * pcr_frames;
++ }
+ }
+-
++ if( pcr_period < 0 )
++ pcr_period = av_rescale(PCR_RETRANS_TIME, PCR_TIME_BASE, 1000);
++ ts_st->pcr_period = pcr_period;
+ // output a PCR as soon as possible
+- ts_st->last_pcr = ts->first_pcr - ts_st->pcr_period;
++ ts_st->last_pcr = ts->first_pcr - pcr_period;
+ }
+
+ static void select_pcr_streams(AVFormatContext *s)
+@@ -823,22 +818,32 @@ static void select_pcr_streams(AVFormatContext *s)
+ AVStream *pcr_st = NULL;
+ AVProgram *program = service->program;
+ int nb_streams = program ? program->nb_stream_indexes : s->nb_streams;
+-
++ /* find first video stream, or just use first stream */
+ for (int j = 0; j < nb_streams; j++) {
+ AVStream *st = s->streams[program ? program->stream_index[j] : j];
+- if (!pcr_st ||
+- pcr_st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+- {
++ if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+ pcr_st = st;
++ break;
+ }
+ }
+-
++ if (!pcr_st && s->nb_streams > 0)
++ pcr_st = s->streams[0];
+ if (pcr_st) {
+ MpegTSWriteStream *ts_st = pcr_st->priv_data;
+- service->pcr_pid = ts_st->pid;
++ service->pcr_sid = ts_st->pid; /* stream id for pcr writes */
++ service->pcr_pid = ts->m2ts_mode > 1 ? /* pcr pid */
++ 0x1000 + ts->service_id : ts_st->pid;
+ enable_pcr_generation_for_stream(s, pcr_st);
+ av_log(s, AV_LOG_VERBOSE, "service %i using PCR in pid=%i, pcr_period=%"PRId64"ms\n",
+ service->sid, service->pcr_pid, av_rescale(ts_st->pcr_period, 1000, PCR_TIME_BASE));
++ for (int j = 0; j < nb_streams; j++) {
++ AVStream *st = s->streams[program ? program->stream_index[j] : j];
++ MpegTSWriteStream *ts_st = st->priv_data;
++ ts_st->service = service;
++ }
++ if (service->pmt.pid == service->pcr_pid) {
++ av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", service->pcr_pid);
++ }
+ }
+ }
+ }
+@@ -860,6 +865,15 @@ static int mpegts_init(AVFormatContext *s)