[FFmpeg-devel] mpegtsenc cbr mode pcr accuracy

Michael Niedermayer michaelni at gmx.at
Sat Dec 12 21:18:31 CET 2015

On Sat, Nov 28, 2015 at 09:03:20AM +0200, Timo Teras wrote:
> Hi,
> While the pcr is accuracte, I was measuring the cbr pcr frequence with
> opencaster suite's tspcmeasure tool, and it says that the frequency is
> not that accurate. With default options (just muxrate specified) the
> pcr should appear every 20ms. But it appears every 19-22.5ms (also
> there some appearances with 1-18ms but those are probably the extra pcr
> announces for key frames).
> While in practice this is not too bad for me, I wondered how it should
> be generated instead.
> Seems that the period is calculated in mpegts_write_header():
>   pcr_packet_period = mux_rate * pcr_period / (TS_PACKET_SIZE * 8 * 1000)
> Which is the packet period over the whole mpeg ts stream. But the count
> is actually incremented like mpegts_write_pes():
>     while (payload_size > 0) {
>         retransmit_si_info(s, force_pat, dts);
>         force_pat = 0;
>         write_pcr = 0;
>         if (ts_st->pid == ts_st->service->pcr_pid) {
>             if (ts->mux_rate > 1 || is_start) // VBR pcr period is based on frames
>                 ts_st->service->pcr_packet_count++;
> The problem seems to be that only packets for pcr_pid are counted in
> the pcr period. That's why the gap goes >20ms when there's other
> streams muxed (usually audio) and depends on the other PES' bandwidth.
> Same is true for sdt and pat - they drift very slightly, because they
> don't count each other's packets.
> I was wondering how to fix this. Would it be best to remove all
> {sdt,pat,pcr}_packet_count variables, and replace it with single
> packet_count counter that is incremented everytime a packet is sent
> (in the four functions section_write_packet(),
> mpegts_insert_null_packet(), mpegts_insert_pcr_only(),
> mpegts_write_pes()) and then calculate just the next packet count when
> to trigger resend. packet_count + {sdt,pat,pcr}_packet_period.

wouldnt packet_count overflow? (can be worked around of course just
want to make sure i understand what you suggest)

> Another problem case is the inserting of null/pcr-only packets. If it's
> a non-pcr stream PES packet triggering the stuffing, it should still
> stuff pcr to the pcr_pid - not the pid of the stream triggering the
> stuffing. Basically the strategy in cbr mode should be:
>  1) Check / send SDT/PAT as currently
>  2) Check if PCR needs to be sent
>  3) If filler packets needed: a) send pcr on pcr_pid, OR b) send null
>  4) If PCR send needed but ES PID != pcr pid: send PCR only on pcr_pid
>  5) Proceed with sending ES on ES PID as regular
> Does this reasoning / approach make sense?


> Thanks,
> Timo
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The misfortune of the wise is better than the prosperity of the fool.
-- Epicurus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151212/73bed198/attachment.sig>

More information about the ffmpeg-devel mailing list