diff --git a/libavcodec/opus_pvq.c b/libavcodec/opus_pvq.c index 9c21d67298..a4ab7c46eb 100644 --- a/libavcodec/opus_pvq.c +++ b/libavcodec/opus_pvq.c @@ -627,7 +627,7 @@ static av_always_inline uint32_t quant_band_template(CeltPVQ *pvq, CeltFrame *f, } } else if (stereo) { if (quant) { - inv = itheta > 8192; + inv = f->apply_phase_inv ? itheta > 8192 : 0; if (inv) { for (i = 0; i < N; i++) Y[i] *= -1; diff --git a/libavcodec/opusenc.c b/libavcodec/opusenc.c index 3c08ebcf69..953749af3a 100644 --- a/libavcodec/opusenc.c +++ b/libavcodec/opusenc.c @@ -691,7 +691,7 @@ static av_cold int opus_encode_init(AVCodecContext *avctx) s->frame[i].avctx = s->avctx; s->frame[i].seed = 0; s->frame[i].pvq = s->pvq; - s->frame[i].apply_phase_inv = 1; + s->frame[i].apply_phase_inv = s->options.apply_phase_inv; s->frame[i].block[0].emph_coeff = s->frame[i].block[1].emph_coeff = 0.0f; } @@ -701,6 +701,7 @@ static av_cold int opus_encode_init(AVCodecContext *avctx) #define OPUSENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM static const AVOption opusenc_options[] = { { "opus_delay", "Maximum delay in milliseconds", offsetof(OpusEncContext, options.max_delay_ms), AV_OPT_TYPE_FLOAT, { .dbl = OPUS_MAX_LOOKAHEAD }, 2.5f, OPUS_MAX_LOOKAHEAD, OPUSENC_FLAGS, "max_delay_ms" }, + { "apply_phase_inv", "Apply intensity stereo phase inversion", offsetof(OpusEncContext, options.apply_phase_inv), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, OPUSENC_FLAGS, "apply_phase_inv" }, { NULL }, }; diff --git a/libavcodec/opusenc.h b/libavcodec/opusenc.h index b9162ebec6..b623b3e948 100644 --- a/libavcodec/opusenc.h +++ b/libavcodec/opusenc.h @@ -42,6 +42,7 @@ typedef struct OpusEncOptions { float max_delay_ms; + int apply_phase_inv; } OpusEncOptions; typedef struct OpusPacketInfo {