[FFmpeg-devel] TS muxer issues -- some progress

Alexandre Ferrieux alexandre.ferrieux
Thu Feb 19 11:14:38 CET 2009


Marc Mason wrote:
> Marc Mason wrote:
> 
>> M?ns Rullg?rd wrote:
>>
>>> Marc Mason wrote:
>>>
>>>> I've been reading H.222.0 (MPEG-2 Systems) and ETSI TR 101 290 
>>>> (Measurement guidelines for DVB systems). Again.
>>>>
>>>> "Systems" explicitly allows variable-bitrate transport streams:
>>>>
>>>> """
>>>> Transport Streams may be either fixed or variable rate. In either case 
>>>> the constituent elementary streams may either be fixed or variable rate. 
>>>> The syntax and semantic constraints on the stream are identical in each 
>>>> of these cases. The Transport Stream rate is defined by the values and 
>>>> locations of Program Clock Reference (PCR) fields, which in general are 
>>>> separate PCR fields for each program.
>>>>
>>>> There are some difficulties with constructing and delivering a Transport 
>>>> Stream containing multiple programs with independent time bases such 
>>>> that the overall bit rate is variable. Refer to 2.4.2.2.
>>>> """
>>>>
>>>> I realize now that I had always implicitly assumed that a given 
>>>> transport stream must be constant bit-rate. And this assumption turns 
>>>> out to have been wrong.
>>> A variable-rate TS can be trivially converted to constant rate by
>>> inserting null packets.
>> I don't think so.
>>
>> If the muxer is real-time, it would need an oracle to predict the future 
>> bitrate of the underlying elementary streams.
>>
>> If the bitrate of each elementary stream is bounded, then the muxer 
>> could pad to the sum of all bitrates + overhead, but this would be 
>> highly inefficient.
>>
>> Even if the muxer is offline, and thus has perfect knowledge of the 
>> "future", it may not be possible to "spread" the excess bits.
>>
>> For an unrealistic scenario, consider a stream with the following 
>> properties: 50 Mbit/s for one second, then 500 kbit/s for the next 3599 
>> seconds. The excess data at the start may have timing imperatives that 
>> prevent the muxer from spreading it over 1 hour.
>>
>>> Constant-rate streams are required if a
>>> physical link is inherently fixed-rate, e.g. a satellite broadcast.
>> Variable-bitrate TS over RTP/UDP/IP should be OK then?
>>
>> I've worked with several ASI cards, and these required the bitrate to 
>> remain constant.
>>
>>>> Given a variable bitrate transport stream, it seems to make no sense 
>>>> trying to compute PCR accuracy offline, as it is typically computed by 
>>>> assuming CBR, dividing the byte count by the CBR, and comparing that 
>>>> value to the PCR.
>>>>
>>>> TR 101 290 seems to agree with the above statement:
>>>>
>>>> """
>>>> PCR_accuracy_error
>>>> The accuracy of +/- 500 ns is intended to be sufficient for the colour 
>>>> subcarrier to be synthesized from system clock.
>>>> This test should only be performed on a constant bitrate TS as defined 
>>>> in ISO/IEC 13818-1 [1] clause 2.1.7.
>>>> Further information on PCR jitter measurements is given in clause 5.3.2. 
>>>> and annex I (PCR related measurements).
>>>> """
>>>>
>>>> """
>>>> 5.3.2.6 Program Clock Reference - Accuracy PCR_AC
>>>> The accuracy of the PCR values PCR_AC is defined as the difference 
>>>> between the actual PCR value and the value it should have in the TS 
>>>> represented by the byte index for its actual position. This can be 
>>>> calculated for constant bitrate TS, the measurement may NOT produce 
>>>> meaningful results in variable bitrate TS.
>>>> """
>>>>
>>>> "may NOT" ?? "WILL NOT" seems more appropriate.
>>>>
>>>> Do most demuxers handle variable-bitrate transport streams with no 
>>>> problem, or is it generally assumed that a TS is CBR?
>>> Most demuxers, including small, cheap hardware decoders, handle
>>> variable-rate streams without issue as long as they are delivered at
>>> the correct rate.
>> So streaming over a LAN should be OK, but streaming over the Internet 
>> might not work, because of the network jitter?
>>
>>> Some retarded implementations require constant rate for reasons beyond
>>> my imagination.  One such implementation I have encountered would give
>>> a "bitrate too low" error if the TS rate, as computed from bytes
>>> between PCR values, varied even the slightest.
> 
> M?ns and/or other Transport Stream enthusiasts ;-)
> 
> Could you comment? Specifically, I'm not sure I agree with the statement 
> that it is trivial to convert a VBR TS to a CBR TS.
> 

I second the question. While letting the experts answer it, can someone 
tell me if the following description is correct for streaming TS to a 
set-top-box over IP:

  1- assume some VBR source that ffmpeg can decode

  2- internal ffmpeg data structures hold PTS values

  3- these PTS values give target timings for playing at normal speed

  4- with -re, they keep this property even if the input is a flat file 
on a fast, local hard drive.

  5a- the TS muxer could base its PCR on those internal PTSs

  5b- or, it could base its PCR on the local gettimeofday()

  5c- but today is bases it on written byte counts instead (!), *and* on 
IP there is no byte-stuffing like would normally occur on a CBR link 
like satellite.

  6- As a consequence, the receiving STB sees a PCR that is way too slow 
and reports underflows.

TIA for any comments,

-Alex





More information about the ffmpeg-devel mailing list