[FFmpeg-devel] [PATCH][RFC] avcodec/aacsbr_template: replace qsort with AV_QSORT

Ganesh Ajjanagadde gajjanagadde at gmail.com
Tue Nov 3 15:06:17 CET 2015


On Tue, Oct 27, 2015 at 9:38 PM, Ganesh Ajjanagadde
<gajjanagadde at gmail.com> wrote:
> When sbr->reset is set in encode_frame, a bunch of qsort calls might get made.
> Thus, there is the potential of calling qsort whenever the spectral
> contents change.
>
> AV_QSORT is substantially faster due to the inlining of the comparison callback.
> Thus, the increase in performance should be worth the increase in binary size.
>
> Tested with FATE.
>
> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
>
> --------------------------------------------------------------------------------
> Please note that I am not not knowledgable about AAC, and above analysis
> was based on a quick glance at the code. I could not get benchmarks with
> runs > 1 easily (even with stream_loop), hence they are omitted.
> Furthermore, it seems like AAC is under active work, so I defer
> meaningful benchmarks to the maintainers.
> ---
>  libavcodec/aacsbr_template.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/libavcodec/aacsbr_template.c b/libavcodec/aacsbr_template.c
> index d31b71e..9561ba0 100644
> --- a/libavcodec/aacsbr_template.c
> +++ b/libavcodec/aacsbr_template.c
> @@ -32,6 +32,8 @@
>   * @author Zoran Basaric ( zoran.basaric at imgtec.com )
>   */
>
> +#include "libavutil/qsort.h"
> +
>  av_cold void AAC_RENAME(ff_aac_sbr_init)(void)
>  {
>      static const struct {
> @@ -138,8 +140,8 @@ static void sbr_make_f_tablelim(SpectralBandReplication *sbr)
>              memcpy(sbr->f_tablelim + sbr->n[0] + 1, patch_borders + 1,
>                     (sbr->num_patches - 1) * sizeof(patch_borders[0]));
>
> -        qsort(sbr->f_tablelim, sbr->num_patches + sbr->n[0],
> -              sizeof(sbr->f_tablelim[0]),
> +        AV_QSORT(sbr->f_tablelim, sbr->num_patches + sbr->n[0],
> +              uint16_t,
>                qsort_comparison_function_int16);
>
>          sbr->n_lim = sbr->n[0] + sbr->num_patches - 1;
> @@ -296,7 +298,7 @@ static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr,
>      if (spectrum->bs_stop_freq < 14) {
>          sbr->k[2] = stop_min;
>          make_bands(stop_dk, stop_min, 64, 13);
> -        qsort(stop_dk, 13, sizeof(stop_dk[0]), qsort_comparison_function_int16);
> +        AV_QSORT(stop_dk, 13, int16_t, qsort_comparison_function_int16);
>          for (k = 0; k < spectrum->bs_stop_freq; k++)
>              sbr->k[2] += stop_dk[k];
>      } else if (spectrum->bs_stop_freq == 14) {
> @@ -389,7 +391,7 @@ static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr,
>
>          make_bands(vk0+1, sbr->k[0], sbr->k[1], num_bands_0);
>
> -        qsort(vk0 + 1, num_bands_0, sizeof(vk0[1]), qsort_comparison_function_int16);
> +        AV_QSORT(vk0 + 1, num_bands_0, int16_t, qsort_comparison_function_int16);
>          vdk0_max = vk0[num_bands_0];
>
>          vk0[0] = sbr->k[0];
> @@ -430,13 +432,13 @@ static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr,
>
>              if (vdk1_min < vdk0_max) {
>                  int change;
> -                qsort(vk1 + 1, num_bands_1, sizeof(vk1[1]), qsort_comparison_function_int16);
> +                AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
>                  change = FFMIN(vdk0_max - vk1[1], (vk1[num_bands_1] - vk1[1]) >> 1);
>                  vk1[1]           += change;
>                  vk1[num_bands_1] -= change;
>              }
>
> -            qsort(vk1 + 1, num_bands_1, sizeof(vk1[1]), qsort_comparison_function_int16);
> +            AV_QSORT(vk1 + 1, num_bands_1, int16_t, qsort_comparison_function_int16);
>
>              vk1[0] = sbr->k[1];
>              for (k = 1; k <= num_bands_1; k++) {
> --
> 2.6.2
>

Ping: Rostislav, Nedeljko, Claudio, any others interested.


More information about the ffmpeg-devel mailing list