static int setup_format(sh_audio_t *sh_audio, const AVCodecContext *lavc_context) { int broken_srate = 0; int samplerate = lavc_context->sample_rate; int sample_format = samplefmt2affmt(lavc_context->sample_fmt); if (!sample_format) sample_format = sh_audio->sample_format; if(sh_audio->wf){ // If the decoder uses the wrong number of channels all is lost anyway. // sh_audio->channels=sh_audio->wf->nChannels; if (lavc_context->codec_id == CODEC_ID_AAC && samplerate == 2*sh_audio->wf->nSamplesPerSec) { broken_srate = 1; } else if (sh_audio->wf->nSamplesPerSec) samplerate=sh_audio->wf->nSamplesPerSec; } if (lavc_context->channels != sh_audio->channels || samplerate != sh_audio->samplerate || sample_format != sh_audio->sample_format) { sh_audio->channels=lavc_context->channels; sh_audio->samplerate=samplerate; sh_audio->sample_format = sample_format; sh_audio->samplesize=af_fmt2bits(sh_audio->sample_format)/ 8; if (broken_srate) mp_msg(MSGT_DECAUDIO, MSGL_WARN, "Ignoring broken container sample rate for AAC with SBR\n"); return 1; } return 0; }
int mpae_init_lavc(audio_encoder_t *encoder) { encoder->params.samples_per_frame = encoder->params.sample_rate; encoder->params.bitrate = encoder->params.sample_rate * encoder->params.channels * 2 * 8; if(!lavc_param_acodec) { mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName); return 0; } init_avcodec(); lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec); if (!lavc_acodec) { mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec); return 0; } if(lavc_param_atag == 0) { lavc_param_atag = mp_codec_id2tag(lavc_acodec->id, 0, 1); if(!lavc_param_atag) { mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n"); return 0; } } lavc_actx = avcodec_alloc_context3(lavc_acodec); if(lavc_actx == NULL) { mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntAllocateLavcContext); return 0; } lavc_actx->codec_id = lavc_acodec->id; // put sample parameters lavc_actx->sample_fmt = AV_SAMPLE_FMT_S16; if (lavc_acodec->sample_fmts) { const enum AVSampleFormat *fmts; lavc_actx->sample_fmt = lavc_acodec->sample_fmts[0]; // fallback to first format for (fmts = lavc_acodec->sample_fmts; *fmts != AV_SAMPLE_FMT_NONE; fmts++) { if (samplefmt2affmt(*fmts) == encoder->params.sample_format) { // preferred format found lavc_actx->sample_fmt = *fmts; break; } } } encoder->input_format = samplefmt2affmt(lavc_actx->sample_fmt); lavc_actx->channels = encoder->params.channels; lavc_actx->sample_rate = encoder->params.sample_rate; lavc_actx->time_base.num = 1; lavc_actx->time_base.den = encoder->params.sample_rate; if(lavc_param_abitrate<1000) lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate * 1000; else lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate; if(lavc_param_audio_avopt){ if(parse_avopts(lavc_actx, lavc_param_audio_avopt) < 0){ mp_msg(MSGT_MENCODER,MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", lavc_param_audio_avopt); return 0; } } /* * Special case for adpcm_ima_wav. * The bitrate is only dependent on samplerate. * We have to known frame_size and block_align in advance, * so I just copied the code from libavcodec/adpcm.c * * However, ms adpcm_ima_wav uses a block_align of 2048, * lavc defaults to 1024 */ if(lavc_param_atag == 0x11) { int blkalign = 2048; int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1; lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize; } if((lavc_param_audio_global_header&1) /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){ lavc_actx->flags |= CODEC_FLAG_GLOBAL_HEADER; } if(lavc_param_audio_global_header&2){ lavc_actx->flags2 |= CODEC_FLAG2_LOCAL_HEADER; } if(avcodec_open2(lavc_actx, lavc_acodec, NULL) < 0) { mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate); return 0; } if(lavc_param_atag == 0x11) { lavc_actx->block_align = 2048; lavc_actx->frame_size = (lavc_actx->block_align - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1; } encoder->decode_buffer_size = lavc_actx->frame_size * av_get_bytes_per_sample(lavc_actx->sample_fmt) * encoder->params.channels; while (encoder->decode_buffer_size < 1024) encoder->decode_buffer_size *= 2; encoder->bind = bind_lavc; encoder->get_frame_size = get_frame_size; encoder->encode = encode_lavc; encoder->close = close_lavc; return 1; }