]> git.sesse.net Git - vlc/commitdiff
AVCodec : Allow delayed opening of audio codecs.
authorJai Menon <jmenon86@gmail.com>
Thu, 5 Aug 2010 10:48:18 +0000 (16:18 +0530)
committerJean-Baptiste Kempf <jb@videolan.org>
Mon, 9 Aug 2010 20:21:43 +0000 (22:21 +0200)
Additionally, enable delayed opening for AAC which fixes decoding
of media where we rely on decoder configuration being supplied by
the packetizer instead of the container.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/codec/avcodec/audio.c
modules/codec/avcodec/avcodec.c

index 483c3067c84515774f7747c3b45705de54cfad2c..8e35ffabe054a9d5a63a471fcffb0b6715a97638 100644 (file)
@@ -159,7 +159,7 @@ int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
     p_sys->p_codec = p_codec;
     p_sys->i_codec_id = i_codec_id;
     p_sys->psz_namecodec = psz_namecodec;
-    p_sys->b_delayed_open = false;
+    p_sys->b_delayed_open = true;
 
     // Initialize decoder extradata
     InitDecoderConfig( p_dec, p_context);
@@ -265,6 +265,19 @@ aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
 
     p_block = *pp_block;
 
+    if( !p_sys->p_context->extradata_size && p_dec->fmt_in.i_extra &&
+        p_sys->b_delayed_open)
+    {
+        InitDecoderConfig( p_dec, p_sys->p_context);
+        if( ffmpeg_OpenCodec( p_dec ) )
+            msg_Err( p_dec, "Cannot open decoder %s", p_sys->psz_namecodec );
+    }
+    if( p_sys->b_delayed_open )
+    {
+        block_Release( p_block );
+        return NULL;
+    }
+
     if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
     {
         block_Release( p_block );
index 9b54976087d0bdd66fab064d237844013427486a..a09be391a8bd50cd62c5ad710867fb965658002b 100644 (file)
@@ -409,7 +409,8 @@ int ffmpeg_OpenCodec( decoder_t *p_dec )
     {
         if( p_sys->i_codec_id == CODEC_ID_VC1 ||
             p_sys->i_codec_id == CODEC_ID_VORBIS ||
-            p_sys->i_codec_id == CODEC_ID_THEORA )
+            p_sys->i_codec_id == CODEC_ID_THEORA ||
+            p_sys->i_codec_id == CODEC_ID_AAC )
         {
             msg_Warn( p_dec, "waiting for extra data for codec %s",
                       p_sys->psz_namecodec );