[FFmpeg-devel] H264: mp4toannexb BSF and streaming

Luca Abeni lucabe72
Wed Aug 18 17:18:17 CEST 2010

On 18/08/10 16:33, Alexandre Ferrieux wrote:
> On 18/08/2010 16:18, Tomas H?rdin wrote:
>> On Wed, 2010-08-18 at 16:06 +0200, Alexandre Ferrieux wrote:
>>> On 18/08/2010 15:33, Alexandre Ferrieux wrote:
>>>> What I'm trying to do is understand where these "important" extradata
>>>> are in the 3GP chunk hierarchy:
>>>> - either they already in a separate chunk that is non-causal (comes at
>>>> the end of the stream), and I'm doomed.
>>> Further experiments with varied clip durations, sadly show that the
>>> above holds :(
>>> Indeed, the produced .3gp files contain a few O(1) blocks (which
>>> deserve the name of 'header' or 'trailer'), but also
>>> unfortunately *two* O(N) blocks: 'mdat' for main bitstream, 'moov'
>>> for extradata. There being more than one toplevel
>>> chunk O(N) in size, with important data in both, wipes any hope of
>>> live streaming. Good job, whoever designed that :/
>>> -Alex
>> Isn't the extradata the same if the encoder uses the same settings? What
>> I'm getting at is that you could use a LUT of "supported" settings with
>> corresponding extradata, and inject a few bytes before the 3GP stream
>> starts telling which settings were used? I'm guessing you don't need a
>> valid 3GP stream anyway (since one is nigh impossible to create).
> Yes, I had hoped something along these lines, but it seems the extradata
> are not constant, they are different for each frame. Essentially they
> are just as unpredictable as frame data themselves.

Again, I am not a 3GP or H.264 expert... But I believe the extradata are 
constant. I do not know why they are at the end of the 3GP file, but I 
think the codec generates them at the beginning, before generating any 
frame, and does not change them (if the video resolution or similar 
properties are not changed).

> Could an H264/quicktime expert explain why they are transmitted
> separately, *not* interleaved with the frame data (as they are in AnnexB
> format) ?
I believe this is because a 3GP file is not supposed to be streamed (and 
is not designed for streaming). I think you can use RTP (which is 
supported by the 3GP standards, if I remember well). If you use RTP, you 
can either interleave SPS and PPS in the stream, or encode it in the SDP 
(it's your choice).


More information about the ffmpeg-devel mailing list