[FFmpeg-devel] [PATCH V3 1/2] avcodec/vorbisenc: Add pre-echo detection
James Almer
jamrial at gmail.com
Fri Jul 28 18:51:07 EEST 2017
On 7/28/2017 11:59 AM, Tyler Jones wrote:
>>> --- a/libavcodec/vorbisenc.c
>>> +++ b/libavcodec/vorbisenc.c
>>> @@ -33,6 +33,7 @@
>>> #include "mathops.h"
>>> #include "vorbis.h"
>>> #include "vorbis_enc_data.h"
>>> +#include "vorbispsy.h"
>>>
>>> #include "audio_frame_queue.h"
>>> #include "libavfilter/bufferqueue.h"
>>> @@ -136,6 +137,7 @@ typedef struct vorbis_enc_context {
>>> int64_t next_pts;
>>>
>>> AVFloatDSPContext *fdsp;
>>> + VorbisPsyContext *vpctx;
>>
>> Why a pointer? I don't see the benefit. It means an unnecessary malloc
>> and free call.
>
> You're probably right. It's changed now.
>
>>> @@ -1252,6 +1270,7 @@ static av_cold int vorbis_encode_close(AVCodecContext *avctx)
>>> ff_mdct_end(&venc->mdct[1]);
>>> ff_af_queue_close(&venc->afq);
>>> ff_bufqueue_discard_all(&venc->bufqueue);
>>> + ff_psy_vorbis_close(venc->vpctx);
>>
>> You should pass a pointer to venc->vpctx instead, regardless of what you
>> do with the comment above.
>
> I'm not sure I understand what you mean. It is passing a pointer to a
> VorbisPsyContext, please see the prototype:
>
> av_cold void ff_psy_vorbis_close(VorbisPsyContext *vpctx);
For this version (but not V4) it should have been a pointer to the
pointer in vorbis_enc_context, that is **vpctx. Otherwise, the
av_freep() call in ff_psy_vorbis_close() would have zeroed a copy of
said pointer.
>
>>> +/**
>>> + * Calculate the variance of a block of samples
>>> + *
>>> + * @param in Array of input samples
>>> + * @param length Number of input samples being analyzed
>>> + * @return The variance for the current block
>>> + */
>>> +static float variance(const float *in, int length)
>>> +{
>>> + int i;
>>> + float mean = 0.0f, square_sum = 0.0f;
>>> +
>>> + for (i = 0; i < length; i++) {
>>> + mean += in[i];
>>> + square_sum += in[i] * in[i];
>>
>> Can't you use AVFloatDSPContext's scalarproduct_float for square_sum?
>> The constrains are lax. 16 byte alignment for in and length a multiple
>> of 4. You can pad the buffer if needed to achieve that.
>
> You are correct, it is switched over now.
>
>>> + }
>>> +
>>> + mean /= length;
>>> + return (square_sum - length * mean * mean) / (length - 1);
>>> +}
>>> +
>>> +av_cold int ff_psy_vorbis_init(VorbisPsyContext *vpctx, int sample_rate,
>>> + int channels, int blocks)
>>> +{
>>> + int crit_freq;
>>> + float Q[2] = {.54, 1.31}; // Quality values for maximally flat cascaded filters
>>
>> const float Q[2]
>
> Fixed.
>
> Thank you for catching these mistakes and providing suggestions. A new version
> of this patch will be sent soon.
>
> Thanks again,
>
> Tyler Jones
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list