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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * mpeg4audio.c: parse and packetize an MPEG 4 audio stream
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002 VideoLAN
  5.  * $Id: mpeg4audio.c 6961 2004-03-05 17:34:23Z sam $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Gildas Bazin <gbazin@netcourrier.com>
  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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #include <stdlib.h>                                      /* malloc(), free() */
  28. #include <string.h>                                              /* strdup() */
  29. #include <vlc/vlc.h>
  30. #include <vlc/aout.h>
  31. #include <vlc/decoder.h>
  32. #include <vlc/input.h>
  33. #include <vlc/sout.h>
  34. #include "codecs.h"
  35. #include "vlc_block_helper.h"
  36. /* AAC Config in ES:
  37.  *
  38.  * AudioObjectType          5 bits
  39.  * samplingFrequencyIndex   4 bits
  40.  * if (samplingFrequencyIndex == 0xF)
  41.  *  samplingFrequency   24 bits
  42.  * channelConfiguration     4 bits
  43.  * GA_SpecificConfig
  44.  *  FrameLengthFlag         1 bit 1024 or 960
  45.  *  DependsOnCoreCoder      1 bit (always 0)
  46.  *  ExtensionFlag           1 bit (always 0)
  47.  */
  48. /*****************************************************************************
  49.  * decoder_sys_t : decoder descriptor
  50.  *****************************************************************************/
  51. struct decoder_sys_t
  52. {
  53.     /*
  54.      * Input properties
  55.      */
  56.     int i_state;
  57.     block_bytestream_t bytestream;
  58.     /*
  59.      * Common properties
  60.      */
  61.     audio_date_t end_date;
  62.     mtime_t i_pts;
  63.     int i_frame_size, i_raw_blocks;
  64.     unsigned int i_channels;
  65.     unsigned int i_rate, i_frame_length, i_header_size;
  66. };
  67. enum {
  68.     STATE_NOSYNC,
  69.     STATE_SYNC,
  70.     STATE_HEADER,
  71.     STATE_NEXT_SYNC,
  72.     STATE_GET_DATA,
  73.     STATE_SEND_DATA
  74. };
  75. static int i_sample_rates[] =
  76. {
  77.     96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
  78.     16000, 12000, 11025, 8000,  7350,  0,     0,     0
  79. };
  80. #define ADTS_HEADER_SIZE 9
  81. /****************************************************************************
  82.  * Local prototypes
  83.  ****************************************************************************/
  84. static int  OpenPacketizer( vlc_object_t * );
  85. static void ClosePacketizer( vlc_object_t * );
  86. static block_t *PacketizeBlock    ( decoder_t *, block_t ** );
  87. static block_t *ADTSPacketizeBlock( decoder_t *, block_t ** );
  88. static uint8_t *GetOutBuffer ( decoder_t *, void ** );
  89. static int ADTSSyncInfo( decoder_t *, const byte_t * p_buf,
  90.                          unsigned int * pi_channels,
  91.                          unsigned int * pi_sample_rate,
  92.                          unsigned int * pi_frame_length,
  93.                          unsigned int * pi_header_size,
  94.                          unsigned int * pi_raw_blocks );
  95. /*****************************************************************************
  96.  * Module descriptor
  97.  *****************************************************************************/
  98. vlc_module_begin();
  99.     set_description( _("MPEG4 audio packetizer") );
  100.     set_capability( "packetizer", 50 );
  101.     set_callbacks( OpenPacketizer, ClosePacketizer );
  102. vlc_module_end();
  103. /*****************************************************************************
  104.  * OpenPacketizer: probe the packetizer and return score
  105.  *****************************************************************************/
  106. static int OpenPacketizer( vlc_object_t *p_this )
  107. {
  108.     decoder_t *p_dec = (decoder_t*)p_this;
  109.     decoder_sys_t *p_sys;
  110.     if( p_dec->fmt_in.i_codec != VLC_FOURCC( 'm', 'p', '4', 'a' ) )
  111.     {
  112.         return VLC_EGENERIC;
  113.     }
  114.     /* Allocate the memory needed to store the decoder's structure */
  115.     if( ( p_dec->p_sys = p_sys =
  116.           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
  117.     {
  118.         msg_Err( p_dec, "out of memory" );
  119.         return VLC_EGENERIC;
  120.     }
  121.     /* Misc init */
  122.     p_sys->i_state = STATE_NOSYNC;
  123.     aout_DateSet( &p_sys->end_date, 0 );
  124.     p_sys->bytestream = block_BytestreamInit( p_dec );
  125.     /* Set output properties */
  126.     p_dec->fmt_out.i_cat = AUDIO_ES;
  127.     p_dec->fmt_out.i_codec = VLC_FOURCC('m','p','4','a');
  128.     /* Set callback */
  129.     p_dec->pf_packetize = PacketizeBlock;
  130.     msg_Info( p_dec, "running MPEG4 audio packetizer" );
  131.     if( p_dec->fmt_in.i_extra > 0 )
  132.     {
  133.         uint8_t *p_config = (uint8_t*)p_dec->fmt_in.p_extra;
  134.         int     i_index;
  135.         i_index = ( ( p_config[0] << 1 ) | ( p_config[1] >> 7 ) ) & 0x0f;
  136.         if( i_index != 0x0f )
  137.         {
  138.             p_dec->fmt_out.audio.i_rate = i_sample_rates[i_index];
  139.             p_dec->fmt_out.audio.i_frame_length =
  140.                 (( p_config[1] >> 2 ) & 0x01) ? 960 : 1024;
  141.         }
  142.         else
  143.         {
  144.             p_dec->fmt_out.audio.i_rate = ( ( p_config[1] & 0x7f ) << 17 ) |
  145.                 ( p_config[2] << 9 ) | ( p_config[3] << 1 ) |
  146.                 ( p_config[4] >> 7 );
  147.             p_dec->fmt_out.audio.i_frame_length =
  148.                 (( p_config[4] >> 2 ) & 0x01) ? 960 : 1024;
  149.         }
  150.         msg_Dbg( p_dec, "AAC %dHz %d samples/frame",
  151.                  p_dec->fmt_out.audio.i_rate,
  152.                  p_dec->fmt_out.audio.i_frame_length );
  153.         aout_DateInit( &p_sys->end_date, p_dec->fmt_out.audio.i_rate );
  154.         p_dec->fmt_out.audio.i_channels = p_dec->fmt_in.audio.i_channels;
  155.         p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
  156.         p_dec->fmt_out.p_extra = malloc( p_dec->fmt_in.i_extra );
  157.         memcpy( p_dec->fmt_out.p_extra, p_dec->fmt_in.p_extra,
  158.                 p_dec->fmt_in.i_extra );
  159.     }
  160.     else
  161.     {
  162.         msg_Dbg( p_dec, "no decoder specific info, must be an ADTS stream" );
  163.         /* We will try to create a AAC Config from adts */
  164.         p_dec->fmt_out.i_extra = 0;
  165.         p_dec->fmt_out.p_extra = NULL;
  166.         p_dec->pf_packetize = ADTSPacketizeBlock;
  167.     }
  168.     return VLC_SUCCESS;
  169. }
  170. /****************************************************************************
  171.  * PacketizeBlock: the whole thing
  172.  ****************************************************************************
  173.  * This function must be fed with complete frames.
  174.  ****************************************************************************/
  175. static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
  176. {
  177.     decoder_sys_t *p_sys = p_dec->p_sys;
  178.     block_t *p_block;
  179.     if( !pp_block || !*pp_block ) return NULL;
  180.     p_block = *pp_block;
  181.     *pp_block = NULL; /* Don't reuse this block */
  182.     if( !aout_DateGet( &p_sys->end_date ) && !p_block->i_pts )
  183.     {
  184.         /* We've just started the stream, wait for the first PTS. */
  185.         block_Release( p_block );
  186.         return NULL;
  187.     }
  188.     else if( p_block->i_pts != 0 &&
  189.              p_block->i_pts != aout_DateGet( &p_sys->end_date ) )
  190.     {
  191.         aout_DateSet( &p_sys->end_date, p_block->i_pts );
  192.     }
  193.     p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date );
  194.     p_block->i_length = aout_DateIncrement( &p_sys->end_date,
  195.         p_dec->fmt_out.audio.i_frame_length ) - p_block->i_pts;
  196.     return p_block;
  197. }
  198. /****************************************************************************
  199.  * DTSPacketizeBlock: the whole thing
  200.  ****************************************************************************/
  201. static block_t *ADTSPacketizeBlock( decoder_t *p_dec, block_t **pp_block )
  202. {
  203.     decoder_sys_t *p_sys = p_dec->p_sys;
  204.     uint8_t p_header[ADTS_HEADER_SIZE];
  205.     void *p_out_buffer;
  206.     uint8_t *p_buf;
  207.     if( !pp_block || !*pp_block ) return NULL;
  208.     if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
  209.     {
  210.         /* We've just started the stream, wait for the first PTS. */
  211.         block_Release( *pp_block );
  212.         return NULL;
  213.     }
  214.     if( (*pp_block)->i_flags&BLOCK_FLAG_DISCONTINUITY )
  215.     {
  216.         p_sys->i_state = STATE_NOSYNC;
  217.     }
  218.     block_BytestreamPush( &p_sys->bytestream, *pp_block );
  219.     while( 1 )
  220.     {
  221.         switch( p_sys->i_state )
  222.         {
  223.         case STATE_NOSYNC:
  224.             while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
  225.                    == VLC_SUCCESS )
  226.             {
  227.                 /* Look for sync word - should be 0xfff + 2 layer bits */
  228.                 if( p_header[0] == 0xff && (p_header[1] & 0xf6) == 0xf0 )
  229.                 {
  230.                     p_sys->i_state = STATE_SYNC;
  231.                     break;
  232.                 }
  233.                 block_SkipByte( &p_sys->bytestream );
  234.             }
  235.             if( p_sys->i_state != STATE_SYNC )
  236.             {
  237.                 block_BytestreamFlush( &p_sys->bytestream );
  238.                 /* Need more data */
  239.                 return NULL;
  240.             }
  241.         case STATE_SYNC:
  242.             /* New frame, set the Presentation Time Stamp */
  243.             p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
  244.             if( p_sys->i_pts != 0 &&
  245.                 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
  246.             {
  247.                 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
  248.             }
  249.             p_sys->i_state = STATE_HEADER;
  250.             break;
  251.         case STATE_HEADER:
  252.             /* Get ADTS frame header (ADTS_HEADER_SIZE bytes) */
  253.             if( block_PeekBytes( &p_sys->bytestream, p_header,
  254.                                  ADTS_HEADER_SIZE ) != VLC_SUCCESS )
  255.             {
  256.                 /* Need more data */
  257.                 return NULL;
  258.             }
  259.             /* Check if frame is valid and get frame info */
  260.             p_sys->i_frame_size = ADTSSyncInfo( p_dec, p_header,
  261.                                                 &p_sys->i_channels,
  262.                                                 &p_sys->i_rate,
  263.                                                 &p_sys->i_frame_length,
  264.                                                 &p_sys->i_header_size,
  265.                                                 &p_sys->i_raw_blocks );
  266.             if( p_sys->i_frame_size <= 0 )
  267.             {
  268.                 msg_Dbg( p_dec, "emulated sync word" );
  269.                 block_SkipByte( &p_sys->bytestream );
  270.                 p_sys->i_state = STATE_NOSYNC;
  271.                 break;
  272.             }
  273.             p_sys->i_state = STATE_NEXT_SYNC;
  274.         case STATE_NEXT_SYNC:
  275.             /* TODO: If p_block == NULL, flush the buffer without checking the
  276.              * next sync word */
  277.             /* Check if next expected frame contains the sync word */
  278.             if( block_PeekOffsetBytes( &p_sys->bytestream, p_sys->i_frame_size
  279.                                        + p_sys->i_header_size, p_header, 2 )
  280.                 != VLC_SUCCESS )
  281.             {
  282.                 /* Need more data */
  283.                 return NULL;
  284.             }
  285.             if( p_header[0] != 0xff || (p_header[1] & 0xf6) != 0xf0 )
  286.             {
  287.                 msg_Dbg( p_dec, "emulated sync word "
  288.                          "(no sync on following frame)" );
  289.                 p_sys->i_state = STATE_NOSYNC;
  290.                 block_SkipByte( &p_sys->bytestream );
  291.                 break;
  292.             }
  293.             p_sys->i_state = STATE_SEND_DATA;
  294.             break;
  295.         case STATE_GET_DATA:
  296.             /* Make sure we have enough data.
  297.              * (Not useful if we went through NEXT_SYNC) */
  298.             if( block_WaitBytes( &p_sys->bytestream, p_sys->i_frame_size +
  299.                                  p_sys->i_header_size) != VLC_SUCCESS )
  300.             {
  301.                 /* Need more data */
  302.                 return NULL;
  303.             }
  304.             p_sys->i_state = STATE_SEND_DATA;
  305.         case STATE_SEND_DATA:
  306.             if( !(p_buf = GetOutBuffer( p_dec, &p_out_buffer )) )
  307.             {
  308.                 //p_dec->b_error = VLC_TRUE;
  309.                 return NULL;
  310.             }
  311.             /* When we reach this point we already know we have enough
  312.              * data available. */
  313.             /* Skip the ADTS header */
  314.             block_SkipBytes( &p_sys->bytestream, p_sys->i_header_size );
  315.             /* Copy the whole frame into the buffer */
  316.             block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
  317.             /* Make sure we don't reuse the same pts twice */
  318.             if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
  319.                 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
  320.             /* So p_block doesn't get re-added several times */
  321.             *pp_block = block_BytestreamPop( &p_sys->bytestream );
  322.             p_sys->i_state = STATE_NOSYNC;
  323.             return p_out_buffer;
  324.         }
  325.     }
  326.     return NULL;
  327. }
  328. /*****************************************************************************
  329.  * GetOutBuffer:
  330.  *****************************************************************************/
  331. static uint8_t *GetOutBuffer( decoder_t *p_dec, void **pp_out_buffer )
  332. {
  333.     decoder_sys_t *p_sys = p_dec->p_sys;
  334.     block_t *p_block;
  335.     if( p_dec->fmt_out.audio.i_rate != p_sys->i_rate )
  336.     {
  337.         msg_Info( p_dec, "AAC channels: %d samplerate: %d",
  338.                   p_sys->i_channels, p_sys->i_rate );
  339.         aout_DateInit( &p_sys->end_date, p_sys->i_rate );
  340.         aout_DateSet( &p_sys->end_date, p_sys->i_pts );
  341.     }
  342.     p_dec->fmt_out.audio.i_rate     = p_sys->i_rate;
  343.     p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
  344.     p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->i_frame_size;
  345.     p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
  346. #if 0
  347.     p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
  348.     p_dec->fmt_out.audio.i_physical_channels =
  349.         p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
  350. #endif
  351.     p_block = block_New( p_dec, p_sys->i_frame_size );
  352.     if( p_block == NULL ) return NULL;
  353.     p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date );
  354.     p_block->i_length = aout_DateIncrement( &p_sys->end_date,
  355.                             p_sys->i_frame_length ) - p_block->i_pts;
  356.     *pp_out_buffer = p_block;
  357.     return p_block->p_buffer;
  358. }
  359. /*****************************************************************************
  360.  * ClosePacketizer: clean up the packetizer
  361.  *****************************************************************************/
  362. static void ClosePacketizer( vlc_object_t *p_this )
  363. {
  364.     decoder_t *p_dec = (decoder_t *)p_this;
  365.     decoder_sys_t *p_sys = p_dec->p_sys;
  366.     block_BytestreamRelease( &p_sys->bytestream );
  367.     free( p_dec->p_sys );
  368. }
  369. /*****************************************************************************
  370.  * ADTSSyncInfo: parse MPEG 4 audio ADTS sync info
  371.  *****************************************************************************/
  372. static int ADTSSyncInfo( decoder_t * p_dec, const byte_t * p_buf,
  373.                          unsigned int * pi_channels,
  374.                          unsigned int * pi_sample_rate,
  375.                          unsigned int * pi_frame_length,
  376.                          unsigned int * pi_header_size,
  377.                          unsigned int * pi_raw_blocks_in_frame )
  378. {
  379.     int i_id, i_profile, i_sample_rate_idx, i_frame_size;
  380.     vlc_bool_t b_crc;
  381.     /* Fixed header between frames */
  382.     i_id = ( (p_buf[1] >> 3) & 0x01 ) ? 2 : 4;
  383.     b_crc = !(p_buf[1] & 0x01);
  384.     i_profile = p_buf[2] >> 6;
  385.     i_sample_rate_idx = (p_buf[2] >> 2) & 0x0f;
  386.     *pi_sample_rate = i_sample_rates[i_sample_rate_idx];
  387.     *pi_channels = ((p_buf[2] & 0x01) << 2) | ((p_buf[3] >> 6) & 0x03);
  388.     /* Variable header */
  389.     i_frame_size = ((p_buf[3] & 0x03) << 11) | (p_buf[4] << 3) |
  390.                    ((p_buf[5] >> 5) & 0x7);
  391.     *pi_raw_blocks_in_frame = (p_buf[6] & 0x02) + 1;
  392.     if( !*pi_sample_rate || !*pi_channels || !i_frame_size )
  393.     {
  394.         return 0;
  395.     }
  396.     /* Fixme */
  397.     *pi_frame_length = 1024;
  398.     /* Build the decoder specific info header */
  399.     if( !p_dec->fmt_out.i_extra )
  400.     {
  401.         p_dec->fmt_out.i_extra = 2;
  402.         p_dec->fmt_out.p_extra = malloc( 2 );
  403.         ((uint8_t *)p_dec->fmt_out.p_extra)[0] =
  404.             (i_profile + 1) << 3 | (i_sample_rate_idx >> 1);
  405.         ((uint8_t *)p_dec->fmt_out.p_extra)[1] =
  406.             ((i_sample_rate_idx & 0x01) << 7) | (*pi_channels <<3);
  407.     }
  408.     /* ADTS header length */
  409.     *pi_header_size = b_crc ? 9 : 7;
  410.     return i_frame_size - *pi_header_size;
  411. }