X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fevrcdec.c;h=cb1b509a61dfff89224b1604f01e04902ee94d6c;hb=e72988d3f804fbcf628fa95cb7374ac05ae61d84;hp=c605a13d745a72e308d50bfa7a2b0cd11e2a275e;hpb=00ebf89dcdeb0587eba80ebd634591873f64624a;p=ffmpeg diff --git a/libavcodec/evrcdec.c b/libavcodec/evrcdec.c index c605a13d745..cb1b509a61d 100644 --- a/libavcodec/evrcdec.c +++ b/libavcodec/evrcdec.c @@ -26,6 +26,7 @@ */ #include "libavutil/mathematics.h" +#include "libavutil/opt.h" #include "avcodec.h" #include "internal.h" #include "get_bits.h" @@ -66,6 +67,10 @@ typedef struct EVRCAFrame { } EVRCAFrame; typedef struct EVRCContext { + AVClass *class; + + int postfilter; + GetBitContext gb; evrc_packet_rate bitrate; evrc_packet_rate last_valid_bitrate; @@ -876,9 +881,11 @@ static int evrc_decode_frame(AVCodecContext *avctx, void *data, memmove(e->pitch, e->pitch + subframe_size, ACB_SIZE * sizeof(float)); synthesis_filter(e->pitch + ACB_SIZE, ilpc, - e->synthesis, subframe_size, tmp); - postfilter(e, tmp, ilpc, samples, pitch_lag, - &postfilter_coeffs[e->bitrate], subframe_size); + e->synthesis, subframe_size, + e->postfilter ? tmp : samples); + if (e->postfilter) + postfilter(e, tmp, ilpc, samples, pitch_lag, + &postfilter_coeffs[e->bitrate], subframe_size); samples += subframe_size; } @@ -906,6 +913,21 @@ erasure: return avpkt->size; } +#define OFFSET(x) offsetof(EVRCContext, x) +#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM + +static const AVOption options[] = { + { "postfilter", "enable postfilter", OFFSET(postfilter), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, AD }, + { NULL } +}; + +static const AVClass evrcdec_class = { + .class_name = "evrc", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + AVCodec ff_evrc_decoder = { .name = "evrc", .long_name = NULL_IF_CONFIG_SMALL("EVRC (Enhanced Variable Rate Codec)"), @@ -915,4 +937,5 @@ AVCodec ff_evrc_decoder = { .decode = evrc_decode_frame, .capabilities = CODEC_CAP_DR1, .priv_data_size = sizeof(EVRCContext), + .priv_class = &evrcdec_class, };