ac3_decoder.h 9.59 KB
Newer Older
1 2 3 4 5
/*****************************************************************************
 * ac3_decoder.h : ac3 decoder thread interface
 * (c)1999 VideoLAN
 *****************************************************************************/

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
/* Exponent strategy constants */
#define EXP_REUSE       (0)
#define EXP_D15         (1)
#define EXP_D25         (2)
#define EXP_D45         (3)

/* Delta bit allocation constants */
#define DELTA_BIT_REUSE         (0)
#define DELTA_BIT_NEW           (1)
#define DELTA_BIT_NONE          (2)
#define DELTA_BIT_RESERVED      (3)

/* The following structures are filled in by their corresponding parse_*
 * functions. See http://www.atsc.org/Standards/A52/a_52.pdf for
 * full details on each field. Indented fields are used to denote
 * 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;

} 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;

} 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];
282
	//FIXME figure out exactly how many entries there should be (253-37?)
283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
	u16 cpl_bap[256];
	u16 lfe_bap[7];

} audblk_t;

/* Everything you wanted to know about band structure */
/*
 * The entire frequency domain is represented by 256 real
 * floating point fourier coefficients. Only the lower 253
 * coefficients are actually utilized however. We use arrays
 * of 256 to be efficient in some cases.
 *
 * The 5 full bandwidth channels (fbw) can have their higher
 * frequencies coupled together. These coupled channels then
 * share their high frequency components.
 *
 * This coupling band is broken up into 18 sub-bands starting
 * at mantissa number 37. Each sub-band is 12 bins wide.
 *
 * There are 50 bit allocation sub-bands which cover the entire
 * frequency range. The sub-bands are of non-uniform width, and
 * approximate a 1/6 octave scale.
 */

typedef struct stream_coeffs_s
{
	float fbw[5][256];
	float lfe[256];

} stream_coeffs_t;

typedef struct stream_samples_s
{
	float channel[6][256];

} stream_samples_t;

320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
#define AC3DEC_FRAME_SIZE (2*256)

/*****************************************************************************
 * ac3dec_frame_t
 *****************************************************************************/
typedef s16 ac3dec_frame_t[ AC3DEC_FRAME_SIZE ];

/*****************************************************************************
 * 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 */
Michel Kaempf's avatar
Michel Kaempf committed
338
    boolean_t           b_invalid;                         /* `invalid' flag */
339 340 341 342 343 344 345 346 347 348 349 350 351

    /*
     * 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;

    /*
     * Decoder properties
     */
    unsigned int        total_bits_read;

352 353 354 355 356 357 358
    syncinfo_t          syncinfo;
    bsi_t               bsi;
    audblk_t            audblk;

    stream_coeffs_t     coeffs;
    stream_samples_t    samples;

359 360 361 362 363 364 365 366 367 368 369 370 371
    /*
     * Output properties
     */
    aout_fifo_t *       p_aout_fifo; /* stores the decompressed audio frames */
    aout_thread_t *     p_aout;           /* needed to create the audio fifo */

} ac3dec_thread_t;

/*****************************************************************************
 * Prototypes
 *****************************************************************************/
ac3dec_thread_t *       ac3dec_CreateThread( input_thread_t * p_input );
void                    ac3dec_DestroyThread( ac3dec_thread_t * p_ac3dec );