[FFmpeg-cvslog] r25320 - in trunk: libavcodec/avcodec.h libavcodec/dca.c libavformat/utils.c

banan subversion
Sun Oct 3 00:18:02 CEST 2010


Author: banan
Date: Sun Oct  3 00:18:02 2010
New Revision: 25320

Log:
Add the CODEC_CAP_CHANNEL_CONF capability code and add
that flag to the dca codec. This capability when set
will make sure the codec will initialize the channel
configuration instead of trusting the container. This
fixes issue 2137.

Modified:
   trunk/libavcodec/avcodec.h
   trunk/libavcodec/dca.c
   trunk/libavformat/utils.c

Modified: trunk/libavcodec/avcodec.h
==============================================================================
--- trunk/libavcodec/avcodec.h	Sat Oct  2 23:59:16 2010	(r25319)
+++ trunk/libavcodec/avcodec.h	Sun Oct  3 00:18:02 2010	(r25320)
@@ -703,6 +703,11 @@ typedef struct RcOverride{
  * encoders
  */
 #define CODEC_CAP_EXPERIMENTAL     0x0200
+/**
+ * Codec should fill in channel configuration and samplerate instead of container
+ */
+#define CODEC_CAP_CHANNEL_CONF     0x0400
+
 
 //The following defines may change, don't expect compatibility if you use them.
 #define MB_TYPE_INTRA4x4   0x0001

Modified: trunk/libavcodec/dca.c
==============================================================================
--- trunk/libavcodec/dca.c	Sat Oct  2 23:59:16 2010	(r25319)
+++ trunk/libavcodec/dca.c	Sun Oct  3 00:18:02 2010	(r25320)
@@ -1500,4 +1500,5 @@ AVCodec dca_decoder = {
     .decode = dca_decode_frame,
     .close = dca_decode_end,
     .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"),
+    .capabilities = CODEC_CAP_CHANNEL_CONF,
 };

Modified: trunk/libavformat/utils.c
==============================================================================
--- trunk/libavformat/utils.c	Sat Oct  2 23:59:16 2010	(r25319)
+++ trunk/libavformat/utils.c	Sun Oct  3 00:18:02 2010	(r25320)
@@ -2167,6 +2167,7 @@ int av_find_stream_info(AVFormatContext 
     } info[MAX_STREAMS] = {{0}};
 
     for(i=0;i<ic->nb_streams;i++) {
+        AVCodec *codec;
         st = ic->streams[i];
         if (st->codec->codec_id == CODEC_ID_AAC) {
             st->codec->sample_rate = 0;
@@ -2187,9 +2188,17 @@ int av_find_stream_info(AVFormatContext 
             }
         }
         assert(!st->codec->codec);
+        codec = avcodec_find_decoder(st->codec->codec_id);
+
+        /* Force decoding of at least one frame of codec data
+         * this makes sure the codec initializes the channel configuration
+         * and does not trust the values from the container.
+         */
+        if (codec && codec->capabilities & CODEC_CAP_CHANNEL_CONF)
+            st->codec->channels = 0;
+
         //try to just open decoders, in case this is enough to get parameters
         if(!has_codec_parameters(st->codec)){
-            AVCodec *codec = avcodec_find_decoder(st->codec->codec_id);
             if (codec)
                 avcodec_open(st->codec, codec);
         }



More information about the ffmpeg-cvslog mailing list