araw.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:20k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * araw.c: Pseudo audio decoder; for raw pcm data
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2003 VideoLAN
  5.  * $Id: araw.c 8867 2004-09-30 21:23:28Z gbazin $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <vlc/vlc.h>
  27. #include <vlc/decoder.h>
  28. /*****************************************************************************
  29.  * Module descriptor
  30.  *****************************************************************************/
  31. static int  DecoderOpen ( vlc_object_t * );
  32. static void DecoderClose( vlc_object_t * );
  33. static int  EncoderOpen ( vlc_object_t * );
  34. static void EncoderClose( vlc_object_t * );
  35. vlc_module_begin();
  36.     /* audio decoder module */
  37.     set_description( _("Raw/Log Audio decoder") );
  38.     set_capability( "decoder", 100 );
  39.     set_callbacks( DecoderOpen, DecoderClose );
  40.     /* audio encoder submodule */
  41.     add_submodule();
  42.     set_description( _("Raw audio encoder") );
  43.     set_capability( "encoder", 150 );
  44.     set_callbacks( EncoderOpen, EncoderClose );
  45. vlc_module_end();
  46. /*****************************************************************************
  47.  * Local prototypes
  48.  *****************************************************************************/
  49. static aout_buffer_t *DecodeBlock( decoder_t *, block_t ** );
  50. static block_t *EncoderEncode( encoder_t *, aout_buffer_t * );
  51. struct decoder_sys_t
  52. {
  53.     int16_t *p_logtos16;  /* used with m/alaw to int16_t */
  54.     audio_date_t end_date;
  55. };
  56. static int pi_channels_maps[] =
  57. {
  58.     0,
  59.     AOUT_CHAN_CENTER,
  60.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
  61.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
  62.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT
  63.      | AOUT_CHAN_REARRIGHT,
  64.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
  65.      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT,
  66.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
  67.      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE,
  68.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
  69.      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
  70.      | AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT,
  71.     AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
  72.      | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT
  73.      | AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_LFE
  74. };
  75. static int16_t ulawtos16[256] =
  76. {
  77.     -32124, -31100, -30076, -29052, -28028, -27004, -25980, -24956,
  78.     -23932, -22908, -21884, -20860, -19836, -18812, -17788, -16764,
  79.     -15996, -15484, -14972, -14460, -13948, -13436, -12924, -12412,
  80.     -11900, -11388, -10876, -10364,  -9852,  -9340,  -8828,  -8316,
  81.      -7932,  -7676,  -7420,  -7164,  -6908,  -6652,  -6396,  -6140,
  82.      -5884,  -5628,  -5372,  -5116,  -4860,  -4604,  -4348,  -4092,
  83.      -3900,  -3772,  -3644,  -3516,  -3388,  -3260,  -3132,  -3004,
  84.      -2876,  -2748,  -2620,  -2492,  -2364,  -2236,  -2108,  -1980,
  85.      -1884,  -1820,  -1756,  -1692,  -1628,  -1564,  -1500,  -1436,
  86.      -1372,  -1308,  -1244,  -1180,  -1116,  -1052,   -988,   -924,
  87.       -876,   -844,   -812,   -780,   -748,   -716,   -684,   -652,
  88.       -620,   -588,   -556,   -524,   -492,   -460,   -428,   -396,
  89.       -372,   -356,   -340,   -324,   -308,   -292,   -276,   -260,
  90.       -244,   -228,   -212,   -196,   -180,   -164,   -148,   -132,
  91.       -120,   -112,   -104,    -96,    -88,    -80,    -72,    -64,
  92.        -56,    -48,    -40,    -32,    -24,    -16,     -8,      0,
  93.      32124,  31100,  30076,  29052,  28028,  27004,  25980,  24956,
  94.      23932,  22908,  21884,  20860,  19836,  18812,  17788,  16764,
  95.      15996,  15484,  14972,  14460,  13948,  13436,  12924,  12412,
  96.      11900,  11388,  10876,  10364,   9852,   9340,   8828,   8316,
  97.       7932,   7676,   7420,   7164,   6908,   6652,   6396,   6140,
  98.       5884,   5628,   5372,   5116,   4860,   4604,   4348,   4092,
  99.       3900,   3772,   3644,   3516,   3388,   3260,   3132,   3004,
  100.       2876,   2748,   2620,   2492,   2364,   2236,   2108,   1980,
  101.       1884,   1820,   1756,   1692,   1628,   1564,   1500,   1436,
  102.       1372,   1308,   1244,   1180,   1116,   1052,    988,    924,
  103.        876,    844,    812,    780,    748,    716,    684,    652,
  104.        620,    588,    556,    524,    492,    460,    428,    396,
  105.        372,    356,    340,    324,    308,    292,    276,    260,
  106.        244,    228,    212,    196,    180,    164,    148,    132,
  107.        120,    112,    104,     96,     88,     80,     72,     64,
  108.         56,     48,     40,     32,     24,     16,      8,      0
  109. };
  110. static int16_t alawtos16[256] =
  111. {
  112.      -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736,
  113.      -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784,
  114.      -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368,
  115.      -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392,
  116.     -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
  117.     -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
  118.     -11008, -10496, -12032, -11520,  -8960,  -8448,  -9984,  -9472,
  119.     -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
  120.       -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296,
  121.       -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424,
  122.        -88,    -72,   -120,   -104,    -24,     -8,    -56,    -40,
  123.       -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168,
  124.      -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184,
  125.      -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696,
  126.       -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592,
  127.       -944,   -912,  -1008,   -976,   -816,   -784,   -880,   -848,
  128.       5504,   5248,   6016,   5760,   4480,   4224,   4992,   4736,
  129.       7552,   7296,   8064,   7808,   6528,   6272,   7040,   6784,
  130.       2752,   2624,   3008,   2880,   2240,   2112,   2496,   2368,
  131.       3776,   3648,   4032,   3904,   3264,   3136,   3520,   3392,
  132.      22016,  20992,  24064,  23040,  17920,  16896,  19968,  18944,
  133.      30208,  29184,  32256,  31232,  26112,  25088,  28160,  27136,
  134.      11008,  10496,  12032,  11520,   8960,   8448,   9984,   9472,
  135.      15104,  14592,  16128,  15616,  13056,  12544,  14080,  13568,
  136.        344,    328,    376,    360,    280,    264,    312,    296,
  137.        472,    456,    504,    488,    408,    392,    440,    424,
  138.         88,     72,    120,    104,     24,      8,     56,     40,
  139.        216,    200,    248,    232,    152,    136,    184,    168,
  140.       1376,   1312,   1504,   1440,   1120,   1056,   1248,   1184,
  141.       1888,   1824,   2016,   1952,   1632,   1568,   1760,   1696,
  142.        688,    656,    752,    720,    560,    528,    624,    592,
  143.        944,    912,   1008,    976,    816,    784,    880,    848
  144. };
  145. /*****************************************************************************
  146.  * DecoderOpen: probe the decoder and return score
  147.  *****************************************************************************/
  148. static int DecoderOpen( vlc_object_t *p_this )
  149. {
  150.     decoder_t *p_dec = (decoder_t*)p_this;
  151.     decoder_sys_t *p_sys;
  152.     switch( p_dec->fmt_in.i_codec )
  153.     {
  154.     /* from wav/avi/asf file */
  155.     case VLC_FOURCC('a','r','a','w'):
  156.     case VLC_FOURCC('a','f','l','t'):
  157.     /* _signed_ big endian samples (mov)*/
  158.     case VLC_FOURCC('t','w','o','s'):
  159.     /* _signed_ little endian samples (mov)*/
  160.     case VLC_FOURCC('s','o','w','t'):
  161.     case VLC_FOURCC('a','l','a','w'):
  162.     case VLC_FOURCC('u','l','a','w'):
  163.     case VLC_FOURCC('m','l','a','w'):
  164.     case VLC_FOURCC('f','l','6','4'):
  165.     case VLC_FOURCC('f','l','3','2'):
  166.     case VLC_FOURCC('s','3','2','l'):
  167.     case VLC_FOURCC('s','3','2','b'):
  168.     case VLC_FOURCC('s','2','4','l'):
  169.     case VLC_FOURCC('s','2','4','b'):
  170.     case VLC_FOURCC('s','1','6','l'):
  171.     case VLC_FOURCC('s','1','6','b'):
  172.     case VLC_FOURCC('s','8',' ',' '):
  173.     case VLC_FOURCC('u','8',' ',' '):
  174.         break;
  175.     default:
  176.         return VLC_EGENERIC;
  177.     }
  178.     if( p_dec->fmt_in.audio.i_channels <= 0 ||
  179.         p_dec->fmt_in.audio.i_channels > 8 )
  180.     {
  181.         msg_Err( p_dec, "bad channels count (1-8)" );
  182.         return VLC_EGENERIC;
  183.     }
  184.     if( p_dec->fmt_in.audio.i_rate <= 0 )
  185.     {
  186.         msg_Err( p_dec, "bad samplerate" );
  187.         return VLC_EGENERIC;
  188.     }
  189.     /* Allocate the memory needed to store the decoder's structure */
  190.     if( ( p_dec->p_sys = p_sys =
  191.           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
  192.     {
  193.         msg_Err( p_dec, "out of memory" );
  194.         return VLC_EGENERIC;
  195.     }
  196.     p_sys->p_logtos16 = NULL;
  197.     msg_Dbg( p_dec, "samplerate:%dHz channels:%d bits/sample:%d",
  198.              p_dec->fmt_in.audio.i_rate, p_dec->fmt_in.audio.i_channels,
  199.              p_dec->fmt_in.audio.i_bitspersample );
  200.     if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', '6', '4' ) )
  201.     {
  202.         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
  203.         p_dec->fmt_in.audio.i_bitspersample = 64;
  204.     }
  205.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'f', 'l', '3', '2' ) )
  206.     {
  207.         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
  208.         p_dec->fmt_in.audio.i_bitspersample = 32;
  209.     }
  210.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '3', '2', 'l' ) ||
  211.              p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '3', '2', 'b' ) )
  212.     {
  213.         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
  214.         p_dec->fmt_in.audio.i_bitspersample = 32;
  215.     }
  216.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '2', '4', 'l' ) ||
  217.              p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '2', '4', 'b' ) )
  218.     {
  219.         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
  220.         p_dec->fmt_in.audio.i_bitspersample = 24;
  221.     }
  222.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '1', '6', 'l' ) ||
  223.              p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '1', '6', 'b' ) )
  224.     {
  225.         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
  226.         p_dec->fmt_in.audio.i_bitspersample = 16;
  227.     }
  228.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', '8', ' ', ' ' ) ||
  229.              p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', '8', ' ', ' ' ) )
  230.     {
  231.         p_dec->fmt_out.i_codec = p_dec->fmt_in.i_codec;
  232.         p_dec->fmt_in.audio.i_bitspersample = 8;
  233.     }
  234.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
  235.     {
  236.         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  237.         {
  238.         case 4:
  239.             p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
  240.             break;
  241.         case 8:
  242.             p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','6','4');
  243.             break;
  244.         default:
  245.             msg_Err( p_dec, "bad parameters(bits/sample)" );
  246.             return VLC_EGENERIC;
  247.         }
  248.     }
  249.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
  250.     {
  251.         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  252.         {
  253.         case 1:
  254.             p_dec->fmt_out.i_codec = VLC_FOURCC('u','8',' ',' ');
  255.             break;
  256.         case 2:
  257.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
  258.             break;
  259.         case 3:
  260.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
  261.             break;
  262.         case 4:
  263.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
  264.             break;
  265.         default:
  266.             msg_Err( p_dec, "bad parameters(bits/sample)" );
  267.             return VLC_EGENERIC;
  268.         }
  269.     }
  270.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 't', 'w', 'o', 's' ) )
  271.     {
  272.         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  273.         {
  274.         case 1:
  275.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
  276.             break;
  277.         case 2:
  278.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b');
  279.             break;
  280.         case 3:
  281.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b');
  282.             break;
  283.         case 4:
  284.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','b');
  285.             break;
  286.         default:
  287.             msg_Err( p_dec, "bad parameters(bits/sample)" );
  288.             return VLC_EGENERIC;
  289.         }
  290.     }
  291.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 's', 'o', 'w', 't' ) )
  292.     {
  293.         switch( ( p_dec->fmt_in.audio.i_bitspersample + 7 ) / 8 )
  294.         {
  295.         case 1:
  296.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
  297.             break;
  298.         case 2:
  299.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','l');
  300.             break;
  301.         case 3:
  302.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','l');
  303.             break;
  304.         case 4:
  305.             p_dec->fmt_out.i_codec = VLC_FOURCC('s','3','2','l');
  306.             break;
  307.         default:
  308.             msg_Err( p_dec, "bad parameters(bits/sample)" );
  309.             return VLC_EGENERIC;
  310.         }
  311.     }
  312.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'l', 'a', 'w' ) )
  313.     {
  314.         p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
  315.         p_sys->p_logtos16  = alawtos16;
  316.         p_dec->fmt_in.audio.i_bitspersample = 8;
  317.     }
  318.     else if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', 'l', 'a', 'w' ) ||
  319.              p_dec->fmt_in.i_codec == VLC_FOURCC( 'm', 'l', 'a', 'w' ) )
  320.     {
  321.         p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
  322.         p_sys->p_logtos16  = ulawtos16;
  323.         p_dec->fmt_in.audio.i_bitspersample = 8;
  324.     }
  325.     /* Set output properties */
  326.     p_dec->fmt_out.i_cat = AUDIO_ES;
  327.     p_dec->fmt_out.audio.i_rate = p_dec->fmt_in.audio.i_rate;
  328.     p_dec->fmt_out.audio.i_channels = p_dec->fmt_in.audio.i_channels;
  329.     p_dec->fmt_out.audio.i_bitspersample = p_dec->fmt_in.audio.i_bitspersample;
  330.     p_dec->fmt_out.audio.i_physical_channels =
  331.         p_dec->fmt_out.audio.i_original_channels =
  332.             pi_channels_maps[p_dec->fmt_in.audio.i_channels];
  333.     if( p_dec->fmt_in.audio.i_physical_channels )
  334.         p_dec->fmt_out.audio.i_physical_channels =
  335.             p_dec->fmt_in.audio.i_physical_channels;
  336.     if( p_dec->fmt_in.audio.i_original_channels )
  337.         p_dec->fmt_out.audio.i_original_channels =
  338.             p_dec->fmt_in.audio.i_original_channels;
  339.     if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'l', 'a', 'w' ) ||
  340.         p_dec->fmt_in.i_codec == VLC_FOURCC( 'u', 'l', 'a', 'w' ) ||
  341.         p_dec->fmt_in.i_codec == VLC_FOURCC( 'm', 'l', 'a', 'w' ) )
  342.     {
  343.         p_dec->fmt_out.audio.i_bitspersample = 16;
  344.     }
  345.     aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
  346.     aout_DateSet( &p_sys->end_date, 0 );
  347.     p_dec->pf_decode_audio = DecodeBlock;
  348.     return VLC_SUCCESS;
  349. }
  350. /****************************************************************************
  351.  * DecodeBlock: the whole thing
  352.  ****************************************************************************
  353.  * This function must be fed with whole samples (see nBlockAlign).
  354.  ****************************************************************************/
  355. static aout_buffer_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
  356. {
  357.     decoder_sys_t *p_sys = p_dec->p_sys;
  358.     block_t *p_block;
  359.     aout_buffer_t *p_out;
  360.     int i_samples;
  361.     if( !pp_block || !*pp_block ) return NULL;
  362.     p_block = *pp_block;
  363.     if( p_block->i_pts != 0 &&
  364.         p_block->i_pts != aout_DateGet( &p_sys->end_date ) )
  365.     {
  366.         aout_DateSet( &p_sys->end_date, p_block->i_pts );
  367.     }
  368.     else if( !aout_DateGet( &p_sys->end_date ) )
  369.     {
  370.         /* We've just started the stream, wait for the first PTS. */
  371.         block_Release( p_block );
  372.         return NULL;
  373.     }
  374.     /* Don't re-use the same pts twice */
  375.     p_block->i_pts = 0;
  376.     i_samples = p_block->i_buffer * 8 / p_dec->fmt_in.audio.i_bitspersample /
  377.         p_dec->fmt_in.audio.i_channels;
  378.     if( i_samples <= 0 )
  379.     {
  380.         block_Release( p_block );
  381.         return NULL;
  382.     }
  383.     /* Create chunks of max 1024 samples */
  384.     i_samples = __MIN( i_samples, 1024 );
  385.     p_out = p_dec->pf_aout_buffer_new( p_dec, i_samples );
  386.     if( p_out == NULL )
  387.     {
  388.         block_Release( p_block );
  389.         return NULL;
  390.     }
  391.     p_out->start_date = aout_DateGet( &p_sys->end_date );
  392.     p_out->end_date   = aout_DateIncrement( &p_sys->end_date, i_samples );
  393.     if( p_sys->p_logtos16 )
  394.     {
  395.         int16_t *s = (int16_t*)p_out->p_buffer;
  396.         unsigned int i;
  397.         for( i = 0; i < p_out->i_nb_bytes / 2; i++ )
  398.         {
  399.             *s++ = p_sys->p_logtos16[*p_block->p_buffer++];
  400.             p_block->i_buffer--;
  401.         }
  402.     }
  403.     else
  404.     {
  405.         memcpy( p_out->p_buffer, p_block->p_buffer, p_out->i_nb_bytes );
  406.         p_block->p_buffer += p_out->i_nb_bytes;
  407.         p_block->i_buffer -= p_out->i_nb_bytes;
  408.     }
  409.     return p_out;
  410. }
  411. /*****************************************************************************
  412.  * DecoderClose: decoder destruction
  413.  *****************************************************************************/
  414. static void DecoderClose( vlc_object_t *p_this )
  415. {
  416.     decoder_t *p_dec = (decoder_t *)p_this;
  417.     free( p_dec->p_sys );
  418. }
  419. /*****************************************************************************
  420.  * EncoderOpen:
  421.  *****************************************************************************/
  422. static int EncoderOpen( vlc_object_t *p_this )
  423. {
  424.     encoder_t *p_enc = (encoder_t *)p_this;
  425.     if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','8',' ',' ') ||
  426.         p_enc->fmt_out.i_codec == VLC_FOURCC('s','8',' ',' ') )
  427.     {
  428.         p_enc->fmt_out.audio.i_bitspersample = 8;
  429.     }
  430.     else if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','1','6','l') ||
  431.              p_enc->fmt_out.i_codec == VLC_FOURCC('u','1','6','b') ||
  432.              p_enc->fmt_out.i_codec == VLC_FOURCC('s','1','6','l') ||
  433.              p_enc->fmt_out.i_codec == VLC_FOURCC('s','1','6','b') )
  434.     {
  435.         p_enc->fmt_out.audio.i_bitspersample = 16;
  436.     }
  437.     else if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','2','4','l') ||
  438.              p_enc->fmt_out.i_codec == VLC_FOURCC('u','2','4','b') ||
  439.              p_enc->fmt_out.i_codec == VLC_FOURCC('s','2','4','l') ||
  440.              p_enc->fmt_out.i_codec == VLC_FOURCC('s','2','4','b') )
  441.     {
  442.         p_enc->fmt_out.audio.i_bitspersample = 24;
  443.     }
  444.     else if( p_enc->fmt_out.i_codec == VLC_FOURCC('u','3','2','l') ||
  445.              p_enc->fmt_out.i_codec == VLC_FOURCC('u','3','2','b') ||
  446.              p_enc->fmt_out.i_codec == VLC_FOURCC('s','3','2','l') ||
  447.              p_enc->fmt_out.i_codec == VLC_FOURCC('s','3','2','b') ||
  448.              p_enc->fmt_out.i_codec == VLC_FOURCC('f','i','3','2') ||
  449.              p_enc->fmt_out.i_codec == VLC_FOURCC('f','l','3','2') )
  450.     {
  451.         p_enc->fmt_out.audio.i_bitspersample = 32;
  452.     }
  453.     else if( p_enc->fmt_out.i_codec == VLC_FOURCC('f','l','6','4') )
  454.     {
  455.         p_enc->fmt_out.audio.i_bitspersample = 64;
  456.     }
  457.     else
  458.     {
  459.         return VLC_EGENERIC;
  460.     }
  461.     p_enc->p_sys = NULL;
  462.     p_enc->pf_encode_audio = EncoderEncode;
  463.     p_enc->fmt_in.i_codec = p_enc->fmt_out.i_codec;
  464.     return VLC_SUCCESS;
  465. }
  466. /*****************************************************************************
  467.  * EncoderClose:
  468.  *****************************************************************************/
  469. static void EncoderClose ( vlc_object_t *p_this )
  470. {
  471.     return;
  472. }
  473. /*****************************************************************************
  474.  * EncoderEncode:
  475.  *****************************************************************************/
  476. static block_t *EncoderEncode( encoder_t *p_enc, aout_buffer_t *p_aout_buf )
  477. {
  478.     block_t *p_block = NULL;
  479.     if( !p_aout_buf || !p_aout_buf->i_nb_bytes ) return NULL;
  480.     if( ( p_block = block_New( p_enc, p_aout_buf->i_nb_bytes ) ) )
  481.     {
  482.         memcpy( p_block->p_buffer, p_aout_buf->p_buffer,
  483.                 p_aout_buf->i_nb_bytes );
  484.     }
  485.     if( p_block )
  486.     {
  487.         p_block->i_dts = p_block->i_pts = p_aout_buf->start_date;
  488.         p_block->i_length = (int64_t)p_aout_buf->i_nb_samples *
  489.             (int64_t)1000000 / p_enc->fmt_in.audio.i_rate;
  490.     }
  491.     return p_block;
  492. }