mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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 and issue 850. Originally committed as revision 25320 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
ae8c28db87
commit
62784e3733
@ -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
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -2167,6 +2167,7 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
} 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 *ic)
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user