audio.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:18k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * audio.c: audio decoder using ffmpeg library
  3.  *****************************************************************************
  4.  * Copyright (C) 1999-2003 the VideoLAN team
  5.  * $Id: 819157c8d83ac86c0eb7fe542aa9ad265a7ef509 $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Gildas Bazin <gbazin@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_aout.h>
  32. #include <vlc_codec.h>
  33. #include <vlc_avcodec.h>
  34. /* ffmpeg header */
  35. #ifdef HAVE_LIBAVCODEC_AVCODEC_H
  36. #   include <libavcodec/avcodec.h>
  37. #elif defined(HAVE_FFMPEG_AVCODEC_H)
  38. #   include <ffmpeg/avcodec.h>
  39. #else
  40. #   include <avcodec.h>
  41. #endif
  42. #include "avcodec.h"
  43. /*****************************************************************************
  44.  * decoder_sys_t : decoder descriptor
  45.  *****************************************************************************/
  46. struct decoder_sys_t
  47. {
  48.     FFMPEG_COMMON_MEMBERS
  49.     /* Temporary buffer for libavcodec */
  50.     int     i_output_max;
  51.     uint8_t *p_output;
  52.     /*
  53.      * Output properties
  54.      */
  55.     audio_sample_format_t aout_format;
  56.     audio_date_t          end_date;
  57.     /*
  58.      *
  59.      */
  60.     uint8_t *p_samples;
  61.     int     i_samples;
  62.     /* */
  63.     int     i_reject_count;
  64.     /* */
  65.     bool    b_extract;
  66.     int     pi_extraction[AOUT_CHAN_MAX];
  67.     int     i_previous_channels;
  68.     int64_t i_previous_layout;
  69. };
  70. #define BLOCK_FLAG_PRIVATE_REALLOCATED (1 << BLOCK_FLAG_PRIVATE_SHIFT)
  71. static void SetupOutputFormat( decoder_t *p_dec, bool b_trust );
  72. /*****************************************************************************
  73.  * InitAudioDec: initialize audio decoder
  74.  *****************************************************************************
  75.  * The ffmpeg codec will be opened, some memory allocated.
  76.  *****************************************************************************/
  77. int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
  78.                       AVCodec *p_codec, int i_codec_id, const char *psz_namecodec )
  79. {
  80.     decoder_sys_t *p_sys;
  81.     /* Allocate the memory needed to store the decoder's structure */
  82.     if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
  83.     {
  84.         return VLC_ENOMEM;
  85.     }
  86.     p_sys->p_context = p_context;
  87.     p_sys->p_codec = p_codec;
  88.     p_sys->i_codec_id = i_codec_id;
  89.     p_sys->psz_namecodec = psz_namecodec;
  90.     p_sys->b_delayed_open = false;
  91.     /* ***** Fill p_context with init values ***** */
  92.     p_sys->p_context->sample_rate = p_dec->fmt_in.audio.i_rate;
  93.     p_sys->p_context->channels = p_dec->fmt_in.audio.i_channels;
  94.     p_sys->p_context->block_align = p_dec->fmt_in.audio.i_blockalign;
  95.     p_sys->p_context->bit_rate = p_dec->fmt_in.i_bitrate;
  96. #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
  97.     p_sys->p_context->bits_per_sample = p_dec->fmt_in.audio.i_bitspersample;
  98. #else
  99.     p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.audio.i_bitspersample;
  100. #endif
  101.     if( p_dec->fmt_in.i_extra > 0 )
  102.     {
  103.         const uint8_t * const p_src = p_dec->fmt_in.p_extra;
  104.         int i_offset;
  105.         int i_size;
  106.         if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', 'a', 'c' ) )
  107.         {
  108.             i_offset = 8;
  109.             i_size = p_dec->fmt_in.i_extra - 8;
  110.         }
  111.         else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'l', 'a', 'c' ) )
  112.         {
  113.             static const uint8_t p_pattern[] = { 0, 0, 0, 36, 'a', 'l', 'a', 'c' };
  114.             /* Find alac atom XXX it is a bit ugly */
  115.             for( i_offset = 0; i_offset < p_dec->fmt_in.i_extra - sizeof(p_pattern); i_offset++ )
  116.             {
  117.                 if( !memcmp( &p_src[i_offset], p_pattern, sizeof(p_pattern) ) )
  118.                     break;
  119.             }
  120.             i_size = __MIN( p_dec->fmt_in.i_extra - i_offset, 36 );
  121.             if( i_size < 36 )
  122.                 i_size = 0;
  123.         }
  124.         else
  125.         {
  126.             i_offset = 0;
  127.             i_size = p_dec->fmt_in.i_extra;
  128.         }
  129.         if( i_size > 0 )
  130.         {
  131.             p_sys->p_context->extradata =
  132.                 malloc( i_size + FF_INPUT_BUFFER_PADDING_SIZE );
  133.             if( p_sys->p_context->extradata )
  134.             {
  135.                 uint8_t *p_dst = p_sys->p_context->extradata;
  136.                 p_sys->p_context->extradata_size = i_size;
  137.                 memcpy( &p_dst[0],            &p_src[i_offset], i_size );
  138.                 memset( &p_dst[i_size], 0, FF_INPUT_BUFFER_PADDING_SIZE );
  139.             }
  140.         }
  141.     }
  142.     else
  143.     {
  144.         p_sys->p_context->extradata_size = 0;
  145.         p_sys->p_context->extradata = NULL;
  146.     }
  147.     /* ***** Open the codec ***** */
  148.     int ret;
  149.     vlc_avcodec_lock();
  150.     ret = avcodec_open( p_sys->p_context, p_sys->p_codec );
  151.     vlc_avcodec_unlock();
  152.     if( ret < 0 )
  153.     {
  154.         msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
  155.         free( p_sys->p_context->extradata );
  156.         free( p_sys );
  157.         return VLC_EGENERIC;
  158.     }
  159.     msg_Dbg( p_dec, "ffmpeg codec (%s) started", p_sys->psz_namecodec );
  160.     switch( i_codec_id )
  161.     {
  162. #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 51, 16, 0 )
  163.     case CODEC_ID_WAVPACK:
  164.         p_sys->i_output_max = 8 * sizeof(int32_t) * 131072;
  165.         break;
  166. #endif
  167. #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 51, 4, 0 )
  168.     case CODEC_ID_TTA:
  169.         p_sys->i_output_max = p_sys->p_context->channels * sizeof(int32_t) * p_sys->p_context->sample_rate * 2;
  170.         break;
  171. #endif
  172.     case CODEC_ID_FLAC:
  173.         p_sys->i_output_max = 8 * sizeof(int32_t) * 65535;
  174.         break;
  175. #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 35, 0 )
  176.     case CODEC_ID_WMAPRO:
  177.         p_sys->i_output_max = 8 * sizeof(float) * 6144; /* (1 << 12) * 3/2 */
  178.         break;
  179. #endif
  180.     default:
  181.         p_sys->i_output_max = 0;
  182.         break;
  183.     }
  184.     if( p_sys->i_output_max < AVCODEC_MAX_AUDIO_FRAME_SIZE )
  185.         p_sys->i_output_max = AVCODEC_MAX_AUDIO_FRAME_SIZE;
  186.     msg_Dbg( p_dec, "Using %d bytes output buffer", p_sys->i_output_max );
  187.     p_sys->p_output = av_malloc( p_sys->i_output_max );
  188.     p_sys->p_samples = NULL;
  189.     p_sys->i_samples = 0;
  190.     p_sys->i_reject_count = 0;
  191.     p_sys->b_extract = false;
  192.     p_sys->i_previous_channels = 0;
  193.     p_sys->i_previous_layout = 0;
  194.     aout_DateSet( &p_sys->end_date, 0 );
  195.     if( p_dec->fmt_in.audio.i_rate )
  196.         aout_DateInit( &p_sys->end_date, p_dec->fmt_in.audio.i_rate );
  197.     /* */
  198.     p_dec->fmt_out.i_cat = AUDIO_ES;
  199.     /* Try to set as much informations as possible but do not trust it */
  200.     SetupOutputFormat( p_dec, false );
  201.     return VLC_SUCCESS;
  202. }
  203. /*****************************************************************************
  204.  * SplitBuffer: Needed because aout really doesn't like big audio chunk and
  205.  * wma produces easily > 30000 samples...
  206.  *****************************************************************************/
  207. static aout_buffer_t *SplitBuffer( decoder_t *p_dec )
  208. {
  209.     decoder_sys_t *p_sys = p_dec->p_sys;
  210.     int i_samples = __MIN( p_sys->i_samples, 4096 );
  211.     aout_buffer_t *p_buffer;
  212.     if( i_samples == 0 ) return NULL;
  213.     if( ( p_buffer = decoder_NewAudioBuffer( p_dec, i_samples ) ) == NULL )
  214.         return NULL;
  215.     p_buffer->start_date = aout_DateGet( &p_sys->end_date );
  216.     p_buffer->end_date = aout_DateIncrement( &p_sys->end_date, i_samples );
  217.     if( p_sys->b_extract )
  218.         aout_ChannelExtract( p_buffer->p_buffer, p_dec->fmt_out.audio.i_channels,
  219.                              p_sys->p_samples, p_sys->p_context->channels, i_samples,
  220.                              p_sys->pi_extraction, p_dec->fmt_out.audio.i_bitspersample );
  221.     else
  222.         memcpy( p_buffer->p_buffer, p_sys->p_samples, p_buffer->i_nb_bytes );
  223.     p_sys->p_samples += i_samples * p_sys->p_context->channels * ( p_dec->fmt_out.audio.i_bitspersample / 8 );
  224.     p_sys->i_samples -= i_samples;
  225.     return p_buffer;
  226. }
  227. /*****************************************************************************
  228.  * DecodeAudio: Called to decode one frame
  229.  *****************************************************************************/
  230. aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
  231. {
  232.     decoder_sys_t *p_sys = p_dec->p_sys;
  233.     int i_used, i_output;
  234.     aout_buffer_t *p_buffer;
  235.     block_t *p_block;
  236.     if( !pp_block || !*pp_block ) return NULL;
  237.     p_block = *pp_block;
  238.     if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
  239.     {
  240.         block_Release( p_block );
  241.         avcodec_flush_buffers( p_sys->p_context );
  242.         p_sys->i_samples = 0;
  243.         aout_DateSet( &p_sys->end_date, 0 );
  244.         if( p_sys->i_codec_id == CODEC_ID_MP2 || p_sys->i_codec_id == CODEC_ID_MP3 )
  245.             p_sys->i_reject_count = 3;
  246.         return NULL;
  247.     }
  248.     if( p_sys->i_samples > 0 )
  249.     {
  250.         /* More data */
  251.         p_buffer = SplitBuffer( p_dec );
  252.         if( !p_buffer ) block_Release( p_block );
  253.         return p_buffer;
  254.     }
  255.     if( !aout_DateGet( &p_sys->end_date ) && !p_block->i_pts )
  256.     {
  257.         /* We've just started the stream, wait for the first PTS. */
  258.         block_Release( p_block );
  259.         return NULL;
  260.     }
  261.     if( p_block->i_buffer <= 0 )
  262.     {
  263.         block_Release( p_block );
  264.         return NULL;
  265.     }
  266.     if( (p_block->i_flags & BLOCK_FLAG_PRIVATE_REALLOCATED) == 0 )
  267.     {
  268.         *pp_block = p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
  269.         if( !p_block )
  270.             return NULL;
  271.         p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
  272.         memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE );
  273.         p_block->i_flags |= BLOCK_FLAG_PRIVATE_REALLOCATED;
  274.     }
  275.     do
  276.     {
  277.         i_output = __MAX( p_block->i_buffer, p_sys->i_output_max );
  278.         if( i_output > p_sys->i_output_max )
  279.         {
  280.             /* Grow output buffer if necessary (eg. for PCM data) */
  281.             p_sys->p_output = av_realloc( p_sys->p_output, i_output );
  282.         }
  283. #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 0, 0 )
  284.         i_used = avcodec_decode_audio2( p_sys->p_context,
  285.                                        (int16_t*)p_sys->p_output, &i_output,
  286.                                        p_block->p_buffer, p_block->i_buffer );
  287. #else
  288.         i_used = avcodec_decode_audio( p_sys->p_context,
  289.                                        (int16_t*)p_sys->p_output, &i_output,
  290.                                        p_block->p_buffer, p_block->i_buffer );
  291. #endif
  292.         if( i_used < 0 || i_output < 0 )
  293.         {
  294.             if( i_used < 0 )
  295.                 msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
  296.                           p_block->i_buffer );
  297.             block_Release( p_block );
  298.             return NULL;
  299.         }
  300.         else if( (size_t)i_used > p_block->i_buffer )
  301.         {
  302.             i_used = p_block->i_buffer;
  303.         }
  304.         p_block->i_buffer -= i_used;
  305.         p_block->p_buffer += i_used;
  306.     } while( p_block->i_buffer > 0 && i_output <= 0 );
  307.     if( p_sys->p_context->channels <= 0 || p_sys->p_context->channels > 8 ||
  308.         p_sys->p_context->sample_rate <= 0 )
  309.     {
  310.         msg_Warn( p_dec, "invalid audio properties channels count %d, sample rate %d",
  311.                   p_sys->p_context->channels, p_sys->p_context->sample_rate );
  312.         block_Release( p_block );
  313.         return NULL;
  314.     }
  315.     if( p_dec->fmt_out.audio.i_rate != (unsigned int)p_sys->p_context->sample_rate )
  316.     {
  317.         aout_DateInit( &p_sys->end_date, p_sys->p_context->sample_rate );
  318.         aout_DateSet( &p_sys->end_date, p_block->i_pts );
  319.     }
  320.     /* **** Set audio output parameters **** */
  321.     SetupOutputFormat( p_dec, true );
  322.     if( p_block->i_pts != 0 &&
  323.         p_block->i_pts != aout_DateGet( &p_sys->end_date ) )
  324.     {
  325.         aout_DateSet( &p_sys->end_date, p_block->i_pts );
  326.     }
  327.     p_block->i_pts = 0;
  328.     /* **** Now we can output these samples **** */
  329.     p_sys->i_samples = i_output / (p_dec->fmt_out.audio.i_bitspersample / 8) / p_sys->p_context->channels;
  330.     p_sys->p_samples = p_sys->p_output;
  331.     /* Silent unwanted samples */
  332.     if( p_sys->i_reject_count > 0 )
  333.     {
  334.         memset( p_sys->p_output, 0, i_output );
  335.         p_sys->i_reject_count--;
  336.     }
  337.     p_buffer = SplitBuffer( p_dec );
  338.     if( !p_buffer ) block_Release( p_block );
  339.     return p_buffer;
  340. }
  341. /*****************************************************************************
  342.  * EndAudioDec: audio decoder destruction
  343.  *****************************************************************************/
  344. void EndAudioDec( decoder_t *p_dec )
  345. {
  346.     decoder_sys_t *p_sys = p_dec->p_sys;
  347.     av_free( p_sys->p_output );
  348. }
  349. /*****************************************************************************
  350.  *
  351.  *****************************************************************************/
  352. #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 2, 0 )
  353. #   define LIBAVCODEC_AUDIO_LAYOUT
  354. #else
  355. #   warning "Audio channel layout is unsupported by your avcodec version."
  356. #endif
  357. #if defined(LIBAVCODEC_AUDIO_LAYOUT)
  358. static const uint64_t pi_channels_map[][2] =
  359. {
  360.     { CH_FRONT_LEFT,        AOUT_CHAN_LEFT },
  361.     { CH_FRONT_RIGHT,       AOUT_CHAN_RIGHT },
  362.     { CH_FRONT_CENTER,      AOUT_CHAN_CENTER },
  363.     { CH_LOW_FREQUENCY,     AOUT_CHAN_LFE },
  364.     { CH_BACK_LEFT,         AOUT_CHAN_REARLEFT },
  365.     { CH_BACK_RIGHT,        AOUT_CHAN_REARRIGHT },
  366.     { CH_FRONT_LEFT_OF_CENTER, 0 },
  367.     { CH_FRONT_RIGHT_OF_CENTER, 0 },
  368.     { CH_BACK_CENTER,       AOUT_CHAN_REARCENTER },
  369.     { CH_SIDE_LEFT,         AOUT_CHAN_MIDDLELEFT },
  370.     { CH_SIDE_RIGHT,        AOUT_CHAN_MIDDLERIGHT },
  371.     { CH_TOP_CENTER,        0 },
  372.     { CH_TOP_FRONT_LEFT,    0 },
  373.     { CH_TOP_FRONT_CENTER,  0 },
  374.     { CH_TOP_FRONT_RIGHT,   0 },
  375.     { CH_TOP_BACK_LEFT,     0 },
  376.     { CH_TOP_BACK_CENTER,   0 },
  377.     { CH_TOP_BACK_RIGHT,    0 },
  378.     { CH_STEREO_LEFT,       0 },
  379.     { CH_STEREO_RIGHT,      0 },
  380. };
  381. #else
  382. static const uint64_t pi_channels_map[][2] =
  383. {
  384.     { 0, AOUT_CHAN_LEFT },
  385.     { 0, AOUT_CHAN_RIGHT },
  386.     { 0, AOUT_CHAN_CENTER },
  387.     { 0, AOUT_CHAN_LFE },
  388.     { 0, AOUT_CHAN_REARLEFT },
  389.     { 0, AOUT_CHAN_REARRIGHT },
  390.     { 0, 0 },
  391.     { 0, 0 },
  392.     { 0, AOUT_CHAN_REARCENTER },
  393.     { 0, AOUT_CHAN_MIDDLELEFT },
  394.     { 0, AOUT_CHAN_MIDDLERIGHT },
  395.     { 0, 0 },
  396.     { 0, 0 },
  397.     { 0, 0 },
  398.     { 0, 0 },
  399.     { 0, 0 },
  400.     { 0, 0 },
  401.     { 0, 0 },
  402.     { 0, 0 },
  403.     { 0, 0 },
  404. };
  405. #endif
  406. static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
  407. {
  408.     decoder_sys_t *p_sys = p_dec->p_sys;
  409. #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 51, 65, 0 )
  410.     switch( p_sys->p_context->sample_fmt )
  411.     {
  412.     case SAMPLE_FMT_U8:
  413.         p_dec->fmt_out.i_codec = VLC_FOURCC('u','8',' ',' ');
  414.         p_dec->fmt_out.audio.i_bitspersample = 8;
  415.         break;
  416.     case SAMPLE_FMT_S32:
  417.         p_dec->fmt_out.i_codec = AOUT_FMT_S32_NE;
  418.         p_dec->fmt_out.audio.i_bitspersample = 32;
  419.         break;
  420.     case SAMPLE_FMT_FLT:
  421.         p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
  422.         p_dec->fmt_out.audio.i_bitspersample = 32;
  423.         break;
  424.     case SAMPLE_FMT_DBL:
  425.         p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','6','4');
  426.         p_dec->fmt_out.audio.i_bitspersample = 64;
  427.         break;
  428.     case SAMPLE_FMT_S16:
  429.     default:
  430.         p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
  431.         p_dec->fmt_out.audio.i_bitspersample = 16;
  432.         break;
  433.     }
  434. #else
  435.     p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
  436.     p_dec->fmt_out.audio.i_bitspersample = 16;
  437. #endif
  438.     p_dec->fmt_out.audio.i_rate     = p_sys->p_context->sample_rate;
  439.     /* */
  440. #if defined(LIBAVCODEC_AUDIO_LAYOUT)
  441.     if( p_sys->i_previous_channels == p_sys->p_context->channels &&
  442.         p_sys->i_previous_layout == p_sys->p_context->channel_layout )
  443.         return;
  444. #else
  445.     if( p_sys->i_previous_channels == p_sys->p_context->channels )
  446.         return;
  447. #endif
  448.     if( b_trust )
  449.     {
  450.         p_sys->i_previous_channels = p_sys->p_context->channels;
  451. #if defined(LIBAVCODEC_AUDIO_LAYOUT)
  452.         p_sys->i_previous_layout = p_sys->p_context->channel_layout;
  453. #endif
  454.     }
  455.     /* Specified order
  456.      * FIXME should we use fmt_in.audio.i_physical_channels or not ?
  457.      */
  458. #if defined(LIBAVCODEC_AUDIO_LAYOUT)
  459.     const unsigned i_order_max = 8 * sizeof(p_sys->p_context->channel_layout);
  460. #else
  461.     const unsigned i_order_max = 64;
  462. #endif
  463.     uint32_t pi_order_src[i_order_max];
  464.     int i_channels_src = 0;
  465. #if defined(LIBAVCODEC_AUDIO_LAYOUT)
  466.     if( p_sys->p_context->channel_layout )
  467.     {
  468.         for( unsigned i = 0; i < sizeof(pi_channels_map)/sizeof(*pi_channels_map); i++ )
  469.         {
  470.             if( p_sys->p_context->channel_layout & pi_channels_map[i][0] )
  471.                 pi_order_src[i_channels_src++] = pi_channels_map[i][1];
  472.         }
  473.     }
  474.     else
  475. #endif
  476.     {
  477.         /* Create default order  */
  478.         if( b_trust )
  479.             msg_Warn( p_dec, "Physical channel configuration not set : guessing" );
  480.         for( unsigned int i = 0; i < __MIN( i_order_max, (unsigned)p_sys->p_context->channels ); i++ )
  481.         {
  482.             if( i < sizeof(pi_channels_map)/sizeof(*pi_channels_map) )
  483.                 pi_order_src[i_channels_src++] = pi_channels_map[i][1];
  484.         }
  485.     }
  486.     if( i_channels_src != p_sys->p_context->channels && b_trust )
  487.         msg_Err( p_dec, "Channel layout not understood" );
  488.     uint32_t i_layout_dst;
  489.     int      i_channels_dst;
  490.     p_sys->b_extract = aout_CheckChannelExtraction( p_sys->pi_extraction,
  491.                                                     &i_layout_dst, &i_channels_dst,
  492.                                                     NULL, pi_order_src, i_channels_src );
  493.     if( i_channels_dst != i_channels_src && b_trust )
  494.         msg_Warn( p_dec, "%d channels are dropped", i_channels_src - i_channels_dst );
  495.     p_dec->fmt_out.audio.i_physical_channels =
  496.     p_dec->fmt_out.audio.i_original_channels = i_layout_dst;
  497.     p_dec->fmt_out.audio.i_channels = i_channels_dst;
  498. }