X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Faacenc.c;h=e9f6e2ffbfeb93b6d76437e1930943dc6e505a2b;hb=9a07c1332cfe092b57b5758f22b686ca58806c60;hp=e4fbf0304b1d567d3672ab2514cc88f598e6d058;hpb=124134e42455763b28cc346fed1d07017a76e84e;p=ffmpeg diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index e4fbf0304b1..e9f6e2ffbfe 100644 --- a/libavcodec/aacenc.c +++ b/libavcodec/aacenc.c @@ -302,7 +302,7 @@ static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe) /** * Produce integer coefficients from scalefactors provided by the model. */ -static void adjust_frame_information(AACEncContext *apc, ChannelElement *cpe, int chans) +static void adjust_frame_information(ChannelElement *cpe, int chans) { int i, w, w2, g, ch; int start, maxsfb, cmaxsfb; @@ -460,8 +460,7 @@ static int encode_individual_channel(AVCodecContext *avctx, AACEncContext *s, /** * Write some auxiliary information about the created AAC file. */ -static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, - const char *name) +static void put_bitstream_info(AACEncContext *s, const char *name) { int i, namelen, padbits; @@ -479,31 +478,28 @@ static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s, } /* - * Deinterleave input samples. + * Copy input samples. * Channels are reordered from Libav's default order to AAC order. */ -static void deinterleave_input_samples(AACEncContext *s, const AVFrame *frame) +static void copy_input_samples(AACEncContext *s, const AVFrame *frame) { - int ch, i; - const int sinc = s->channels; - const uint8_t *channel_map = aac_chan_maps[sinc - 1]; + int ch; + int end = 2048 + (frame ? frame->nb_samples : 0); + const uint8_t *channel_map = aac_chan_maps[s->channels - 1]; - /* deinterleave and remap input samples */ - for (ch = 0; ch < sinc; ch++) { + /* copy and remap input samples */ + for (ch = 0; ch < s->channels; ch++) { /* copy last 1024 samples of previous frame to the start of the current frame */ memcpy(&s->planar_samples[ch][1024], &s->planar_samples[ch][2048], 1024 * sizeof(s->planar_samples[0][0])); - /* deinterleave */ - i = 2048; + /* copy new samples and zero any remaining samples */ if (frame) { - const float *sptr = ((const float *)frame->data[0]) + channel_map[ch]; - for (; i < 2048 + frame->nb_samples; i++) { - s->planar_samples[ch][i] = *sptr; - sptr += sinc; - } + memcpy(&s->planar_samples[ch][2048], + frame->extended_data[channel_map[ch]], + frame->nb_samples * sizeof(s->planar_samples[0][0])); } - memset(&s->planar_samples[ch][i], 0, - (3072 - i) * sizeof(s->planar_samples[0][0])); + memset(&s->planar_samples[ch][end], 0, + (3072 - end) * sizeof(s->planar_samples[0][0])); } } @@ -526,7 +522,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, return ret; } - deinterleave_input_samples(s, frame); + copy_input_samples(s, frame); if (s->psypp) ff_psy_preprocess(s->psypp, s->planar_samples, s->channels); @@ -587,7 +583,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, init_put_bits(&s->pb, avpkt->data, avpkt->size); if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) - put_bitstream_info(avctx, s, LIBAVCODEC_IDENT); + put_bitstream_info(s, LIBAVCODEC_IDENT); start_ch = 0; memset(chan_el_counter, 0, sizeof(chan_el_counter)); for (i = 0; i < s->chan_map[0]; i++) { @@ -629,7 +625,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, s->coder->search_for_ms(s, cpe, s->lambda); } } - adjust_frame_information(s, cpe, chans); + adjust_frame_information(cpe, chans); if (chans == 2) { put_bits(&s->pb, 1, cpe->common_window); if (cpe->common_window) { @@ -802,7 +798,7 @@ fail: #define AACENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM static const AVOption aacenc_options[] = { - {"stereo_mode", "Stereo coding method", offsetof(AACEncContext, options.stereo_mode), AV_OPT_TYPE_INT, {.dbl = 0}, -1, 1, AACENC_FLAGS, "stereo_mode"}, + {"stereo_mode", "Stereo coding method", offsetof(AACEncContext, options.stereo_mode), AV_OPT_TYPE_INT, {.i64 = 0}, -1, 1, AACENC_FLAGS, "stereo_mode"}, {"auto", "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.i64 = -1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"}, {"ms_off", "Disable Mid/Side coding", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"}, {"ms_force", "Force Mid/Side for the whole frame if possible", 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"}, @@ -826,7 +822,7 @@ AVCodec ff_aac_encoder = { .close = aac_encode_end, .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL, - .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLT, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"), .priv_class = &aacenc_class,