mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-27 21:40:34 +00:00
Add support for aac streams in mp4/mov without extradata.
This commit is contained in:
parent
4bfe064460
commit
dafaef2fe1
@ -530,6 +530,22 @@ static void reset_all_predictors(PredictorState *ps)
|
||||
reset_predict_state(&ps[i]);
|
||||
}
|
||||
|
||||
static int sample_rate_idx (int rate)
|
||||
{
|
||||
if (92017 <= rate) return 0;
|
||||
else if (75132 <= rate) return 1;
|
||||
else if (55426 <= rate) return 2;
|
||||
else if (46009 <= rate) return 3;
|
||||
else if (37566 <= rate) return 4;
|
||||
else if (27713 <= rate) return 5;
|
||||
else if (23004 <= rate) return 6;
|
||||
else if (18783 <= rate) return 7;
|
||||
else if (13856 <= rate) return 8;
|
||||
else if (11502 <= rate) return 9;
|
||||
else if (9391 <= rate) return 10;
|
||||
else return 11;
|
||||
}
|
||||
|
||||
static void reset_predictor_group(PredictorState *ps, int group_num)
|
||||
{
|
||||
int i;
|
||||
@ -552,10 +568,33 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
|
||||
ac->m4ac.sample_rate = avctx->sample_rate;
|
||||
|
||||
if (avctx->extradata_size > 0) {
|
||||
avctx->channels = 0;
|
||||
avctx->frame_size = 0;
|
||||
avctx->sample_rate = 0;
|
||||
if (decode_audio_specific_config(ac, ac->avctx, &ac->m4ac,
|
||||
avctx->extradata,
|
||||
avctx->extradata_size) < 0)
|
||||
return -1;
|
||||
} else {
|
||||
int sr, i;
|
||||
enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
|
||||
|
||||
sr = sample_rate_idx(avctx->sample_rate);
|
||||
ac->m4ac.sampling_index = sr;
|
||||
ac->m4ac.channels = avctx->channels;
|
||||
|
||||
for (i = 0; i < FF_ARRAY_ELEMS(ff_mpeg4audio_channels); i++)
|
||||
if (ff_mpeg4audio_channels[i] == avctx->channels)
|
||||
break;
|
||||
if (i == FF_ARRAY_ELEMS(ff_mpeg4audio_channels)) {
|
||||
i = 0;
|
||||
}
|
||||
ac->m4ac.chan_config = i;
|
||||
|
||||
if (ac->m4ac.chan_config) {
|
||||
set_default_channel_config(avctx, new_che_pos, ac->m4ac.chan_config);
|
||||
output_configure(ac, ac->che_pos, new_che_pos, ac->m4ac.chan_config, OC_GLOBAL_HDR);
|
||||
}
|
||||
}
|
||||
|
||||
if (avctx->request_sample_fmt == AV_SAMPLE_FMT_FLT) {
|
||||
@ -2047,6 +2086,7 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
|
||||
if (output_configure(ac, ac->che_pos, new_che_pos, hdr_info.chan_config, OC_TRIAL_FRAME))
|
||||
return -7;
|
||||
} else if (ac->output_configured != OC_LOCKED) {
|
||||
ac->m4ac.chan_config = 0;
|
||||
ac->output_configured = OC_NONE;
|
||||
}
|
||||
if (ac->output_configured != OC_LOCKED) {
|
||||
@ -2514,6 +2554,7 @@ AVCodec ff_aac_decoder = {
|
||||
.sample_fmts = (const enum AVSampleFormat[]) {
|
||||
AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE
|
||||
},
|
||||
.capabilities = CODEC_CAP_CHANNEL_CONF,
|
||||
.channel_layouts = aac_channel_layout,
|
||||
};
|
||||
|
||||
@ -2534,5 +2575,6 @@ AVCodec ff_aac_latm_decoder = {
|
||||
.sample_fmts = (const enum AVSampleFormat[]) {
|
||||
AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE
|
||||
},
|
||||
.capabilities = CODEC_CAP_CHANNEL_CONF,
|
||||
.channel_layouts = aac_channel_layout,
|
||||
};
|
||||
|
@ -2207,11 +2207,7 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
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;
|
||||
st->codec->frame_size = 0;
|
||||
st->codec->channels = 0;
|
||||
}
|
||||
|
||||
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
|
||||
/* if(!st->time_base.num)
|
||||
@ -2229,13 +2225,6 @@ 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;
|
||||
|
||||
/* Ensure that subtitle_header is properly set. */
|
||||
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
|
||||
&& codec && !st->codec->codec)
|
||||
@ -2377,8 +2366,16 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
/* if still no information, we try to open the codec and to
|
||||
decompress the frame. We try to avoid that in most cases as
|
||||
it takes longer and uses more memory. For MPEG-4, we need to
|
||||
decompress for QuickTime. */
|
||||
if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
|
||||
decompress for QuickTime.
|
||||
|
||||
If CODEC_CAP_CHANNEL_CONF is set this will force decoding of at
|
||||
least one frame of codec data, this makes sure the codec initializes
|
||||
the channel configuration and does not only trust the values from the container.
|
||||
*/
|
||||
if (!has_codec_parameters(st->codec) ||
|
||||
!has_decode_delay_been_guessed(st) ||
|
||||
(st->codec->codec &&
|
||||
st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))
|
||||
try_decode_frame(st, pkt);
|
||||
|
||||
st->codec_info_nb_frames++;
|
||||
|
Loading…
Reference in New Issue
Block a user