diff mbox

[FFmpeg-devel,3/3] avcodec/vorbisenc: Stop tracking number of samples per frame

Message ID 20170614205907.GA24190@tdjones879
State Accepted
Commit 752dd1952a7b68094f8b2d5da0ca0df94190cf0e
Headers show

Commit Message

Tyler Jones June 14, 2017, 8:59 p.m. UTC
Each frame is now padded with 0 values if not enough samples are
present, and all frames are guaranteed to have exactly
1 << (venc->log2_blocksize[1] - 1) samples.

Signed-off-by: Tyler Jones <tdjones879@gmail.com>
---
 libavcodec/vorbisenc.c | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

Comments

Rostislav Pehlivanov June 15, 2017, 3:45 p.m. UTC | #1
On 14 June 2017 at 21:59, Tyler Jones <tdjones879@gmail.com> wrote:

> Each frame is now padded with 0 values if not enough samples are
> present, and all frames are guaranteed to have exactly
> 1 << (venc->log2_blocksize[1] - 1) samples.
>
> Signed-off-by: Tyler Jones <tdjones879@gmail.com>
> ---
>  libavcodec/vorbisenc.c | 33 ++++++++++++++++-----------------
>  1 file changed, 16 insertions(+), 17 deletions(-)
>
> diff --git a/libavcodec/vorbisenc.c b/libavcodec/vorbisenc.c
> index 14de803..bf21a3b 100644
> --- a/libavcodec/vorbisenc.c
> +++ b/libavcodec/vorbisenc.c
> @@ -997,7 +997,7 @@ static int residue_encode(vorbis_enc_context *venc,
> vorbis_enc_residue *rc,
>      return 0;
>  }
>
> -static int apply_window_and_mdct(vorbis_enc_context *venc, int samples)
> +static int apply_window_and_mdct(vorbis_enc_context *venc)
>  {
>      int channel;
>      const float * win = venc->win[1];
> @@ -1008,13 +1008,13 @@ static int apply_window_and_mdct(vorbis_enc_context
> *venc, int samples)
>      for (channel = 0; channel < venc->channels; channel++) {
>          float *offset = venc->samples + channel * window_len * 2;
>
> -        fdsp->vector_fmul(offset, offset, win, samples);
> -        fdsp->vector_fmul_scalar(offset, offset, 1/n, samples);
> +        fdsp->vector_fmul(offset, offset, win, window_len);
> +        fdsp->vector_fmul_scalar(offset, offset, 1/n, window_len);
>
>          offset += window_len;
>
> -        fdsp->vector_fmul_reverse(offset, offset, win, samples);
> -        fdsp->vector_fmul_scalar(offset, offset, 1/n, samples);
> +        fdsp->vector_fmul_reverse(offset, offset, win, window_len);
> +        fdsp->vector_fmul_scalar(offset, offset, 1/n, window_len);
>
>          venc->mdct[1].mdct_calc(&venc->mdct[1], venc->coeffs + channel *
> window_len,
>                       venc->samples + channel * window_len * 2);
> @@ -1047,7 +1047,7 @@ static AVFrame *spawn_empty_frame(AVCodecContext
> *avctx, int channels)
>  }
>
>  /* Set up audio samples for psy analysis and window/mdct */
> -static void move_audio(vorbis_enc_context *venc, int *samples, int
> sf_size)
> +static void move_audio(vorbis_enc_context *venc, int sf_size)
>  {
>      AVFrame *cur = NULL;
>      int frame_size = 1 << (venc->log2_blocksize[1] - 1);
> @@ -1065,7 +1065,6 @@ static void move_audio(vorbis_enc_context *venc, int
> *samples, int sf_size)
>
>      for (sf = 0; sf < subframes; sf++) {
>          cur = ff_bufqueue_get(&venc->bufqueue);
> -        *samples += cur->nb_samples;
>
>          for (ch = 0; ch < venc->channels; ch++) {
>              float *offset = venc->samples + 2 * ch * frame_size +
> frame_size;
> @@ -1087,7 +1086,7 @@ static int vorbis_encode_frame(AVCodecContext
> *avctx, AVPacket *avpkt,
>  {
>      vorbis_enc_context *venc = avctx->priv_data;
>      int i, ret, need_more;
> -    int samples = 0, frame_size = 1 << (venc->log2_blocksize[1] - 1);
> +    int frame_size = 1 << (venc->log2_blocksize[1] - 1);
>      vorbis_enc_mode *mode;
>      vorbis_enc_mapping *mapping;
>      PutBitContext pb;
> @@ -1120,9 +1119,9 @@ static int vorbis_encode_frame(AVCodecContext
> *avctx, AVPacket *avpkt,
>          }
>      }
>
> -    move_audio(venc, &samples, avctx->frame_size);
> +    move_audio(venc, avctx->frame_size);
>
> -    if (!apply_window_and_mdct(venc, samples))
> +    if (!apply_window_and_mdct(venc))
>          return 0;
>
>      if ((ret = ff_alloc_packet2(avctx, avpkt, 8192, 0)) < 0)
> @@ -1149,21 +1148,21 @@ static int vorbis_encode_frame(AVCodecContext
> *avctx, AVPacket *avpkt,
>      for (i = 0; i < venc->channels; i++) {
>          vorbis_enc_floor *fc = &venc->floors[mapping->floor[
> mapping->mux[i]]];
>          uint16_t posts[MAX_FLOOR_VALUES];
> -        floor_fit(venc, fc, &venc->coeffs[i * samples], posts, samples);
> -        if (floor_encode(venc, fc, &pb, posts, &venc->floor[i * samples],
> samples)) {
> +        floor_fit(venc, fc, &venc->coeffs[i * frame_size], posts,
> frame_size);
> +        if (floor_encode(venc, fc, &pb, posts, &venc->floor[i *
> frame_size], frame_size)) {
>              av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
>              return AVERROR(EINVAL);
>          }
>      }
>
> -    for (i = 0; i < venc->channels * samples; i++)
> +    for (i = 0; i < venc->channels * frame_size; i++)
>          venc->coeffs[i] /= venc->floor[i];
>
>      for (i = 0; i < mapping->coupling_steps; i++) {
> -        float *mag = venc->coeffs + mapping->magnitude[i] * samples;
> -        float *ang = venc->coeffs + mapping->angle[i]     * samples;
> +        float *mag = venc->coeffs + mapping->magnitude[i] * frame_size;
> +        float *ang = venc->coeffs + mapping->angle[i]     * frame_size;
>          int j;
> -        for (j = 0; j < samples; j++) {
> +        for (j = 0; j < frame_size; j++) {
>              float a = ang[j];
>              ang[j] -= mag[j];
>              if (mag[j] > 0)
> @@ -1174,7 +1173,7 @@ static int vorbis_encode_frame(AVCodecContext
> *avctx, AVPacket *avpkt,
>      }
>
>      if (residue_encode(venc, &venc->residues[mapping->
> residue[mapping->mux[0]]],
> -                       &pb, venc->coeffs, samples, venc->channels)) {
> +                       &pb, venc->coeffs, frame_size, venc->channels)) {
>          av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
>          return AVERROR(EINVAL);
>      }
> --
> 2.7.4
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
Pushed all 3 patches, thanks
diff mbox

Patch

diff --git a/libavcodec/vorbisenc.c b/libavcodec/vorbisenc.c
index 14de803..bf21a3b 100644
--- a/libavcodec/vorbisenc.c
+++ b/libavcodec/vorbisenc.c
@@ -997,7 +997,7 @@  static int residue_encode(vorbis_enc_context *venc, vorbis_enc_residue *rc,
     return 0;
 }
 
-static int apply_window_and_mdct(vorbis_enc_context *venc, int samples)
+static int apply_window_and_mdct(vorbis_enc_context *venc)
 {
     int channel;
     const float * win = venc->win[1];
@@ -1008,13 +1008,13 @@  static int apply_window_and_mdct(vorbis_enc_context *venc, int samples)
     for (channel = 0; channel < venc->channels; channel++) {
         float *offset = venc->samples + channel * window_len * 2;
 
-        fdsp->vector_fmul(offset, offset, win, samples);
-        fdsp->vector_fmul_scalar(offset, offset, 1/n, samples);
+        fdsp->vector_fmul(offset, offset, win, window_len);
+        fdsp->vector_fmul_scalar(offset, offset, 1/n, window_len);
 
         offset += window_len;
 
-        fdsp->vector_fmul_reverse(offset, offset, win, samples);
-        fdsp->vector_fmul_scalar(offset, offset, 1/n, samples);
+        fdsp->vector_fmul_reverse(offset, offset, win, window_len);
+        fdsp->vector_fmul_scalar(offset, offset, 1/n, window_len);
 
         venc->mdct[1].mdct_calc(&venc->mdct[1], venc->coeffs + channel * window_len,
                      venc->samples + channel * window_len * 2);
@@ -1047,7 +1047,7 @@  static AVFrame *spawn_empty_frame(AVCodecContext *avctx, int channels)
 }
 
 /* Set up audio samples for psy analysis and window/mdct */
-static void move_audio(vorbis_enc_context *venc, int *samples, int sf_size)
+static void move_audio(vorbis_enc_context *venc, int sf_size)
 {
     AVFrame *cur = NULL;
     int frame_size = 1 << (venc->log2_blocksize[1] - 1);
@@ -1065,7 +1065,6 @@  static void move_audio(vorbis_enc_context *venc, int *samples, int sf_size)
 
     for (sf = 0; sf < subframes; sf++) {
         cur = ff_bufqueue_get(&venc->bufqueue);
-        *samples += cur->nb_samples;
 
         for (ch = 0; ch < venc->channels; ch++) {
             float *offset = venc->samples + 2 * ch * frame_size + frame_size;
@@ -1087,7 +1086,7 @@  static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
 {
     vorbis_enc_context *venc = avctx->priv_data;
     int i, ret, need_more;
-    int samples = 0, frame_size = 1 << (venc->log2_blocksize[1] - 1);
+    int frame_size = 1 << (venc->log2_blocksize[1] - 1);
     vorbis_enc_mode *mode;
     vorbis_enc_mapping *mapping;
     PutBitContext pb;
@@ -1120,9 +1119,9 @@  static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
         }
     }
 
-    move_audio(venc, &samples, avctx->frame_size);
+    move_audio(venc, avctx->frame_size);
 
-    if (!apply_window_and_mdct(venc, samples))
+    if (!apply_window_and_mdct(venc))
         return 0;
 
     if ((ret = ff_alloc_packet2(avctx, avpkt, 8192, 0)) < 0)
@@ -1149,21 +1148,21 @@  static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
     for (i = 0; i < venc->channels; i++) {
         vorbis_enc_floor *fc = &venc->floors[mapping->floor[mapping->mux[i]]];
         uint16_t posts[MAX_FLOOR_VALUES];
-        floor_fit(venc, fc, &venc->coeffs[i * samples], posts, samples);
-        if (floor_encode(venc, fc, &pb, posts, &venc->floor[i * samples], samples)) {
+        floor_fit(venc, fc, &venc->coeffs[i * frame_size], posts, frame_size);
+        if (floor_encode(venc, fc, &pb, posts, &venc->floor[i * frame_size], frame_size)) {
             av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
             return AVERROR(EINVAL);
         }
     }
 
-    for (i = 0; i < venc->channels * samples; i++)
+    for (i = 0; i < venc->channels * frame_size; i++)
         venc->coeffs[i] /= venc->floor[i];
 
     for (i = 0; i < mapping->coupling_steps; i++) {
-        float *mag = venc->coeffs + mapping->magnitude[i] * samples;
-        float *ang = venc->coeffs + mapping->angle[i]     * samples;
+        float *mag = venc->coeffs + mapping->magnitude[i] * frame_size;
+        float *ang = venc->coeffs + mapping->angle[i]     * frame_size;
         int j;
-        for (j = 0; j < samples; j++) {
+        for (j = 0; j < frame_size; j++) {
             float a = ang[j];
             ang[j] -= mag[j];
             if (mag[j] > 0)
@@ -1174,7 +1173,7 @@  static int vorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
     }
 
     if (residue_encode(venc, &venc->residues[mapping->residue[mapping->mux[0]]],
-                       &pb, venc->coeffs, samples, venc->channels)) {
+                       &pb, venc->coeffs, frame_size, venc->channels)) {
         av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
         return AVERROR(EINVAL);
     }