[FFmpeg-devel] [PATCH 12/18] avformat/hls: parse ID3 timestamps for elementary audio streams

Anssi Hannula anssi.hannula at iki.fi
Tue Dec 31 07:20:19 CET 2013

31.12.2013 06:58, Michael Niedermayer kirjoitti:
> On Tue, Dec 31, 2013 at 04:46:37AM +0200, Anssi Hannula wrote:
>> I need communication in the "opposite" direction than AVPackets go, so
>> they are not a good option AFAICS. AVOptions might do it, though, I
>> think I was under the impression they are not changeable after-the-fact
>> so I didn't consider it before...
>> Basically the custom AVIOContext (which has access to AVFormatContext in
>> this case) has to inform the demuxer of either position of ID3 data, or
>> the timestamp recovered from the ID3 data.
>> Since both subdemuxer .read_packet() (which needs the pos) and
>> AVIOContext .read_packet() (which knows the pos) have access to
>> AVIOContext buffer position, I guess the ID3 data buffer position could
>> be transmitted via AVOptions to the subdemuxer (the ID3 tags appear
>> usually every 10 seconds or so, so multiple ID3 tags getting buffered in
>> aviobuf.c should not be an issue).
>> Now the only issue is how to select the hls-id3-audio subdemuxer...
>> (a) Have a regular probe() that detects the timestamp in the ID3 tag
>>     in the beginning of the stream (ID3 tag needs to be made available
>>     in AVProbeData for that, though, presently it is just stripped).
>>     Without AVOption assistance the demuxer can only detect the first
>>     ID3 tag, but it would still work quite ok (the rest of the packets
>>     just get generated timestamps).
>>     Then we also either have to
>>     (I)   Try to parse every ID3 tag in the probe() to look for the
>>           timestamp, or
>>     (II)  Assume ID3 tag is uncompressed and just look for
>>           "com.apple.streaming.transportStreamTimestamp" in it.
>>     (III) Add some lighter-weight option to our ID3 parser to just check
>>           if there is a PRIV tag (and maybe the PRIV tag owner string),
>>           or
>>     (IV)  Have av_probe_input_format3() do ID3 parsing and make the
>>           results available in AVProbeData.
>> (b) Have it without probe() and have HLS demuxer detect the ID3 tag
>>     and select the demuxer manually.
>> Sounds to me like (a)(IV) might be the winner here, or WDYT?
> iam happy with anything that works and is reasonable simple & clean
> i dont think i have a deep enough understanding of id3 tags in hls
> to really say which is the best solution

Well, I just realized one issue with (a)(IV), we can't really add fields
to AVProbeData due to ABI. Maybe without probe() is the way to go then,
I'll have to think about it...

I seem to now be hitting "first_dts 895690 not matching first dts 920758
(pts 920758, duration 2089) in the queue" for every packet after the
first one (only the first one has actual dts), though...

I have to quit debugging now for a while, but if you know off-hand what
I'm doing wrong (if anything - just noticed it is only AV_LOG_DEBUG) it
would save me some time :)

I have AVSTREAM_PARSE_FULL and I set pkt->dts for first pkt, and later
ones have AV_NOPTS_VALUE (the interspersed timestamps aren't yet handled).

Anssi Hannula

More information about the ffmpeg-devel mailing list