diff mbox series

[FFmpeg-devel,14/17] avcodec/mlpenc: Simplify channel layout comparisons

Message ID GV1P250MB07377B46708F2FC1F44FEB708F4A9@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM
State Accepted
Commit a12338afe5192f23349c0fde8592891be230bfc3
Headers show
Series [FFmpeg-devel,01/17] avcodec/avcodec: Uninitialize AVChannelLayout before overwriting it | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Andreas Rheinhardt Sept. 18, 2022, 8:27 p.m. UTC
These encoders have AVCodec.ch_layouts set, so ff_encode_preinit()
has already checked that the used channel layout is equivalent
to one of these native layouts. Therefore one can simply
compare the channel masks (with the added complication
that one has to use av_channel_layout_subset() to get it,
because the channel layout is not guaranteed to have
AV_CHANNEL_ORDER_NATIVE).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/mlpenc.c | 30 ++++++++++++++----------------
 1 file changed, 14 insertions(+), 16 deletions(-)

Comments

Paul B Mahol Sept. 21, 2022, 7:15 a.m. UTC | #1
On 9/18/22, Andreas Rheinhardt <andreas.rheinhardt@outlook.com> wrote:
> These encoders have AVCodec.ch_layouts set, so ff_encode_preinit()
> has already checked that the used channel layout is equivalent
> to one of these native layouts. Therefore one can simply
> compare the channel masks (with the added complication
> that one has to use av_channel_layout_subset() to get it,
> because the channel layout is not guaranteed to have
> AV_CHANNEL_ORDER_NATIVE).
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
> ---
>  libavcodec/mlpenc.c | 30 ++++++++++++++----------------
>  1 file changed, 14 insertions(+), 16 deletions(-)
>


probably ok

> diff --git a/libavcodec/mlpenc.c b/libavcodec/mlpenc.c
> index 463332593f..d2e28888f7 100644
> --- a/libavcodec/mlpenc.c
> +++ b/libavcodec/mlpenc.c
> @@ -480,6 +480,7 @@ static av_cold int mlp_encode_init(AVCodecContext
> *avctx)
>      static AVOnce init_static_once = AV_ONCE_INIT;
>      MLPEncodeContext *ctx = avctx->priv_data;
>      RestartHeader *const rh = &ctx->restart_header;
> +    uint64_t channels_present;
>      unsigned int sum = 0;
>      size_t size;
>      int ret;
> @@ -589,19 +590,20 @@ static av_cold int mlp_encode_init(AVCodecContext
> *avctx)
>
>      ctx->num_substreams = 1; // TODO: change this after adding
> multi-channel support for TrueHD
>
> +    channels_present = av_channel_layout_subset(&avctx->ch_layout,
> ~(uint64_t)0);
>      if (ctx->avctx->codec_id == AV_CODEC_ID_MLP) {
> -        static const AVChannelLayout layout_arrangement[] = {
> -            AV_CHANNEL_LAYOUT_MONO,         AV_CHANNEL_LAYOUT_STEREO,
> -            AV_CHANNEL_LAYOUT_2_1,          AV_CHANNEL_LAYOUT_QUAD,
> -            AV_CHANNEL_LAYOUT_2POINT1,      { 0 }, { 0 },
> -            AV_CHANNEL_LAYOUT_SURROUND,     AV_CHANNEL_LAYOUT_4POINT0,
> -            AV_CHANNEL_LAYOUT_5POINT0_BACK, AV_CHANNEL_LAYOUT_3POINT1,
> -            AV_CHANNEL_LAYOUT_4POINT1,
> AV_CHANNEL_LAYOUT_5POINT1_BACK,
> +        static const uint64_t layout_arrangement[] = {
> +            AV_CH_LAYOUT_MONO,         AV_CH_LAYOUT_STEREO,
> +            AV_CH_LAYOUT_2_1,          AV_CH_LAYOUT_QUAD,
> +            AV_CH_LAYOUT_2POINT1,      0, 0,
> +            AV_CH_LAYOUT_SURROUND,     AV_CH_LAYOUT_4POINT0,
> +            AV_CH_LAYOUT_5POINT0_BACK, AV_CH_LAYOUT_3POINT1,
> +            AV_CH_LAYOUT_4POINT1,      AV_CH_LAYOUT_5POINT1_BACK,
>          };
>          int i;
>
>          for (i = 0; i < FF_ARRAY_ELEMS(layout_arrangement); i++)
> -            if (!av_channel_layout_compare(&avctx->ch_layout,
> &layout_arrangement[i]))
> +            if (channels_present == layout_arrangement[i])
>                  break;
>          if (i == FF_ARRAY_ELEMS(layout_arrangement)) {
>              av_log(avctx, AV_LOG_ERROR, "Unsupported channel
> arrangement\n");
> @@ -613,29 +615,25 @@ static av_cold int mlp_encode_init(AVCodecContext
> *avctx)
>          ctx->summary_info      =
> ff_mlp_ch_info[ctx->channel_arrangement].summary_info     ;
>      } else {
>          /* TrueHD */
> -        if (!av_channel_layout_compare(&avctx->ch_layout,
> -
> &(AVChannelLayout)AV_CHANNEL_LAYOUT_MONO)) {
> +        if (channels_present == AV_CH_LAYOUT_MONO) {
>              ctx->ch_modifier_thd0    = 3;
>              ctx->ch_modifier_thd1    = 3;
>              ctx->ch_modifier_thd2    = 3;
>              ctx->channel_arrangement = 2;
>              ctx->thd_substream_info  = 0x14;
> -        } else if (!av_channel_layout_compare(&avctx->ch_layout,
> -
> &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)) {
> +        } else if (channels_present == AV_CH_LAYOUT_STEREO) {
>              ctx->ch_modifier_thd0    = 1;
>              ctx->ch_modifier_thd1    = 1;
>              ctx->ch_modifier_thd2    = 1;
>              ctx->channel_arrangement = 1;
>              ctx->thd_substream_info  = 0x14;
> -        } else if (!av_channel_layout_compare(&avctx->ch_layout,
> -
> &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0)) {
> +        } else if (channels_present == AV_CH_LAYOUT_5POINT0) {
>              ctx->ch_modifier_thd0    = 1;
>              ctx->ch_modifier_thd1    = 1;
>              ctx->ch_modifier_thd2    = 1;
>              ctx->channel_arrangement = 11;
>              ctx->thd_substream_info  = 0x104;
> -        } else if (!av_channel_layout_compare(&avctx->ch_layout,
> -
> &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)) {
> +        } else if (channels_present == AV_CH_LAYOUT_5POINT1) {
>              ctx->ch_modifier_thd0    = 2;
>              ctx->ch_modifier_thd1    = 1;
>              ctx->ch_modifier_thd2    = 2;
> --
> 2.34.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
diff mbox series

Patch

diff --git a/libavcodec/mlpenc.c b/libavcodec/mlpenc.c
index 463332593f..d2e28888f7 100644
--- a/libavcodec/mlpenc.c
+++ b/libavcodec/mlpenc.c
@@ -480,6 +480,7 @@  static av_cold int mlp_encode_init(AVCodecContext *avctx)
     static AVOnce init_static_once = AV_ONCE_INIT;
     MLPEncodeContext *ctx = avctx->priv_data;
     RestartHeader *const rh = &ctx->restart_header;
+    uint64_t channels_present;
     unsigned int sum = 0;
     size_t size;
     int ret;
@@ -589,19 +590,20 @@  static av_cold int mlp_encode_init(AVCodecContext *avctx)
 
     ctx->num_substreams = 1; // TODO: change this after adding multi-channel support for TrueHD
 
+    channels_present = av_channel_layout_subset(&avctx->ch_layout, ~(uint64_t)0);
     if (ctx->avctx->codec_id == AV_CODEC_ID_MLP) {
-        static const AVChannelLayout layout_arrangement[] = {
-            AV_CHANNEL_LAYOUT_MONO,         AV_CHANNEL_LAYOUT_STEREO,
-            AV_CHANNEL_LAYOUT_2_1,          AV_CHANNEL_LAYOUT_QUAD,
-            AV_CHANNEL_LAYOUT_2POINT1,      { 0 }, { 0 },
-            AV_CHANNEL_LAYOUT_SURROUND,     AV_CHANNEL_LAYOUT_4POINT0,
-            AV_CHANNEL_LAYOUT_5POINT0_BACK, AV_CHANNEL_LAYOUT_3POINT1,
-            AV_CHANNEL_LAYOUT_4POINT1,      AV_CHANNEL_LAYOUT_5POINT1_BACK,
+        static const uint64_t layout_arrangement[] = {
+            AV_CH_LAYOUT_MONO,         AV_CH_LAYOUT_STEREO,
+            AV_CH_LAYOUT_2_1,          AV_CH_LAYOUT_QUAD,
+            AV_CH_LAYOUT_2POINT1,      0, 0,
+            AV_CH_LAYOUT_SURROUND,     AV_CH_LAYOUT_4POINT0,
+            AV_CH_LAYOUT_5POINT0_BACK, AV_CH_LAYOUT_3POINT1,
+            AV_CH_LAYOUT_4POINT1,      AV_CH_LAYOUT_5POINT1_BACK,
         };
         int i;
 
         for (i = 0; i < FF_ARRAY_ELEMS(layout_arrangement); i++)
-            if (!av_channel_layout_compare(&avctx->ch_layout, &layout_arrangement[i]))
+            if (channels_present == layout_arrangement[i])
                 break;
         if (i == FF_ARRAY_ELEMS(layout_arrangement)) {
             av_log(avctx, AV_LOG_ERROR, "Unsupported channel arrangement\n");
@@ -613,29 +615,25 @@  static av_cold int mlp_encode_init(AVCodecContext *avctx)
         ctx->summary_info      = ff_mlp_ch_info[ctx->channel_arrangement].summary_info     ;
     } else {
         /* TrueHD */
-        if (!av_channel_layout_compare(&avctx->ch_layout,
-                                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_MONO)) {
+        if (channels_present == AV_CH_LAYOUT_MONO) {
             ctx->ch_modifier_thd0    = 3;
             ctx->ch_modifier_thd1    = 3;
             ctx->ch_modifier_thd2    = 3;
             ctx->channel_arrangement = 2;
             ctx->thd_substream_info  = 0x14;
-        } else if (!av_channel_layout_compare(&avctx->ch_layout,
-                                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)) {
+        } else if (channels_present == AV_CH_LAYOUT_STEREO) {
             ctx->ch_modifier_thd0    = 1;
             ctx->ch_modifier_thd1    = 1;
             ctx->ch_modifier_thd2    = 1;
             ctx->channel_arrangement = 1;
             ctx->thd_substream_info  = 0x14;
-        } else if (!av_channel_layout_compare(&avctx->ch_layout,
-                                              &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0)) {
+        } else if (channels_present == AV_CH_LAYOUT_5POINT0) {
             ctx->ch_modifier_thd0    = 1;
             ctx->ch_modifier_thd1    = 1;
             ctx->ch_modifier_thd2    = 1;
             ctx->channel_arrangement = 11;
             ctx->thd_substream_info  = 0x104;
-        } else if (!av_channel_layout_compare(&avctx->ch_layout,
-                                              &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)) {
+        } else if (channels_present == AV_CH_LAYOUT_5POINT1) {
             ctx->ch_modifier_thd0    = 2;
             ctx->ch_modifier_thd1    = 1;
             ctx->ch_modifier_thd2    = 2;