mirror of
https://github.com/termux/termux-packages.git
synced 2025-01-31 21:22:27 +00:00
96616601d0
Patches copied from f0ead348a0
112 lines
4.6 KiB
Diff
112 lines
4.6 KiB
Diff
Copied from https://salsa.debian.org/multimedia-team/vlc/-/commit/f0ead348a0d2739c6e097938e7fd20db39c6fc59
|
|
|
|
From: Ilkka Ollakka <ileoo@videolan.org>
|
|
Date: Wed, 5 Jul 2023 13:33:09 +0300
|
|
Subject: avcodec: audio decoder to use ch_layout
|
|
|
|
(cherry picked from commit 496f0f2a659c1339d1e37330d446e9b6ce96e76b)
|
|
---
|
|
modules/codec/avcodec/audio.c | 42 ++++++++++++++++++++++++++++++++++--------
|
|
1 file changed, 34 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/modules/codec/avcodec/audio.c b/modules/codec/avcodec/audio.c
|
|
index 26166c0..ad8a40a 100644
|
|
--- a/modules/codec/avcodec/audio.c
|
|
+++ b/modules/codec/avcodec/audio.c
|
|
@@ -139,7 +139,11 @@ static int OpenAudioCodec( decoder_t *p_dec )
|
|
}
|
|
|
|
ctx->sample_rate = p_dec->fmt_in.audio.i_rate;
|
|
+#if LIBAVCODEC_VERSION_CHECK(59, 999, 999, 24, 100)
|
|
+ av_channel_layout_default( &ctx->ch_layout, p_dec->fmt_in.audio.i_channels );
|
|
+#else
|
|
ctx->channels = p_dec->fmt_in.audio.i_channels;
|
|
+#endif
|
|
ctx->block_align = p_dec->fmt_in.audio.i_blockalign;
|
|
ctx->bit_rate = p_dec->fmt_in.i_bitrate;
|
|
ctx->bits_per_coded_sample = p_dec->fmt_in.audio.i_bitspersample;
|
|
@@ -395,12 +399,17 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block )
|
|
ret = avcodec_receive_frame( ctx, frame );
|
|
if( ret == 0 )
|
|
{
|
|
+#if LIBAVCODEC_VERSION_CHECK(59, 999, 999, 24, 100)
|
|
+ int channels = frame->ch_layout.nb_channels;
|
|
+#else
|
|
+ int channels = ctx->channels;
|
|
+#endif
|
|
/* checks and init from first decoded frame */
|
|
- if( ctx->channels <= 0 || ctx->channels > INPUT_CHAN_MAX
|
|
+ if( channels <= 0 || channels > INPUT_CHAN_MAX
|
|
|| ctx->sample_rate <= 0 )
|
|
{
|
|
msg_Warn( p_dec, "invalid audio properties channels count %d, sample rate %d",
|
|
- ctx->channels, ctx->sample_rate );
|
|
+ channels, ctx->sample_rate );
|
|
goto drop;
|
|
}
|
|
else if( p_dec->fmt_out.audio.i_rate != (unsigned int)ctx->sample_rate )
|
|
@@ -580,6 +589,16 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
|
|
p_dec->fmt_out.audio.i_rate = p_sys->p_context->sample_rate;
|
|
|
|
/* */
|
|
+#if LIBAVCODEC_VERSION_CHECK(59, 999, 999, 24, 100)
|
|
+ if( p_sys->i_previous_channels == p_sys->p_context->ch_layout.nb_channels &&
|
|
+ p_sys->i_previous_layout == p_sys->p_context->ch_layout.u.mask )
|
|
+ return;
|
|
+ if( b_trust )
|
|
+ {
|
|
+ p_sys->i_previous_channels = p_sys->p_context->ch_layout.nb_channels;
|
|
+ p_sys->i_previous_layout = p_sys->p_context->ch_layout.u.mask;
|
|
+ }
|
|
+#else
|
|
if( p_sys->i_previous_channels == p_sys->p_context->channels &&
|
|
p_sys->i_previous_layout == p_sys->p_context->channel_layout )
|
|
return;
|
|
@@ -588,25 +607,32 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
|
|
p_sys->i_previous_channels = p_sys->p_context->channels;
|
|
p_sys->i_previous_layout = p_sys->p_context->channel_layout;
|
|
}
|
|
+#endif
|
|
|
|
const unsigned i_order_max = sizeof(pi_channels_map)/sizeof(*pi_channels_map);
|
|
uint32_t pi_order_src[i_order_max];
|
|
|
|
int i_channels_src = 0;
|
|
- uint64_t channel_layout =
|
|
+#if LIBAVCODEC_VERSION_CHECK(59, 999, 999, 24, 100)
|
|
+ uint64_t channel_layout_mask = p_sys->p_context->ch_layout.u.mask;
|
|
+ int channel_count = p_sys->p_context->ch_layout.nb_channels;
|
|
+#else
|
|
+ uint64_t channel_layout_mask =
|
|
p_sys->p_context->channel_layout ? p_sys->p_context->channel_layout :
|
|
(uint64_t)av_get_default_channel_layout( p_sys->p_context->channels );
|
|
+ int channel_count = p_sys->p_context->channels;
|
|
+#endif
|
|
|
|
- if( channel_layout )
|
|
+ if( channel_layout_mask )
|
|
{
|
|
for( unsigned i = 0; i < i_order_max
|
|
- && i_channels_src < p_dec->fmt_out.audio.i_channels; i++ )
|
|
+ && i_channels_src < channel_count; i++ )
|
|
{
|
|
- if( channel_layout & pi_channels_map[i][0] )
|
|
+ if( channel_layout_mask & pi_channels_map[i][0] )
|
|
pi_order_src[i_channels_src++] = pi_channels_map[i][1];
|
|
}
|
|
|
|
- if( i_channels_src != p_dec->fmt_out.audio.i_channels && b_trust )
|
|
+ if( i_channels_src != channel_count && b_trust )
|
|
msg_Err( p_dec, "Channel layout not understood" );
|
|
|
|
/* Detect special dual mono case */
|
|
@@ -638,7 +664,7 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
|
|
{
|
|
msg_Warn( p_dec, "no channel layout found");
|
|
p_dec->fmt_out.audio.i_physical_channels = 0;
|
|
- p_dec->fmt_out.audio.i_channels = p_sys->p_context->channels;
|
|
+ p_dec->fmt_out.audio.i_channels = channel_count;
|
|
}
|
|
|
|
aout_FormatPrepare( &p_dec->fmt_out.audio );
|