[FFmpeg-devel] Forward frame wall clock time from avdevice to HLS muxer

Jim DeLaHunt list+ffmpeg-dev at jdlh.com
Thu Aug 27 09:52:58 EEST 2020


On 2020-08-26 03:29, Jesper Ek wrote:

> …I have implemented a libavdevice to capture audio and video from an AJA
> Kona card (similar to decklink). I'm then using the HLS muxer to encode my
> stream. Now I need the HLS EXT-X-PROGRAM-DATE-TIME tag to specify exactly
> when the input source was recorded, so my plan is to forward the "wall
> clock time" (from the avdevice implementation) to the hls muxer, and use
> that instead of using system time (av_gettime()).

I have a client that would like to have a timestamp in wall-clock time 
of precisely when each frame was recorded (to millisecond accuracy). 
What you are talking about sounds interesting to me. Maybe my client can 
use it.


> …I cant use PTS, so what is the correct way to pass "wall clock time"
> metadata for every frame to the HLS encoder?

It seems to me that you might be able to use Presentation Time Stamp 
(PTS). What is the obstacle to using PTS?

I believe that the type of PTS in the FFmpeg codebase is `int64_t` 
(signed 64-bit integer), and in the MPEG Transport Stream format stores 
presentation time stamps as unsigned 33-bit values counting ticks of a 
90 kHz Program Clock Reference. If you multiply 90 kHz * 60 secs/min * 
60 mins/hr * 24 hr/day, there are 7,776,000,000 PCR ticks in 24 hours. 
That fits in a 33-bit unsigned int. And it certainly fits in a signed 
64-bit int. So, it seems like your libavdevice could assign PTS values 
which correspond to the time of day when each frame was captured. There 
is a fighting chance that this value would survive recording in an MPEG 
transport stream, and processing by FFmpeg. (But, I've not actually done 
this myself, so I don't know.)


> …I noticed that the decklink implementation uses
> `av_packet_add_side_data(&pkt, AV_PKT_DATA_STRINGS_METADATA, ...)` to add
> timecode information, is this the correct approach?


Earlier this year, there were patches[3] which aimed to put linear 
timecodes in a format related to SMPTE 12M into a structure marked by a 
`AV_FRAME_DATA_S12M_TIMECODE` value. Maybe that refers to a location 
where you could store timecode values. You might want to search for that 
identifier, and for patches by that developer. I don't know if they have 
been added to the FFmpeg source yet.

SMPTE 12M refers to a linear timecode format[3]. I understand that this 
document has been split into three, and they are now named:

ST 12-1:2014 - SMPTE Standard - Time and Control Code
ST 12-2:2014 - SMPTE Standard - Transmission of Time Code in the 
Ancillary Data Space
ST 12-3:2016 - SMPTE Standard - Time Code for High Frame Rate Signals 
and Formatting in the Ancillary Data Space

They are available for free download from the SMPTE web site[4] until 31 
Dec 2020 (extended from 21 July 2020). You might want to get them now, 
for future reference.

Please do update this list on what you do. I for one would like to take 
a look at it.

Best regards,
      —Jim DeLaHunt, software engineer, Vancouver, Canada

[1] https://en.wikipedia.org/wiki/MPEG_transport_stream#PCR
[2] http://ffmpeg.org/pipermail/ffmpeg-devel/2020-July/265628.html
[3] https://en.wikipedia.org/wiki/SMPTE_timecode
[4] https://www.smpte.org/free-standards-and-publications





More information about the ffmpeg-devel mailing list