[FFmpeg-devel] [PATCH 2/2] avcodec/vorbisenc: Apply dynamic frame lengths

Rostislav Pehlivanov atomnuker at gmail.com
Wed Jul 26 03:01:00 EEST 2017


On 12 July 2017 at 23:18, Tyler Jones <tdjones879 at gmail.com> wrote:

> Additional codebooks are added for shorter 128-sample frames. Changes in
> codeword generation are made to handle valid values of 0 that prepend some
> codebooks, otherwise books are classified incorrectly and cause unreadable
> streams.
>
> A second residue, floor, and mapping is created for short window lengths
> so that values are partitioned correctly for transient frames.
>
> Signed-off-by: Tyler Jones <tdjones879 at gmail.com>
> ---
>  libavcodec/vorbis.c          |  10 +-
>  libavcodec/vorbis_enc_data.h | 289 +++++++++++++++++++----------
>  libavcodec/vorbisenc.c       | 422 ++++++++++++++++++++++++++----
> -------------
>  tests/fate/vorbis.mak        |   2 +-
>  4 files changed, 453 insertions(+), 270 deletions(-)
>
> diff --git a/libavcodec/vorbis.c b/libavcodec/vorbis.c
> index 399020e..8befab8 100644
> --- a/libavcodec/vorbis.c
> +++ b/libavcodec/vorbis.c
> @@ -59,7 +59,7 @@ int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes,
> unsigned num)
>      unsigned i, j, p, code;
>
>      for (p = 0; (bits[p] == 0) && (p < num); ++p)
> -        ;
> +        codes[p] = 0;
>      if (p == num)
>          return 0;
>
> @@ -78,9 +78,11 @@ int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes,
> unsigned num)
>
>      for (; p < num; ++p) {
>          if (bits[p] > 32)
> -             return AVERROR_INVALIDDATA;
> -        if (bits[p] == 0)
> -             continue;
> +            return AVERROR_INVALIDDATA;
> +        if (bits[p] == 0) {
> +            codes[p] = 0;
> +            continue;
> +        }
>

I prefer the if (!bits[p]) way of checking for 0. Most of the codebase does
so too.


>          // find corresponding exit(node which the tree can grow further
> from)
>          for (i = bits[p]; i > 0; --i)
>              if (exit_at_level[i])
> diff --git a/libavcodec/vorbis_enc_data.h b/libavcodec/vorbis_enc_data.h
> index a51aaec..eca43df 100644
> --- a/libavcodec/vorbis_enc_data.h
> +++ b/libavcodec/vorbis_enc_data.h
> @@ -23,15 +23,78 @@
>
>  #include <stdint.h>
>
> <TABLE CHANGES>
>

Could you move the tables to vorbis_data.c and delete vorbis_enc_data.h?
Would be neater.

Apart from those nits, patch would be fine for merging as well.

It improves quality in some ways however it introduces some clicking which
I believe is due to the lack of stability.
I think you can improve this by tweaking the constants in the previous
patch and by reducing the fluctuations between
transient and non-transient frames. Its better to have a whole series of
transients rather than interrupting them with non-transients, and vice
versa.


More information about the ffmpeg-devel mailing list