Implement SetPCR for stream output
Motivations:
PCR events gives solid information of a stream data input timestamps state. When a PCR event comes in, you know that no data will arrive with a timestamp below the given pcr value. This kind of information could be very valuable in stream out scenarios where you need precise stream advancement. I'm currently working on an HLS stream output implementation (mainly for chromecast uses) PCR events are a great tool to properly end HLS segments.
Problematics and implementation choices:
PCR
events can hardly travel as in-bound data after they've left demux. Implementing it that way would've required an enormous amount of reworks so we decided not to go that way.
Instead we decided to forward the PCR
events from the demuxer to the stream outputs using separate callbacks. This could work well but the implementation require a lot of care due to some of the problematics listed below:
- The asynchronous nature of the
es_out
'sDecoderThread
and thetranscode
pipeline. Frames are treated in a separate thread so we can't just forward PCR events, there need to be a synchronizing mechanism. - In some filter or encoder cases, frame timestamps can be shifted, frames can be duplicated/merged/dropped. PCR value needs to be updated accordingly.
To avoid struggle against these problematics in future module implementations of PCR
forwarding to stream outs such as in the transcode
pipeline, we decided to create a core API to deal with this specific problematic (vlc_pcr_delayer
: see 130c5dac)
Content of the Merge Request
This MR could be split. Transcode implementation and pcr_delayer introduction could fit in other MRs but, for a first discussion based on this work, I thought it would make more sense to provide the full context of all the components involved.
The merge request contains 4 distinct parts:
- Blank
set_pcr
callback implementation and propagation through all the stream_output modules. -
vlc_pcr_delayer
introduction to tackle the problematics discussed above in thePCR
event forwarding both in the core and in modules -
PCR
event forwarding to stream output implemented in the core'sInputDecoder
. -
PCR
event forwarding to downstream implemented intranscode
.
This subject has been briefly approached in the last VLC Workshop: videolan/vlc#26378 (closed)