[Ffmpeg-cvslog] r7150 - trunk/libavformat/matroska.c

Aurelien Jacobs aurel
Wed Nov 22 10:38:44 CET 2006


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 !

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.

So is it ok to keep it the way I wrote it ?

BTW: is there anything in the nut spec to avoid people doing such braindead
things ? How should flac be stored in nut ? If the extradata is properly
stored as a 34 bytes headers, should the first packet contain the 0xFFF8
marker ? Maybe the nut spec should contain something like "extradata and
packets MUST be stored in a way that is directly decodable by reference
decoder" ?

Aurel




More information about the ffmpeg-cvslog mailing list