]> git.sesse.net Git - vlc/blobdiff - include/ac3_decoder.h
Bon, puisque �a semble commiter sous BeOS, je commite.
[vlc] / include / ac3_decoder.h
index 269f123b865b7af4a38cb4c09f4d706b967bccd1..7ba3061737cdd59a77172057e52f4919324efa7e 100644 (file)
@@ -1,19 +1,56 @@
 /*****************************************************************************
- * ac3_decoder.h : ac3 decoder thread interface
- * (c)1999 VideoLAN
+ * ac3_decoder.h : ac3 decoder interface
+ *****************************************************************************
+ * Copyright (C) 1999, 2000 VideoLAN
+ *
+ * Authors:
+ * Michel Kaempf <maxx@via.ecp.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  *****************************************************************************/
 
-/* Exponent strategy constants */
-#define EXP_REUSE       (0)
-#define EXP_D15         (1)
-#define EXP_D25         (2)
-#define EXP_D45         (3)
+/**** ac3 decoder API - public ac3 decoder structures */
+
+typedef struct ac3dec_s ac3dec_t;
+
+typedef struct ac3_sync_info_s {
+    int sample_rate;   /* sample rate in Hz */
+    int frame_size;    /* frame size in bytes */
+    int bit_rate;      /* nominal bit rate in kbps */
+} ac3_sync_info_t;
+
+typedef struct ac3_byte_stream_s {
+    u8 * p_byte;
+    u8 * p_end;
+    void * info;
+} ac3_byte_stream_t;
+
+/**** ac3 decoder API - functions publically provided by the ac3 decoder ****/
+
+int ac3_init (ac3dec_t * p_ac3dec);
+int ac3_sync_frame (ac3dec_t * p_ac3dec, ac3_sync_info_t * p_sync_info);
+int ac3_decode_frame (ac3dec_t * p_ac3dec, s16 * buffer);
+static ac3_byte_stream_t * ac3_byte_stream (ac3dec_t * p_ac3dec);
+
+/**** ac3 decoder API - user functions to be provided to the ac3 decoder ****/
+
+void ac3_byte_stream_next (ac3_byte_stream_t * p_byte_stream);
 
-/* Delta bit allocation constants */
-#define DELTA_BIT_REUSE         (0)
-#define DELTA_BIT_NEW           (1)
-#define DELTA_BIT_NONE          (2)
-#define DELTA_BIT_RESERVED      (3)
+/**** EVERYTHING AFTER THIS POINT IS PRIVATE ! DO NOT USE DIRECTLY ****/
+
+/**** ac3 decoder internal structures ****/
 
 /* The following structures are filled in by their corresponding parse_*
  * functions. See http://www.atsc.org/Standards/A52/a_52.pdf for
  * conditional fields.
  */
 
-typedef struct syncinfo_s
-{
-        /* Sync word == 0x0B77 */
-        /* u16   syncword; */
-        /* crc for the first 5/8 of the sync block */
-        /* u16   crc1; */
-        /* Stream Sampling Rate (kHz) 0 = 48, 1 = 44.1, 2 = 32, 3 = reserved */
-        u16             fscod;
-        /* Frame size code */
-        u16             frmsizecod;
-
-        /* Information not in the AC-3 bitstream, but derived */
-        /* Frame size in 16 bit words */
-        u16 frame_size;
-        /* Bit rate in kilobits */
-        u16 bit_rate;
-
+typedef struct syncinfo_s {
+    /* Sync word == 0x0B77 */
+    /* u16 syncword; */
+    /* crc for the first 5/8 of the sync block */
+    /* u16 crc1; */
+    /* Stream Sampling Rate (kHz) 0 = 48, 1 = 44.1, 2 = 32, 3 = reserved */
+    u16 fscod;
+    /* Frame size code */
+    u16 frmsizecod;
+
+    /* Information not in the AC-3 bitstream, but derived */
+    /* Frame size in 16 bit words */
+    u16 frame_size;
+    /* Bit rate in kilobits */
+    //u16 bit_rate;
 } syncinfo_t;
 
-typedef struct bsi_s
-{
-        /* Bit stream identification == 0x8 */
-        u16 bsid;
-        /* Bit stream mode */
-        u16 bsmod;
-        /* Audio coding mode */
-        u16 acmod;
-        /* If we're using the centre channel then */
-                /* centre mix level */
-                u16 cmixlev;
-        /* If we're using the surround channel then */
-                /* surround mix level */
-                u16 surmixlev;
-        /* If we're in 2/0 mode then */
-                /* Dolby surround mix level - NOT USED - */
-                u16 dsurmod;
-        /* Low frequency effects on */
-        u16 lfeon;
-        /* Dialogue Normalization level */
-        u16 dialnorm;
-        /* Compression exists */
-        u16 compre;
-                /* Compression level */
-                u16 compr;
-        /* Language code exists */
-        u16 langcode;
-                /* Language code */
-                u16 langcod;
-        /* Audio production info exists*/
-        u16 audprodie;
-                u16 mixlevel;
-                u16 roomtyp;
-        /* If we're in dual mono mode (acmod == 0) then extra stuff */
-                u16 dialnorm2;
-                u16 compr2e;
-                        u16 compr2;
-                u16 langcod2e;
-                        u16 langcod2;
-                u16 audprodi2e;
-                        u16 mixlevel2;
-                        u16 roomtyp2;
-        /* Copyright bit */
-        u16 copyrightb;
-        /* Original bit */
-        u16 origbs;
-        /* Timecode 1 exists */
-        u16 timecod1e;
-                /* Timecode 1 */
-                u16 timecod1;
-        /* Timecode 2 exists */
-        u16 timecod2e;
-                /* Timecode 2 */
-                u16 timecod2;
-        /* Additional bit stream info exists */
-        u16 addbsie;
-                /* Additional bit stream length - 1 (in bytes) */
-                u16 addbsil;
-                /* Additional bit stream information (max 64 bytes) */
-                u8      addbsi[64];
-
-        /* Information not in the AC-3 bitstream, but derived */
-        /* Number of channels (excluding LFE)
-         * Derived from acmod */
-        u16 nfchans;
-
+typedef struct bsi_s {
+    /* Bit stream identification == 0x8 */
+    u16 bsid;
+    /* Bit stream mode */
+    u16 bsmod;
+    /* Audio coding mode */
+    u16 acmod;
+    /* If we're using the centre channel then */
+        /* centre mix level */
+        u16 cmixlev;
+    /* If we're using the surround channel then */
+        /* surround mix level */
+        u16 surmixlev;
+    /* If we're in 2/0 mode then */
+        /* Dolby surround mix level - NOT USED - */
+        u16 dsurmod;
+    /* Low frequency effects on */
+    u16 lfeon;
+    /* Dialogue Normalization level */
+    u16 dialnorm;
+    /* Compression exists */
+    u16 compre;
+        /* Compression level */
+        u16 compr;
+    /* Language code exists */
+    u16 langcode;
+        /* Language code */
+        u16 langcod;
+    /* Audio production info exists*/
+    u16 audprodie;
+        u16 mixlevel;
+        u16 roomtyp;
+    /* If we're in dual mono mode (acmod == 0) then extra stuff */
+        u16 dialnorm2;
+        u16 compr2e;
+            u16 compr2;
+        u16 langcod2e;
+            u16 langcod2;
+        u16 audprodi2e;
+            u16 mixlevel2;
+            u16 roomtyp2;
+    /* Copyright bit */
+    u16 copyrightb;
+    /* Original bit */
+    u16 origbs;
+    /* Timecode 1 exists */
+    u16 timecod1e;
+        /* Timecode 1 */
+        u16 timecod1;
+    /* Timecode 2 exists */
+    u16 timecod2e;
+        /* Timecode 2 */
+        u16 timecod2;
+    /* Additional bit stream info exists */
+    u16 addbsie;
+        /* Additional bit stream length - 1 (in bytes) */
+        u16 addbsil;
+        /* Additional bit stream information (max 64 bytes) */
+        u8 addbsi[64];
+
+    /* Information not in the AC-3 bitstream, but derived */
+    /* Number of channels (excluding LFE)
+     * Derived from acmod */
+    u16 nfchans;
 } bsi_t;
 
 /* more pain */
-typedef struct audblk_s
-{
-        /* block switch bit indexed by channel num */
-        u16 blksw[5];
-        /* dither enable bit indexed by channel num */
-        u16 dithflag[5];
-        /* dynamic range gain exists */
-        u16 dynrnge;
-                /* dynamic range gain */
-                u16 dynrng;
-        /* if acmod==0 then */
-        /* dynamic range 2 gain exists */
-        u16 dynrng2e;
-                /* dynamic range 2 gain */
-                u16 dynrng2;
-        /* coupling strategy exists */
-        u16 cplstre;
-                /* coupling in use */
-                u16 cplinu;
-                        /* channel coupled */
-                        u16 chincpl[5];
-                        /* if acmod==2 then */
-                                /* Phase flags in use */
-                                u16 phsflginu;
-                        /* coupling begin frequency code */
-                        u16 cplbegf;
-                        /* coupling end frequency code */
-                        u16 cplendf;
-                        /* coupling band structure bits */
-                        u16 cplbndstrc[18];
-                        /* Do coupling co-ords exist for this channel? */
-                        u16 cplcoe[5];
-                        /* Master coupling co-ordinate */
-                        u16 mstrcplco[5];
-                        /* Per coupling band coupling co-ordinates */
-                        u16 cplcoexp[5][18];
-                        u16     cplcomant[5][18];
-                        /* Phase flags for dual mono */
-                        u16 phsflg[18];
-        /* Is there a rematrixing strategy */
-        u16 rematstr;
-                /* Rematrixing bits */
-                u16 rematflg[4];
-        /* Coupling exponent strategy */
-        u16 cplexpstr;
-        /* Exponent strategy for full bandwidth channels */
-        u16 chexpstr[5];
-        /* Exponent strategy for lfe channel */
-        u16 lfeexpstr;
-        /* Channel bandwidth for independent channels */
-        u16 chbwcod[5];
-                /* The absolute coupling exponent */
-                u16 cplabsexp;
-                /* Coupling channel exponents (D15 mode gives 18 * 12 /3  encoded exponents */
-                u16 cplexps[18 * 12 / 3];
-        /* Sanity checking constant */
-        u32     magic2;
-        /* fbw channel exponents */
-        u16 exps[5][252 / 3];
-        /* channel gain range */
-        u16 gainrng[5];
-        /* low frequency exponents */
-        u16 lfeexps[3];
-
-        /* Bit allocation info */
-        u16 baie;
-                /* Slow decay code */
-                u16 sdcycod;
-                /* Fast decay code */
-                u16 fdcycod;
-                /* Slow gain code */
-                u16 sgaincod;
-                /* dB per bit code */
-                u16 dbpbcod;
-                /* masking floor code */
-                u16 floorcod;
-
-        /* SNR offset info */
-        u16 snroffste;
-                /* coarse SNR offset */
-                u16 csnroffst;
-                /* coupling fine SNR offset */
-                u16 cplfsnroffst;
-                /* coupling fast gain code */
-                u16 cplfgaincod;
-                /* fbw fine SNR offset */
-                u16 fsnroffst[5];
-                /* fbw fast gain code */
-                u16 fgaincod[5];
-                /* lfe fine SNR offset */
-                u16 lfefsnroffst;
-                /* lfe fast gain code */
-                u16 lfefgaincod;
-        
-        /* Coupling leak info */
-        u16 cplleake;
-                /* coupling fast leak initialization */
-                u16 cplfleak;
-                /* coupling slow leak initialization */
-                u16 cplsleak;
-        
-        /* delta bit allocation info */
-        u16 deltbaie;
-                /* coupling delta bit allocation exists */
-                u16 cpldeltbae;
-                /* fbw delta bit allocation exists */
-                u16 deltbae[5];
-                /* number of cpl delta bit segments */
-                u16 cpldeltnseg;
-                        /* coupling delta bit allocation offset */
-                        u16 cpldeltoffst[8];
-                        /* coupling delta bit allocation length */
-                        u16 cpldeltlen[8];
-                        /* coupling delta bit allocation length */
-                        u16 cpldeltba[8];
-                /* number of delta bit segments */
-                u16 deltnseg[5];
-                        /* fbw delta bit allocation offset */
-                        u16 deltoffst[5][8];
-                        /* fbw delta bit allocation length */
-                        u16 deltlen[5][8];
-                        /* fbw delta bit allocation length */
-                        u16 deltba[5][8];
-
-        /* skip length exists */
-        u16 skiple;
-                /* skip length */
-                u16 skipl;
-
-        /* channel mantissas */
-//      u16     chmant[5][256];
-
-        /* coupling mantissas */
-        float cplfbw[ 256 ];
-//      u16     cplmant[256];
-
-        /* coupling mantissas */
-//      u16     lfemant[7];
-
-        /*  -- Information not in the bitstream, but derived thereof  -- */
-
-        /* Number of coupling sub-bands */
-        u16 ncplsubnd;
-
-        /* Number of combined coupling sub-bands
-         * Derived from ncplsubnd and cplbndstrc */
-        u16 ncplbnd;
-
-        /* Number of exponent groups by channel
-         * Derived from strmant, endmant */
-        u16 nchgrps[5];
-
-        /* Number of coupling exponent groups
-         * Derived from cplbegf, cplendf, cplexpstr */
-        u16 ncplgrps;
-                        
-        /* End mantissa numbers of fbw channels */
-        u16 endmant[5];
-
-        /* Start and end mantissa numbers for the coupling channel */
-        u16 cplstrtmant;
-        u16 cplendmant;
-
-        /* Decoded exponent info */
-        u16 fbw_exp[5][256];
-        u16 cpl_exp[256];
-        u16 lfe_exp[7];
-
-        /* Bit allocation pointer results */
-        u16 fbw_bap[5][256];
-        //FIXME figure out exactly how many entries there should be (253-37?)
-        u16 cpl_bap[256];
-        u16 lfe_bap[7];
-
+typedef struct audblk_s {
+    /* block switch bit indexed by channel num */
+    u16 blksw[5];
+    /* dither enable bit indexed by channel num */
+    u16 dithflag[5];
+    /* dynamic range gain exists */
+    u16 dynrnge;
+        /* dynamic range gain */
+        u16 dynrng;
+    /* if acmod==0 then */
+    /* dynamic range 2 gain exists */
+    u16 dynrng2e;
+        /* dynamic range 2 gain */
+        u16 dynrng2;
+    /* coupling strategy exists */
+    u16 cplstre;
+        /* coupling in use */
+        u16 cplinu;
+            /* channel coupled */
+            u16 chincpl[5];
+            /* if acmod==2 then */
+                /* Phase flags in use */
+                u16 phsflginu;
+            /* coupling begin frequency code */
+            u16 cplbegf;
+            /* coupling end frequency code */
+            u16 cplendf;
+            /* coupling band structure bits */
+            u16 cplbndstrc[18];
+            /* Do coupling co-ords exist for this channel? */
+            u16 cplcoe[5];
+            /* Master coupling co-ordinate */
+            u16 mstrcplco[5];
+            /* Per coupling band coupling co-ordinates */
+            u16 cplcoexp[5][18];
+            u16 cplcomant[5][18];
+            /* Phase flags for dual mono */
+            u16 phsflg[18];
+    /* Is there a rematrixing strategy */
+    u16 rematstr;
+        /* Rematrixing bits */
+        u16 rematflg[4];
+    /* Coupling exponent strategy */
+    u16 cplexpstr;
+    /* Exponent strategy for full bandwidth channels */
+    u16 chexpstr[5];
+    /* Exponent strategy for lfe channel */
+    u16 lfeexpstr;
+    /* Channel bandwidth for independent channels */
+    u16 chbwcod[5];
+        /* The absolute coupling exponent */
+        u16 cplabsexp;
+        /* Coupling channel exponents (D15 mode gives 18 * 12 /3  encoded exponents */
+        u16 cplexps[18 * 12 / 3];
+    /* Sanity checking constant */
+    u32 magic2;
+    /* fbw channel exponents */
+    u16 exps[5][252 / 3];
+    /* channel gain range */
+    u16 gainrng[5];
+    /* low frequency exponents */
+    u16 lfeexps[3];
+
+    /* Bit allocation info */
+    u16 baie;
+        /* Slow decay code */
+        u16 sdcycod;
+        /* Fast decay code */
+        u16 fdcycod;
+        /* Slow gain code */
+        u16 sgaincod;
+        /* dB per bit code */
+        u16 dbpbcod;
+        /* masking floor code */
+        u16 floorcod;
+
+    /* SNR offset info */
+    u16 snroffste;
+        /* coarse SNR offset */
+        u16 csnroffst;
+        /* coupling fine SNR offset */
+        u16 cplfsnroffst;
+        /* coupling fast gain code */
+        u16 cplfgaincod;
+        /* fbw fine SNR offset */
+        u16 fsnroffst[5];
+        /* fbw fast gain code */
+        u16 fgaincod[5];
+        /* lfe fine SNR offset */
+        u16 lfefsnroffst;
+        /* lfe fast gain code */
+        u16 lfefgaincod;
+
+    /* Coupling leak info */
+    u16 cplleake;
+        /* coupling fast leak initialization */
+        u16 cplfleak;
+        /* coupling slow leak initialization */
+        u16 cplsleak;
+
+    /* delta bit allocation info */
+    u16 deltbaie;
+        /* coupling delta bit allocation exists */
+        u16 cpldeltbae;
+        /* fbw delta bit allocation exists */
+        u16 deltbae[5];
+        /* number of cpl delta bit segments */
+        u16 cpldeltnseg;
+            /* coupling delta bit allocation offset */
+            u16 cpldeltoffst[8];
+            /* coupling delta bit allocation length */
+            u16 cpldeltlen[8];
+            /* coupling delta bit allocation length */
+            u16 cpldeltba[8];
+        /* number of delta bit segments */
+        u16 deltnseg[5];
+            /* fbw delta bit allocation offset */
+            u16 deltoffst[5][8];
+            /* fbw delta bit allocation length */
+            u16 deltlen[5][8];
+            /* fbw delta bit allocation length */
+            u16 deltba[5][8];
+
+    /* skip length exists */
+    u16 skiple;
+        /* skip length */
+        u16 skipl;
+
+    /* channel mantissas */
+//      u16 chmant[5][256];
+
+    /* coupling mantissas */
+    float cplfbw[ 256 ];
+//      u16 cplmant[256];
+
+    /* coupling mantissas */
+//      u16 lfemant[7];
+
+    /* -- Information not in the bitstream, but derived thereof -- */
+
+    /* Number of coupling sub-bands */
+    u16 ncplsubnd;
+
+    /* Number of combined coupling sub-bands
+     * Derived from ncplsubnd and cplbndstrc */
+    u16 ncplbnd;
+
+    /* Number of exponent groups by channel
+     * Derived from strmant, endmant */
+    u16 nchgrps[5];
+
+    /* Number of coupling exponent groups
+     * Derived from cplbegf, cplendf, cplexpstr */
+    u16 ncplgrps;
+
+    /* End mantissa numbers of fbw channels */
+    u16 endmant[5];
+
+    /* Start and end mantissa numbers for the coupling channel */
+    u16 cplstrtmant;
+    u16 cplendmant;
+
+    /* Decoded exponent info */
+    u16 fbw_exp[5][256];
+    u16 cpl_exp[256];
+    u16 lfe_exp[7];
+
+    /* Bit allocation pointer results */
+    u16 fbw_bap[5][256];
+    /* FIXME?? figure out exactly how many entries there should be (253-37?) */
+    u16 cpl_bap[256];
+    u16 lfe_bap[7];
 } audblk_t;
 
 /* Everything you wanted to know about band structure */
@@ -304,68 +335,45 @@ typedef struct audblk_s
  * approximate a 1/6 octave scale.
  */
 
-typedef struct stream_coeffs_s
-{
-        float fbw[5][256];
-        float lfe[256];
-
+typedef struct stream_coeffs_s {
+    float fbw[5][256];
+    float lfe[256];
 } stream_coeffs_t;
 
-typedef struct stream_samples_s
-{
-        float channel[6][256];
-
+typedef struct stream_samples_s {
+    float channel[6][256];
 } stream_samples_t;
 
-#define AC3DEC_FRAME_SIZE (2*256)
-
-/*****************************************************************************
- * ac3dec_frame_t
- *****************************************************************************/
-typedef s16 ac3dec_frame_t[ AC3DEC_FRAME_SIZE ];
+typedef struct ac3_bit_stream_s {
+    u32 buffer;
+    int i_available;
+    ac3_byte_stream_t byte_stream;
 
-/*****************************************************************************
- * ac3dec_thread_t : ac3 decoder thread descriptor
- *****************************************************************************/
-typedef struct ac3dec_thread_s
-{
-    /*
-     * Thread properties
-     */
-    vlc_thread_t        thread_id;                /* id for thread functions */
-    boolean_t           b_die;                                 /* `die' flag */
-    boolean_t           b_error;                             /* `error' flag */
-    boolean_t           b_invalid;                         /* `invalid' flag */
+    unsigned int total_bits_read;      /* temporary */
+} ac3_bit_stream_t;
 
+struct ac3dec_s {
     /*
      * Input properties
      */
-    decoder_fifo_t      fifo;                  /* stores the PES stream data */
+
     /* The bit stream structure handles the PES stream at the bit level */
-    bit_stream_t        bit_stream;
+    ac3_bit_stream_t   bit_stream;
 
     /*
      * Decoder properties
      */
-    unsigned int        total_bits_read;
-
-    syncinfo_t          syncinfo;
-    bsi_t               bsi;
-    audblk_t            audblk;
+    syncinfo_t         syncinfo;
+    bsi_t              bsi;
+    audblk_t           audblk;
 
-    stream_coeffs_t     coeffs;
-    stream_samples_t    samples;
+    stream_coeffs_t    coeffs;
+    stream_samples_t   samples;
+};
 
-    /*
-     * Output properties
-     */
-    aout_fifo_t *       p_aout_fifo; /* stores the decompressed audio frames */
-    aout_thread_t *     p_aout;           /* needed to create the audio fifo */
+/**** ac3 decoder inline functions ****/
 
-} ac3dec_thread_t;
-
-/*****************************************************************************
- * Prototypes
- *****************************************************************************/
-ac3dec_thread_t *       ac3dec_CreateThread( input_thread_t * p_input );
-void                    ac3dec_DestroyThread( ac3dec_thread_t * p_ac3dec );
+static ac3_byte_stream_t * ac3_byte_stream (ac3dec_t * p_ac3dec)
+{
+    return &(p_ac3dec->bit_stream.byte_stream);
+}