Skip to content
Snippets Groups Projects
Commit 496f0f2a authored by Ilkka Ollakka's avatar Ilkka Ollakka Committed by Jean-Baptiste Kempf
Browse files

avcodec: audio decoder to use ch_layout

parent bddf5ba1
No related branches found
No related tags found
Loading
...@@ -138,7 +138,11 @@ static int OpenAudioCodec( decoder_t *p_dec ) ...@@ -138,7 +138,11 @@ static int OpenAudioCodec( decoder_t *p_dec )
} }
ctx->sample_rate = p_dec->fmt_in->audio.i_rate; ctx->sample_rate = p_dec->fmt_in->audio.i_rate;
#if LIBAVCODEC_VERSION_CHECK(59, 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; ctx->channels = p_dec->fmt_in->audio.i_channels;
#endif
ctx->block_align = p_dec->fmt_in->audio.i_blockalign; ctx->block_align = p_dec->fmt_in->audio.i_blockalign;
ctx->bit_rate = p_dec->fmt_in->i_bitrate; ctx->bit_rate = p_dec->fmt_in->i_bitrate;
ctx->bits_per_coded_sample = p_dec->fmt_in->audio.i_bitspersample; ctx->bits_per_coded_sample = p_dec->fmt_in->audio.i_bitspersample;
...@@ -403,12 +407,17 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -403,12 +407,17 @@ static int DecodeBlock( decoder_t *p_dec, block_t **pp_block )
ret = avcodec_receive_frame( ctx, frame ); ret = avcodec_receive_frame( ctx, frame );
if( ret == 0 ) if( ret == 0 )
{ {
#if LIBAVCODEC_VERSION_CHECK(59, 24, 100)
int channels = frame->ch_layout.nb_channels;
#else
int channels = ctx->channels;
#endif
/* checks and init from first decoded frame */ /* 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 ) || ctx->sample_rate <= 0 )
{ {
msg_Warn( p_dec, "invalid audio properties channels count %d, sample rate %d", msg_Warn( p_dec, "invalid audio properties channels count %d, sample rate %d",
ctx->channels, ctx->sample_rate ); channels, ctx->sample_rate );
goto drop; goto drop;
} }
else if( p_dec->fmt_out.audio.i_rate != (unsigned int)ctx->sample_rate ) else if( p_dec->fmt_out.audio.i_rate != (unsigned int)ctx->sample_rate )
...@@ -588,6 +597,16 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust ) ...@@ -588,6 +597,16 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
p_dec->fmt_out.audio.i_rate = p_sys->p_context->sample_rate; p_dec->fmt_out.audio.i_rate = p_sys->p_context->sample_rate;
/* */ /* */
#if LIBAVCODEC_VERSION_CHECK(59, 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 && if( p_sys->i_previous_channels == p_sys->p_context->channels &&
p_sys->i_previous_layout == p_sys->p_context->channel_layout ) p_sys->i_previous_layout == p_sys->p_context->channel_layout )
return; return;
...@@ -596,25 +615,32 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust ) ...@@ -596,25 +615,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_channels = p_sys->p_context->channels;
p_sys->i_previous_layout = p_sys->p_context->channel_layout; 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); const unsigned i_order_max = sizeof(pi_channels_map)/sizeof(*pi_channels_map);
uint32_t pi_order_src[i_order_max]; uint32_t pi_order_src[i_order_max];
int i_channels_src = 0; int i_channels_src = 0;
uint64_t channel_layout = #if LIBAVCODEC_VERSION_CHECK(59, 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 : p_sys->p_context->channel_layout ? p_sys->p_context->channel_layout :
(uint64_t)av_get_default_channel_layout( p_sys->p_context->channels ); (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 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]; 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" ); msg_Err( p_dec, "Channel layout not understood" );
/* Detect special dual mono case */ /* Detect special dual mono case */
...@@ -646,7 +672,7 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust ) ...@@ -646,7 +672,7 @@ static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
{ {
msg_Warn( p_dec, "no channel layout found"); msg_Warn( p_dec, "no channel layout found");
p_dec->fmt_out.audio.i_physical_channels = 0; 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 ); aout_FormatPrepare( &p_dec->fmt_out.audio );
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment