[Matroska-devel] Re: r7150 - trunk/libavformat/matroska.c

Steve Lhomme steve.lhomme at free.fr
Wed Nov 22 10:54:00 CET 2006


Aurelien Jacobs wrote:
> On Wed, 22 Nov 2006 01:19:26 +0100
> Michael Niedermayer <michaelni at gmx.at> wrote:
> 
>> Hi
>>
>> On Wed, Nov 22, 2006 at 12:47:21AM +0100, aurel wrote:
>>> Author: aurel
>>> Date: Wed Nov 22 00:47:21 2006
>>> New Revision: 7150
>>>
>>> Modified:
>>>    trunk/libavformat/matroska.c
>>>
>>> Log:
>>> add support for FLAC in matroska
>>>
>>> Modified: trunk/libavformat/matroska.c
>>> ==============================================================================
>>> --- trunk/libavformat/matroska.c	(original)
>>> +++ trunk/libavformat/matroska.c	Wed Nov 22 00:47:21 2006
>>> @@ -224,6 +224,7 @@
>>>      {"A_DTS"            , CODEC_ID_DTS},
>>>      {"A_VORBIS"         , CODEC_ID_VORBIS},
>>>      {"A_AAC"            , CODEC_ID_AAC},
>>> +    {"A_FLAC"           , CODEC_ID_FLAC},
>>>      {"A_WAVPACK4"       , CODEC_ID_WAVPACK},
>>>      {"A_TTA1"           , CODEC_ID_TTA},
>>>      {NULL               , CODEC_ID_NONE}
>>> @@ -2265,6 +2266,14 @@
>>>                  }
>>>              }
>>>  
>>> +            else if (codec_id == CODEC_ID_FLAC) {
>>> +                AVPacket *pkt = av_mallocz(sizeof(AVPacket));
>>> +                av_new_packet(pkt, track->codec_priv_size);
>>> +                memcpy(pkt->data, track->codec_priv, track->codec_priv_size);
>>> +                matroska_queue_packet(matroska, pkt);
>>> +                track->codec_priv_size = 0;
>>> +            }
>> hmm, are you injecting a global header as first packet into the stream?
> 
> Indeed I am. Well not exactly in fact...
> FLAC uses a 34 bytes extradata struct. The flac decoder accept either:
>  - 34 bytes in the extradata then normal data in normal packets
>    (with a 0xFFF8 marker prepended to the first data packet).
>  - 34 bytes prepended to the first normal data packet then normal
>    data packets.
> Ok, so now as you know that matroska is quite braindead, you don't even
> expect it to contain a proper 34 bytes extradata and normal data packets.
> You may at least expect that they stored the extradata prepended to
> the first data packet ?
> They managed to do even worse ! They indeed pack the extradata with the
> first data packet, but they store it in the extradata block !

If that's the case it's ugly. Although it may be due to libflac at that 
time that needed the extradata+1 frame to work correctly (keep in mind 
this stuff is old). But that's just a supposition.

Hopefully Mosu or Haali know more about that.

> So we endup with the extradata containing a real, normal data packet with
> a 34 bytes header.
> So what I did is really the simplest way to handle this.
> Another solution would be to keep only the 34 first bytes in the extradata,
> and put the remaining of the extradata block in an AVPacket. This would
> IMO not be cleaner, and it would be more complicated.

It's much easier, you just set track->codec_priv_size to 34.

Steve




More information about the Matroska-devel mailing list