annotate ac3dec.c @ 5305:5892b4a6380b libavcodec

AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9 Removed _ from names Removed temporary storage for the exponents Removed ctx->samples Now each transform coefficients are stored in audio block as an array of transform coefficients for each channel added ctx->delay (output of later half of previous block) added audio_block->block_output(output of this block) I am still not able to produce the output. I checked the code twice completely. I am not missing anything in parsing or in bit allocation. Yet it throws error in getting transform coefficients sometimes. Can anyone review a code of get_transform_coeffs and help me debug it further. I think the error is in do_bit_allocation routine cuz get_transform_coeffs is dependent on the bit allocation parameters table. I have checked the bit allocation algorithm thoroughly and it is as defined in the standard. Tried everything and got stuck where to go further. Please help me.
author jbr
date Sat, 14 Jul 2007 15:42:15 +0000
parents eff51058fe13
children abc5c130b448
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1 /* AC3 Audio Decoder.
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
2 *
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
3 * Copyright (c) 2006 Kartikey Mahendra BHATT (bhattkm at gmail dot com).
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
4 *
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
9 *
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
13 * Lesser General Public License for more details.
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
14 *
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
18 */
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
19
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
20 #include <stdio.h>
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
21 #include <stddef.h>
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
22 #include <math.h>
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
23 #include <inttypes.h>
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
24 #include <string.h>
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
25
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
26 #define ALT_BITSTREAM_READER
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
27
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
28 #include "ac3.h"
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
29 #include "ac3tab.h"
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
30 #include "ac3_decoder.h"
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
31 #include "avcodec.h"
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
32 #include "bitstream.h"
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
33 #include "dsputil.h"
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
34 #include "avutil.h"
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
35 #include "common.h"
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
36
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
37 #define MAX_CHANNELS 6
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
38 #define MAX_BLOCK_SIZE 256
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
39 #define MAX_BLOCKS 6
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
40
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
41 /* Synchronization information. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
42 typedef struct {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
43 uint16_t sync_word; //synchronization word = always 0x0b77
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
44 uint16_t crc1; //crc for the first 5/8 of the frame
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
45 uint8_t fscod; //sampling rate code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
46 uint8_t frmsizecod; //frame size code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
47
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
48 /* Derived Attributes */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
49 int sampling_rate; //sampling rate - 48, 44.1 or 32 kHz (value in Hz)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
50 int bit_rate; //nominal bit rate (value in kbps)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
51 int framesize; //frame size - 16 bit words
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
52 } ac3_sync_info;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
53
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
54 /* flags for the BSI. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
55 #define AC3_BSI_LFEON 0x00000001 //low frequency effects channel on
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
56 #define AC3_BSI_COMPRE 0x00000002 //compression exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
57 #define AC3_BSI_LANGCODE 0x00000004 //langcode exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
58 #define AC3_BSI_AUDPRODIE 0x00000008 //audio production information exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
59 #define AC3_BSI_COMPR2E 0x00000010 //compr2 exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
60 #define AC3_BSI_LANGCOD2E 0x00000020 //langcod2 exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
61 #define AC3_BSI_AUDPRODI2E 0x00000040 //audio production information 2 exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
62 #define AC3_BSI_COPYRIGHTB 0x00000080 //copyright
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
63 #define AC3_BSI_ORIGBS 0x00000100 //original bit stream
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
64 #define AC3_BSI_TIMECOD1E 0x00000200 //timecod1 exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
65 #define AC3_BSI_TIMECOD2E 0x00000400 //timecod2 exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
66 #define AC3_BSI_ADDBSIE 0x00000800 //additional bit stream information exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
67
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
68 /* Bit Stream Information. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
69 typedef struct {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
70 uint32_t flags;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
71 uint8_t bsid; //bit stream identification
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
72 uint8_t bsmod; //bit stream mode - type of service
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
73 uint8_t acmod; //audio coding mode - which channels are in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
74 uint8_t cmixlev; //center mix level
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
75 uint8_t surmixlev; //surround mix level
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
76 uint8_t dsurmod; //dynamic surround encoded
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
77 uint8_t dialnorm; //dialog normalization
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
78 uint8_t compr; //compression gain word
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
79 uint8_t langcod; //language code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
80 uint8_t mixlevel; //mixing level
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
81 uint8_t roomtyp; //room type
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
82 uint8_t dialnorm2; //dialogue normalization for 1+1 mode
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
83 uint8_t compr2; //compression gain word for 1+1 mode
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
84 uint8_t langcod2; //language code for 1+1 mode
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
85 uint8_t mixlevel2; //mixing level for 1+1 mode
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
86 uint8_t roomtyp2; //room type for 1+1 mode
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
87 uint16_t timecod1; //timecode 1
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
88 uint16_t timecod2; //timecode 2
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
89 uint8_t addbsil; //additional bit stream information length
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
90
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
91 /* Dervied Attributes */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
92 int nfchans; //number of full bandwidth channels - derived from acmod
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
93 } ac3_bsi;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
94
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
95 /* #defs relevant to Audio Block. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
96 #define MAX_FBW_CHANNELS 5 //maximum full bandwidth channels
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
97 #define NUM_LFE_GROUPS 3 //number of LFE Groups
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
98 #define MAX_NUM_SEGS 8 //maximum number of segments per delta bit allocation
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
99 #define NUM_LFE_MANTS 7 //number of lfe mantissas
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
100 #define MAX_CPL_SUBNDS 18 //maximum number of coupling sub bands
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
101 #define MAX_CPL_BNDS 18 //maximum number of coupling bands
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
102 #define MAX_CPL_GRPS 253 //maximum number of coupling groups
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
103 #define MAX_CHNL_GRPS 88 //maximum number of channel groups
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
104 #define MAX_NUM_MANTISSAS 256 //maximum number of mantissas
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
105
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
106 /* flags for the Audio Block. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
107 #define AC3_AB_DYNRNGE 0x00000001 //dynamic range control exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
108 #define AC3_AB_DYNRNG2E 0x00000002 //dynamic range control 2 exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
109 #define AC3_AB_CPLSTRE 0x00000004 //coupling strategy exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
110 #define AC3_AB_CPLINU 0x00000008 //coupling in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
111 #define AC3_AB_PHSFLGINU 0x00000010 //phase flag in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
112 #define AC3_AB_REMATSTR 0x00000020 //rematrixing required
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
113 #define AC3_AB_LFEEXPSTR 0x00000100 //lfe exponent strategy
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
114 #define AC3_AB_BAIE 0x00000200 //bit allocation information exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
115 #define AC3_AB_SNROFFSTE 0x00000400 //SNR offset exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
116 #define AC3_AB_CPLLEAKE 0x00000800 //coupling leak initialization exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
117 #define AC3_AB_DELTBAIE 0x00001000 //delta bit allocation information exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
118 #define AC3_AB_SKIPLE 0x00002000 //skip length exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
119
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
120 /* Exponent strategies. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
121 #define AC3_EXPSTR_D15 0x01
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
122 #define AC3_EXPSTR_D25 0x02
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
123 #define AC3_EXPSTR_D45 0x03
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
124 #define AC3_EXPSTR_REUSE 0x00
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
125
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
126 /* Bit allocation strategies */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
127 #define AC3_DBASTR_NEW 0x01
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
128 #define AC3_DBASTR_NONE 0x02
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
129 #define AC3_DBASTR_RESERVED 0x03
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
130 #define AC3_DBASTR_REUSE 0x00
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
131
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
132 /* Audio Block */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
133 typedef struct {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
134 uint32_t flags;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
135 uint8_t blksw; //block switch flags for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
136 uint8_t dithflag; //dithering flags for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
137 int8_t dynrng; //dynamic range word
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
138 int8_t dynrng2; //dynamic range word for 1+1 mode
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
139 uint8_t chincpl; //channel in coupling flags for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
140 uint8_t cplbegf; //coupling begin frequency code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
141 uint8_t cplendf; //coupling end frequency code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
142 uint32_t cplbndstrc; //coupling band structure
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
143 uint8_t cplcoe; //coupling co-ordinates exists for the channel in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
144 uint8_t mstrcplco[5]; //master coupling co-ordinate for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
145 uint8_t cplcoexp[5][18]; //coupling co-ordinate exponenets
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
146 uint8_t cplcomant[5][18]; //coupling co-ordinate mantissas
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
147 uint32_t phsflg; //phase flag per band
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
148 uint8_t rematflg; //rematrixing flag
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
149 uint8_t cplexpstr; //coupling exponent strategy
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
150 uint8_t chexpstr[5]; //channel exponent strategy
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
151 uint8_t lfeexpstr; //lfe exponent strategy
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
152 uint8_t chbwcod[5]; //channel bandwdith code for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
153 uint8_t cplabsexp; //coupling absolute exponent
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
154 uint8_t gainrng[5]; //gain range
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
155 uint8_t sdcycod; //slow decay code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
156 uint8_t fdcycod; //fast decay code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
157 uint8_t sgaincod; //slow gain code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
158 uint8_t dbpbcod; //dB per bit code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
159 uint8_t floorcod; //masking floor code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
160 uint8_t csnroffst; //coarse SNR offset
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
161 uint8_t cplfsnroffst; //coupling fine SNR offset
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
162 uint8_t cplfgaincod; //coupling fast gain code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
163 uint8_t fsnroffst[5]; //fine SNR offset for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
164 uint8_t fgaincod[5]; //fast gain code for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
165 uint8_t lfefsnroffst; //lfe fine SNR offset
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
166 uint8_t lfefgaincod; //lfe fast gain code
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
167 uint8_t cplfleak; //coupling fast leak initialization value
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
168 uint8_t cplsleak; //coupling slow leak initialization value
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
169 uint8_t cpldeltbae; //coupling delta bit allocation exists
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
170 uint8_t deltbae[5]; //delta bit allocation exists for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
171 uint8_t cpldeltnseg; //coupling delta bit allocation number of segments
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
172 uint8_t cpldeltoffst[8]; //coupling delta offset
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
173 uint8_t cpldeltlen[8]; //coupling delta len
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
174 uint8_t cpldeltba[8]; //coupling delta bit allocation
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
175 uint8_t deltnseg[5]; //delta bit allocation number of segments per channel
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
176 uint8_t deltoffst[5][8]; //delta offset for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
177 uint8_t deltlen[5][8]; //delta len for channels in use
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
178 uint8_t deltba[5][8]; //delta bit allocation
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
179 uint16_t skipl; //skip length
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
180
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
181 /* Derived Attributes */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
182 int ncplsubnd; //number of active coupling sub bands = 3 + cplendf - cplbegf
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
183 int ncplbnd; //derived from ncplsubnd and cplbndstrc
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
184 int ncplgrps; //derived from ncplsubnd, cplexpstr
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
185 int nchgrps[5]; //derived from chexpstr, and cplbegf or chbwcod
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
186 int nchmant[5]; //derived from cplbegf or chbwcod
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
187 int ncplmant; //derived from ncplsubnd = 12 * ncplsubnd
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
188
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
189 uint8_t cplstrtbnd; //coupling start band for bit allocation
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
190 uint8_t cplstrtmant; //coupling start mantissa
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
191 uint8_t cplendmant; //coupling end mantissa
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
192 uint8_t endmant[5]; //channel end mantissas
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
193
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
194 uint8_t dcplexps[256]; //decoded coupling exponents
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
195 uint8_t dexps[5][256]; //decoded fbw channel exponents
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
196 uint8_t dlfeexps[256]; //decoded lfe exponents
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
197 uint8_t cplbap[256]; //coupling bit allocation parameters table
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
198 uint8_t bap[5][256]; //fbw channels bit allocation parameters table
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
199 uint8_t lfebap[256]; //lfe bit allocaiton parameters table
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
200
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
201 DECLARE_ALIGNED_16(float, transform_coeffs[MAX_CHANNELS][MAX_BLOCK_SIZE]); //transform coefficients
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
202 DECLARE_ALIGNED_16(float, cplcoeffs[256]); //temporary storage for coupling transform coefficients
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
203 DECLARE_ALIGNED_16(float, block_output[MAX_CHANNELS][MAX_BLOCK_SIZE]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
204 float cplco[5][18]; //coupling coordinates
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
205 float chcoeffs[6]; //channel coefficients for downmix
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
206 } ac3_audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
207
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
208
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
209
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
210 #define AC3_OUTPUT_UNMODIFIED 0x00
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
211 #define AC3_OUTPUT_MONO 0x01
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
212 #define AC3_OUTPUT_STEREO 0x02
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
213 #define AC3_OUTPUT_DOLBY 0x03
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
214
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
215 #define AC3_INPUT_DUALMONO 0x00
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
216 #define AC3_INPUT_MONO 0x01
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
217 #define AC3_INPUT_STEREO 0x02
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
218 #define AC3_INPUT_3F 0x03
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
219 #define AC3_INPUT_2F_1R 0x04
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
220 #define AC3_INPUT_3F_1R 0x05
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
221 #define AC3_INPUT_2F_2R 0x06
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
222 #define AC3_INPUT_3F_2R 0x07
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
223
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
224 /* BEGIN Mersenne Twister Code. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
225 #define N 624
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
226 #define M 397
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
227 #define MATRIX_A 0x9908b0df
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
228 #define UPPER_MASK 0x80000000
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
229 #define LOWER_MASK 0x7fffffff
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
230
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
231 typedef struct {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
232 uint32_t mt[N];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
233 int mti;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
234 } dither_state;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
235
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
236 static void dither_seed(dither_state *state, uint32_t seed)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
237 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
238 if (seed == 0)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
239 seed = 0x1f2e3d4c;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
240
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
241 state->mt[0] = seed;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
242 for (state->mti = 1; state->mti < N; state->mti++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
243 state->mt[state->mti] = ((69069 * state->mt[state->mti - 1]) + 1);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
244 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
245
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
246 static uint32_t dither_uint32(dither_state *state)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
247 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
248 uint32_t y;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
249 static const uint32_t mag01[2] = { 0x00, MATRIX_A };
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
250 int kk;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
251
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
252 if (state->mti >= N) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
253 for (kk = 0; kk < N - M; kk++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
254 y = (state->mt[kk] & UPPER_MASK) | (state->mt[kk + 1] & LOWER_MASK);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
255 state->mt[kk] = state->mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x01];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
256 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
257 for (;kk < N - 1; kk++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
258 y = (state->mt[kk] & UPPER_MASK) | (state->mt[kk + 1] & LOWER_MASK);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
259 state->mt[kk] = state->mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x01];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
260 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
261 y = (state->mt[N - 1] & UPPER_MASK) | (state->mt[0] & LOWER_MASK);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
262 state->mt[N - 1] = state->mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x01];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
263
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
264 state->mti = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
265 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
266
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
267 y = state->mt[state->mti++];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
268 y ^= (y >> 11);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
269 y ^= ((y << 7) & 0x9d2c5680);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
270 y ^= ((y << 15) & 0xefc60000);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
271 y ^= (y >> 18);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
272
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
273 return y;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
274 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
275
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
276 static inline int16_t dither_int16(dither_state *state)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
277 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
278 return ((dither_uint32(state) << 16) >> 16);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
279 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
280
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
281 /* END Mersenne Twister */
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
282
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
283 /* AC3 Context. */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
284 typedef struct {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
285 ac3_sync_info sync_info;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
286 ac3_bsi bsi;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
287 ac3_audio_block audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
288 dither_state state;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
289 MDCTContext imdct_ctx_256;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
290 MDCTContext imdct_ctx_512;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
291 GetBitContext gb;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
292 int output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
293 DECLARE_ALIGNED_16(float, delay[MAX_CHANNELS][MAX_BLOCK_SIZE]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
294 DECLARE_ALIGNED_16(FFTSample, tmp_imdct[MAX_BLOCK_SIZE * 2]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
295 DECLARE_ALIGNED_16(FFTSample, tmp_output[MAX_BLOCK_SIZE * 2]);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
296 } AC3DecodeContext;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
297
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
298 static void ac3_common_init1(void)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
299 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
300 int i, j, k, l, v;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
301 /* compute bndtab and masktab from bandsz */
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
302 k = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
303 l = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
304 for(i=0;i<50;i++) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
305 bndtab[i] = l;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
306 v = bndsz[i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
307 for(j=0;j<v;j++) masktab[k++]=i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
308 l += v;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
309 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
310 masktab[253] = masktab[254] = masktab[255] = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
311 bndtab[50] = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
312 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
313
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
314
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
315 static int ac3_decode_init(AVCodecContext *avctx)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
316 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
317 AC3DecodeContext *ctx = avctx->priv_data;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
318
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
319 ac3_common_init1();
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
320
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
321 ff_mdct_init(&ctx->imdct_ctx_256, 8, 1);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
322 ff_mdct_init(&ctx->imdct_ctx_512, 9, 1);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
323 dither_seed(&ctx->state, 0);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
324
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
325 return 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
326 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
327
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
328 static int ac3_synchronize(uint8_t *buf, int buf_size)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
329 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
330 int i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
331
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
332 for (i = 0; i < buf_size - 1; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
333 if (buf[i] == 0x0b && buf[i + 1] == 0x77)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
334 return i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
335
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
336 return -1;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
337 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
338
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
339 //Returns -1 when 'fscod' is not valid;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
340 static int ac3_parse_sync_info(AC3DecodeContext *ctx)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
341 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
342 ac3_sync_info *sync_info = &ctx->sync_info;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
343 ac3_bsi *bsi = &ctx->bsi;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
344 GetBitContext *gb = &ctx->gb;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
345
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
346 sync_info->sync_word = get_bits(gb, 16);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
347 sync_info->crc1 = get_bits(gb, 16);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
348 sync_info->fscod = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
349 if (sync_info->fscod == 0x03)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
350 return 0;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
351 sync_info->frmsizecod = get_bits(gb, 6);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
352 if (sync_info->frmsizecod >= 38)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
353 return 0;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
354 sync_info->sampling_rate = ac3_freqs[sync_info->fscod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
355 sync_info->bit_rate = ac3_bitratetab[sync_info->frmsizecod >> 1];
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
356
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
357 /* we include it here in order to determine validity of ac3 frame */
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
358 bsi->bsid = get_bits(gb, 5);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
359 if (bsi->bsid > 0x08)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
360 return 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
361 bsi->bsmod = get_bits(gb, 3);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
362
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
363 switch (sync_info->fscod) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
364 case 0x00:
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
365 sync_info->framesize = 4 * sync_info->bit_rate;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
366 return sync_info->framesize;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
367 case 0x01:
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
368 sync_info->framesize = 2 * (320 * sync_info->bit_rate / 147 + (sync_info->frmsizecod & 1));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
369 return sync_info->framesize;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
370 case 0x02:
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
371 sync_info->framesize = 6 * sync_info->bit_rate;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
372 return sync_info->framesize;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
373 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
374
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
375 /* never reached */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
376 return 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
377 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
378
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
379 //Returns -1 when
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
380 static int ac3_parse_bsi(AC3DecodeContext *ctx)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
381 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
382 ac3_bsi *bsi = &ctx->bsi;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
383 uint32_t *flags = &bsi->flags;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
384 GetBitContext *gb = &ctx->gb;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
385 int i;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
386
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
387 *flags = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
388 bsi->cmixlev = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
389 bsi->surmixlev = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
390 bsi->dsurmod = 0;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
391 ctx->audio_block.cpldeltbae = AC3_DBASTR_NONE;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
392 ctx->audio_block.cpldeltnseg = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
393 for (i = 0; i < 5; i++) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
394 ctx->audio_block.deltbae[i] = AC3_DBASTR_NONE;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
395 ctx->audio_block.deltnseg[i] = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
396 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
397
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
398 bsi->acmod = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
399 if (bsi->acmod & 0x01 && bsi->acmod != 0x01)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
400 bsi->cmixlev = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
401 if (bsi->acmod & 0x04)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
402 bsi->surmixlev = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
403 if (bsi->acmod == 0x02)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
404 bsi->dsurmod = get_bits(gb, 2);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
405 if (get_bits1(gb))
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
406 *flags |= AC3_BSI_LFEON;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
407 bsi->dialnorm = get_bits(gb, 5);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
408 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
409 *flags |= AC3_BSI_COMPRE;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
410 bsi->compr = get_bits(gb, 8);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
411 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
412 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
413 *flags |= AC3_BSI_LANGCODE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
414 bsi->langcod = get_bits(gb, 8);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
415 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
416 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
417 *flags |= AC3_BSI_AUDPRODIE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
418 bsi->mixlevel = get_bits(gb, 5);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
419 bsi->roomtyp = get_bits(gb, 2);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
420 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
421 if (bsi->acmod == 0x00) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
422 bsi->dialnorm2 = get_bits(gb, 5);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
423 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
424 *flags |= AC3_BSI_COMPR2E;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
425 bsi->compr2 = get_bits(gb, 8);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
426 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
427 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
428 *flags |= AC3_BSI_LANGCOD2E;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
429 bsi->langcod2 = get_bits(gb, 8);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
430 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
431 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
432 *flags |= AC3_BSI_AUDPRODIE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
433 bsi->mixlevel2 = get_bits(gb, 5);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
434 bsi->roomtyp2 = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
435 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
436 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
437 if (get_bits1(gb))
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
438 *flags |= AC3_BSI_COPYRIGHTB;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
439 if (get_bits1(gb))
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
440 *flags |= AC3_BSI_ORIGBS;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
441 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
442 *flags |= AC3_BSI_TIMECOD1E;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
443 bsi->timecod1 = get_bits(gb, 14);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
444 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
445 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
446 *flags |= AC3_BSI_TIMECOD2E;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
447 bsi->timecod2 = get_bits(gb, 14);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
448 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
449 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
450 *flags |= AC3_BSI_ADDBSIE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
451 bsi->addbsil = get_bits(gb, 6);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
452 for (i = 0; i < (bsi->addbsil + 1); i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
453 skip_bits(gb, 8);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
454 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
455
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
456 bsi->nfchans = nfchans_tbl[bsi->acmod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
457
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
458 return 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
459 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
460
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
461 /* Decodes the grouped exponents and stores them
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
462 * in decoded exponents (dexps).
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
463 * The code is derived from liba52.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
464 * Uses liba52 tables.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
465 */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
466 static int decode_exponents(GetBitContext *gb, int expstr, int ngrps, uint8_t absexp, uint8_t *dexps)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
467 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
468 int exps;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
469
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
470 while (ngrps--) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
471 exps = get_bits(gb, 7);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
472
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
473 absexp += exp_1[exps];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
474 if (absexp > 24) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
475 av_log(NULL, AV_LOG_ERROR, "Absolute Exponent > 24, ngrp = %d\n", ngrps);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
476 return -ngrps;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
477 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
478 switch (expstr) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
479 case AC3_EXPSTR_D45:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
480 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
481 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
482 case AC3_EXPSTR_D25:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
483 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
484 case AC3_EXPSTR_D15:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
485 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
486 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
487
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
488 absexp += exp_2[exps];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
489 if (absexp > 24) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
490 av_log(NULL, AV_LOG_ERROR, "Absolute Exponent > 24, ngrp = %d\n", ngrps);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
491 return -ngrps;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
492 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
493 switch (expstr) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
494 case AC3_EXPSTR_D45:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
495 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
496 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
497 case AC3_EXPSTR_D25:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
498 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
499 case AC3_EXPSTR_D15:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
500 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
501 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
502
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
503 absexp += exp_3[exps];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
504 if (absexp > 24) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
505 av_log(NULL, AV_LOG_ERROR, "Absolute Exponent > 24, ngrp = %d\n", ngrps);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
506 return -ngrps;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
507 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
508 switch (expstr) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
509 case AC3_EXPSTR_D45:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
510 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
511 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
512 case AC3_EXPSTR_D25:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
513 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
514 case AC3_EXPSTR_D15:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
515 *(dexps++) = absexp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
516 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
517 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
518
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
519 return 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
520 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
521
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
522 static inline int logadd(int a, int b)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
523 {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
524 int c = a - b;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
525 int address;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
526
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
527 address = FFMIN(ABS(c) >> 1, 255);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
528
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
529 if (c >= 0)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
530 return (a + latab[address]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
531 else
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
532 return (b + latab[address]);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
533 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
534
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
535 static inline int calc_lowcomp(int a, int b0, int b1, int bin)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
536 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
537 if (bin < 7) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
538 if ((b0 + 256) == b1)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
539 a = 384;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
540 else if (b0 > b1)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
541 a = FFMAX(0, a - 64);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
542 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
543 else if (bin < 20) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
544 if ((b0 + 256) == b1)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
545 a = 320;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
546 else if (b0 > b1)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
547 a = FFMAX(0, a - 64);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
548 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
549 else
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
550 a = FFMAX(0, a - 128);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
551
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
552 return a;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
553 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
554
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
555 /* do the bit allocation for chnl.
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
556 * chnl = 0 to 4 - fbw channel
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
557 * chnl = 5 coupling channel
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
558 * chnl = 6 lfe channel
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
559 */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
560 static void do_bit_allocation1(AC3DecodeContext *ctx, int chnl)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
561 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
562 ac3_audio_block *ab = &ctx->audio_block;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
563 int sdecay, fdecay, sgain, dbknee, floor;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
564 int lowcomp = 0, fgain = 0, snroffset = 0, fastleak = 0, slowleak = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
565 int psd[256], bndpsd[50], excite[50], mask[50], delta;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
566 int start = 0, end = 0, bin = 0, i = 0, j = 0, k = 0, lastbin = 0, bndstrt = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
567 int bndend = 0, begin = 0, deltnseg = 0, band = 0, seg = 0, address = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
568 int fscod = ctx->sync_info.fscod;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
569 uint8_t *exps, *deltoffst = 0, *deltlen = 0, *deltba = 0;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
570 uint8_t *baps;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
571 int do_delta = 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
572
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
573 /* initialization */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
574 sdecay = sdecaytab[ab->sdcycod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
575 fdecay = fdecaytab[ab->fdcycod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
576 sgain = sgaintab[ab->sgaincod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
577 dbknee = dbkneetab[ab->dbpbcod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
578 floor = floortab[ab->floorcod];
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
579
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
580 if (chnl == 5) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
581 start = ab->cplstrtmant;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
582 end = ab->cplendmant;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
583 fgain = fgaintab[ab->cplfgaincod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
584 snroffset = (((ab->csnroffst - 15) << 4) + ab->cplfsnroffst) << 2;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
585 fastleak = (ab->cplfleak << 8) + 768;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
586 slowleak = (ab->cplsleak << 8) + 768;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
587 exps = ab->dcplexps;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
588 baps = ab->cplbap;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
589 if (ab->cpldeltbae == AC3_DBASTR_NEW || ab->cpldeltbae == AC3_DBASTR_REUSE) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
590 do_delta = 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
591 deltnseg = ab->cpldeltnseg;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
592 deltoffst = ab->cpldeltoffst;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
593 deltlen = ab->cpldeltlen;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
594 deltba = ab->cpldeltba;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
595 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
596 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
597 else if (chnl == 6) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
598 start = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
599 end = 7;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
600 lowcomp = 0;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
601 fastleak = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
602 slowleak = 0;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
603 fgain = fgaintab[ab->lfefgaincod];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
604 snroffset = (((ab->csnroffst - 15) << 4) + ab->lfefsnroffst) << 2;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
605 exps = ab->dlfeexps;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
606 baps = ab->lfebap;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
607 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
608 else {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
609 start = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
610 end = ab->endmant[chnl];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
611 lowcomp = 0;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
612 fastleak = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
613 slowleak = 0;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
614 fgain = fgaintab[ab->fgaincod[chnl]];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
615 snroffset = (((ab->csnroffst - 15) << 4) + ab->fsnroffst[chnl]) << 2;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
616 exps = ab->dexps[chnl];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
617 baps = ab->bap[chnl];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
618 if (ab->deltbae[chnl] == AC3_DBASTR_NEW || ab->deltbae[chnl] == AC3_DBASTR_REUSE) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
619 do_delta = 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
620 deltnseg = ab->deltnseg[chnl];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
621 deltoffst = ab->deltoffst[chnl];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
622 deltlen = ab->deltlen[chnl];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
623 deltba = ab->deltba[chnl];
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
624 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
625 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
626
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
627 for (bin = start; bin < end; bin++) /* exponent mapping into psd */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
628 psd[bin] = (3072 - ((int)(exps[bin]) << 7));
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
629
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
630 /* psd integration */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
631 j = start;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
632 k = masktab[start];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
633 do {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
634 lastbin = FFMIN(bndtab[k] + bndsz[k], end);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
635 bndpsd[k] = psd[j];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
636 j++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
637 for (i = j; i < lastbin; i++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
638 bndpsd[k] = logadd(bndpsd[k], psd[j]);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
639 j++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
640 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
641 k++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
642 } while (end > lastbin);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
643
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
644 /* compute the excite function */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
645 bndstrt = masktab[start];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
646 bndend = masktab[end - 1] + 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
647 if (bndstrt == 0) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
648 lowcomp = calc_lowcomp(lowcomp, bndpsd[0], bndpsd[1], 0);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
649 excite[0] = bndpsd[0] - fgain - lowcomp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
650 lowcomp = calc_lowcomp(lowcomp, bndpsd[1], bndpsd[2], 1);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
651 excite[1] = bndpsd[1] - fgain - lowcomp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
652 begin = 7;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
653 for (bin = 2; bin < 7; bin++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
654 if (bndend != 7 || bin != 6)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
655 lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin + 1], bin);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
656 fastleak = bndpsd[bin] - fgain;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
657 slowleak = bndpsd[bin] - sgain;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
658 excite[bin] = fastleak - lowcomp;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
659 if (bndend != 7 || bin != 6)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
660 if (bndpsd[bin] <= bndpsd[bin + 1]) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
661 begin = bin + 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
662 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
663 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
664 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
665 for (bin = begin; bin < FFMIN(bndend, 22); bin++) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
666 if (bndend != 7 || bin != 6)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
667 lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin + 1], bin);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
668 fastleak -= fdecay;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
669 fastleak = FFMAX(fastleak, bndpsd[bin] - fgain);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
670 slowleak -= sdecay;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
671 slowleak = FFMAX(slowleak, bndpsd[bin] - sgain);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
672 excite[bin] = FFMAX(fastleak - lowcomp, slowleak);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
673 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
674 begin = 22;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
675 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
676 else {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
677 begin = bndstrt;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
678 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
679 for (bin = begin; bin < bndend; bin++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
680 fastleak -= fdecay;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
681 fastleak = FFMAX(fastleak, bndpsd[bin] - fgain);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
682 slowleak -= sdecay;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
683 slowleak = FFMAX(slowleak, bndpsd[bin] - sgain);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
684 excite[bin] = FFMAX(fastleak, slowleak);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
685 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
686
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
687 /* compute the masking curve */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
688 for (bin = bndstrt; bin < bndend; bin++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
689 if (bndpsd[bin] < dbknee)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
690 excite[bin] += ((dbknee - bndpsd[bin]) >> 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
691 mask[bin] = FFMAX(excite[bin], hth[bin][fscod]);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
692 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
693
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
694 /* apply the delta bit allocation */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
695 if (do_delta) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
696 band = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
697 for (seg = 0; seg < deltnseg + 1; seg++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
698 band += (int)(deltoffst[seg]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
699 if ((int)(deltba[seg]) >= 4)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
700 delta = ((int)(deltba[seg]) - 3) << 7;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
701 else
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
702 delta = ((int)(deltba[seg]) - 4) << 7;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
703 for (k = 0; k < (int)(deltlen[seg]); k++) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
704 mask[band] += delta;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
705 band++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
706 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
707 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
708 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
709
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
710 /*compute the bit allocation */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
711 i = start;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
712 j = masktab[start];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
713 do {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
714 lastbin = FFMIN(bndtab[j] + bndsz[j], end);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
715 mask[j] -= snroffset;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
716 mask[j] -= floor;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
717 if (mask[j] < 0)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
718 mask[j] = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
719 mask[j] &= 0x1fe0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
720 mask[j] += floor;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
721 for (k = i; k < lastbin; k++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
722 address = (psd[i] - mask[j]) >> 5;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
723 address = FFMIN(63, FFMAX(0, address));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
724 baps[i] = baptab[address];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
725 i++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
726 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
727 j++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
728 } while (end > lastbin);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
729 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
730
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
731 static void do_bit_allocation(AC3DecodeContext *ctx, int flags)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
732 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
733 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
734 int i, snroffst = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
735
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
736 if (!flags) /* bit allocation is not required */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
737 return;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
738
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
739 if (ab->flags & AC3_AB_SNROFFSTE) { /* check whether snroffsts are zero */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
740 snroffst += ab->csnroffst;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
741 if (ab->flags & AC3_AB_CPLINU)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
742 snroffst += ab->cplfsnroffst;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
743 for (i = 0; i < ctx->bsi.nfchans; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
744 snroffst += ab->fsnroffst[i];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
745 if (ctx->bsi.flags & AC3_BSI_LFEON)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
746 snroffst += ab->lfefsnroffst;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
747 if (!snroffst) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
748 memset(ab->cplbap, 0, sizeof (ab->cplbap));
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
749 for (i = 0; i < ctx->bsi.nfchans; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
750 memset(ab->bap[i], 0, sizeof (ab->bap[i]));
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
751 memset(ab->lfebap, 0, sizeof (ab->lfebap));
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
752
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
753 return;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
754 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
755 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
756
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
757 /* perform bit allocation */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
758 if ((ab->flags & AC3_AB_CPLINU) && (flags & 64))
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
759 do_bit_allocation1(ctx, 5);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
760 for (i = 0; i < ctx->bsi.nfchans; i++)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
761 if (flags & (1 << i))
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
762 do_bit_allocation1(ctx, i);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
763 if ((ctx->bsi.flags & AC3_BSI_LFEON) && (flags & 32))
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
764 do_bit_allocation1(ctx, 6);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
765 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
766
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
767 static inline float to_float(uint8_t exp, int16_t mantissa)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
768 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
769 return ((float) (mantissa * scale_factors[exp]));
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
770 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
771
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
772 typedef struct { /* grouped mantissas for 3-level 5-leve and 11-level quantization */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
773 uint8_t gcodes[3];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
774 uint8_t gcptr;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
775 } mant_group;
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
776
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
777 /* Get the transform coefficients for particular channel */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
778 static int get_transform_coeffs1(uint8_t *exps, uint8_t *bap, float chcoeff,
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
779 float *coeffs, int start, int end, int dith_flag, GetBitContext *gb,
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
780 dither_state *state)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
781 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
782 int16_t mantissa;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
783 int i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
784 int gcode;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
785 mant_group l3_grp, l5_grp, l11_grp;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
786
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
787 for (i = 0; i < 3; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
788 l3_grp.gcodes[i] = l5_grp.gcodes[i] = l11_grp.gcodes[i] = -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
789 l3_grp.gcptr = l5_grp.gcptr = 3;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
790 l11_grp.gcptr = 2;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
791
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
792 i = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
793 while (i < start)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
794 coeffs[i++] = 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
795
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
796 for (i = start; i < end; i++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
797 switch (bap[i]) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
798 case 0:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
799 if (!dith_flag) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
800 coeffs[i] = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
801 continue;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
802 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
803 else {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
804 mantissa = dither_int16(state);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
805 coeffs[i] = to_float(exps[i], mantissa) * chcoeff;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
806 continue;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
807 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
808
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
809 case 1:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
810 if (l3_grp.gcptr > 2) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
811 gcode = get_bits(gb, 5);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
812 if (gcode > 26)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
813 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
814 l3_grp.gcodes[0] = gcode / 9;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
815 l3_grp.gcodes[1] = (gcode % 9) / 3;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
816 l3_grp.gcodes[2] = (gcode % 9) % 3;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
817 l3_grp.gcptr = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
818 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
819 mantissa = l3_q_tab[l3_grp.gcodes[l3_grp.gcptr++]];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
820 coeffs[i] = to_float(exps[i], mantissa) * chcoeff;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
821 continue;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
822
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
823 case 2:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
824 if (l5_grp.gcptr > 2) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
825 gcode = get_bits(gb, 7);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
826 if (gcode > 124)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
827 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
828 l5_grp.gcodes[0] = gcode / 25;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
829 l5_grp.gcodes[1] = (gcode % 25) / 5;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
830 l5_grp.gcodes[2] = (gcode % 25) % 5;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
831 l5_grp.gcptr = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
832 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
833 mantissa = l5_q_tab[l5_grp.gcodes[l5_grp.gcptr++]];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
834 coeffs[i] = to_float(exps[i], mantissa) * chcoeff;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
835 continue;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
836
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
837 case 3:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
838 mantissa = get_bits(gb, 3);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
839 if (mantissa > 6)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
840 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
841 mantissa = l7_q_tab[mantissa];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
842 coeffs[i] = to_float(exps[i], mantissa);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
843 continue;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
844
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
845 case 4:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
846 if (l11_grp.gcptr > 1) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
847 gcode = get_bits(gb, 7);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
848 if (gcode > 120)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
849 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
850 l11_grp.gcodes[0] = gcode / 11;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
851 l11_grp.gcodes[1] = gcode % 11;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
852 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
853 mantissa = l11_q_tab[l11_grp.gcodes[l11_grp.gcptr++]];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
854 coeffs[i] = to_float(exps[i], mantissa) * chcoeff;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
855 continue;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
856
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
857 case 5:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
858 mantissa = get_bits(gb, 4);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
859 if (mantissa > 14)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
860 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
861 mantissa = l15_q_tab[mantissa];
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
862 coeffs[i] = to_float(exps[i], mantissa) * chcoeff;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
863 continue;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
864
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
865 default:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
866 mantissa = get_bits(gb, qntztab[bap[i]]) << (16 - qntztab[bap[i]]);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
867 coeffs[i] = to_float(exps[i], mantissa) * chcoeff;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
868 continue;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
869 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
870 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
871
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
872 i = end;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
873 while (i < 256)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
874 coeffs[i++] = 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
875
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
876 return 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
877 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
878
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
879 static void uncouple_channels(AC3DecodeContext * ctx)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
880 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
881 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
882 int ch, sbnd, bin;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
883 int index;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
884 int16_t mantissa;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
885
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
886 /* uncouple channels */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
887 for (ch = 0; ch < ctx->bsi.nfchans; ch++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
888 if (ab->chincpl & (1 << ch))
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
889 for (sbnd = ab->cplbegf; sbnd < 3 + ab->cplendf; sbnd++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
890 for (bin = 0; bin < 12; bin++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
891 index = sbnd * 12 + bin + 37;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
892 ab->transform_coeffs[ch + 1][index] = ab->cplcoeffs[index] * ab->cplco[ch][sbnd] * ab->chcoeffs[ch];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
893 /* generate dither if required */
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
894 if (!ab->bap[ch][index] && (ab->chincpl & (1 << ch)) && (ab->dithflag & (1 << ch))) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
895 mantissa = dither_int16(&ctx->state);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
896 ab->transform_coeffs[ch + 1][index] = to_float(ab->dexps[ch][index], mantissa) * ab->chcoeffs[ch];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
897 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
898 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
899 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
900
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
901 static int get_transform_coeffs(AC3DecodeContext * ctx)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
902 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
903 int i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
904 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
905 int got_cplchan = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
906 int dithflag = 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
907
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
908 for (i = 0; i < ctx->bsi.nfchans; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
909 dithflag = ab->dithflag & (1 << i);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
910 /* transform coefficients for individual channel */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
911 if (get_transform_coeffs1(ab->dexps[i], ab->bap[i], ab->chcoeffs[i], ab->transform_coeffs[i + 1],
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
912 0, ab->endmant[i], dithflag, &ctx->gb, &ctx->state))
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
913 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
914 /* tranform coefficients for coupling channels */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
915 if ((ab->flags & AC3_AB_CPLINU) && (ab->chincpl & (1 << i)) && !got_cplchan) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
916 if (get_transform_coeffs1(ab->dcplexps, ab->cplbap, 1.0f, ab->cplcoeffs,
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
917 ab->cplstrtmant, ab->cplendmant, 0, &ctx->gb, &ctx->state))
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
918 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
919 got_cplchan = 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
920 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
921 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
922 if (ctx->bsi.flags & AC3_BSI_LFEON)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
923 if (get_transform_coeffs1(ab->dlfeexps, ab->lfebap, 1.0f, ab->transform_coeffs[0], 0, 7, 0, &ctx->gb, &ctx->state))
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
924 return -1;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
925
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
926 /* uncouple the channels from the coupling channel */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
927 if (ab->flags & AC3_AB_CPLINU)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
928 uncouple_channels(ctx);
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
929
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
930 return 0;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
931 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
932
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
933 /* generate coupling co-ordinates for each coupling subband
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
934 * from coupling co-ordinates of each band and coupling band
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
935 * structure information
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
936 */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
937 static void generate_coupling_coordinates(AC3DecodeContext * ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
938 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
939 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
940 uint8_t exp, mstrcplco;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
941 int16_t mant;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
942 uint32_t cplbndstrc = (1 << ab->ncplsubnd) >> 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
943 int ch, bnd, sbnd;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
944 float cplco;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
945
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
946 if (ab->cplcoe)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
947 for (ch = 0; ch < ctx->bsi.nfchans; ch++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
948 if (ab->cplcoe & (1 << ch)) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
949 mstrcplco = 3 * ab->mstrcplco[ch];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
950 sbnd = ab->cplbegf;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
951 for (bnd = 0; bnd < ab->ncplbnd; bnd++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
952 exp = ab->cplcoexp[ch][bnd];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
953 if (exp == 15)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
954 mant = ab->cplcomant[ch][bnd] <<= 14;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
955 else
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
956 mant = (ab->cplcomant[ch][bnd] | 0x10) << 13;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
957 cplco = to_float(exp + mstrcplco, mant);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
958 if (ctx->bsi.acmod == 0x02 && (ab->flags & AC3_AB_PHSFLGINU) && ch == 1
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
959 && (ab->phsflg & (1 << bnd)))
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
960 cplco = -cplco; /* invert the right channel */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
961 ab->cplco[ch][sbnd++] = cplco;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
962 while (cplbndstrc & ab->cplbndstrc) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
963 cplbndstrc >>= 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
964 ab->cplco[ch][sbnd++] = cplco;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
965 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
966 cplbndstrc >>= 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
967 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
968 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
969 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
970
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
971 static void do_rematrixing1(AC3DecodeContext *ctx, int start, int end)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
972 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
973 float tmp0, tmp1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
974
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
975 while (start < end) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
976 tmp0 = ctx->audio_block.transform_coeffs[1][start];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
977 tmp1 = ctx->audio_block.transform_coeffs[2][start];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
978 ctx->audio_block.transform_coeffs[1][start] = tmp0 + tmp1;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
979 ctx->audio_block.transform_coeffs[2][start] = tmp0 - tmp1;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
980 start++;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
981 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
982 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
983
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
984 static void do_rematrixing(AC3DecodeContext *ctx)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
985 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
986 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
987 uint8_t bnd1 = 13, bnd2 = 25, bnd3 = 37, bnd4 = 61;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
988 uint8_t bndend;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
989
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
990 bndend = FFMIN(ab->endmant[0], ab->endmant[1]);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
991 if (ab->rematflg & 1)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
992 do_rematrixing1(ctx, bnd1, bnd2);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
993 if (ab->rematflg & 2)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
994 do_rematrixing1(ctx, bnd2, bnd3);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
995 if (ab->rematflg & 4) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
996 if (ab->cplbegf > 0 && ab->cplbegf <= 2 && (ab->flags & AC3_AB_CPLINU))
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
997 do_rematrixing1(ctx, bnd3, bndend);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
998 else {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
999 do_rematrixing1(ctx, bnd3, bnd4);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1000 if (ab->rematflg & 8)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1001 do_rematrixing1(ctx, bnd4, bndend);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1002 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1003 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1004 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1005
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1006 static void get_downmix_coeffs(AC3DecodeContext *ctx)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1007 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1008 int from = ctx->bsi.acmod;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1009 int to = ctx->output;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1010 float clev = clevs[ctx->bsi.cmixlev];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1011 float slev = slevs[ctx->bsi.surmixlev];
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1012 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1013
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1014 if (to == AC3_OUTPUT_UNMODIFIED)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1015 return;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1016
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1017 switch (from) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1018 case AC3_INPUT_DUALMONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1019 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1020 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1021 case AC3_OUTPUT_STEREO: /* We Assume that sum of both mono channels is requested */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1022 ab->chcoeffs[0] *= LEVEL_MINUS_6DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1023 ab->chcoeffs[1] *= LEVEL_MINUS_6DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1024 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1025 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1026 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1027 case AC3_INPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1028 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1029 case AC3_OUTPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1030 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1031 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1032 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1033 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1034 case AC3_INPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1035 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1036 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1037 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1038 ab->chcoeffs[1] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1039 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1040 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1041 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1042 case AC3_INPUT_3F:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1043 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1044 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1045 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1046 ab->chcoeffs[2] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1047 ab->chcoeffs[1] *= clev * LEVEL_PLUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1048 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1049 case AC3_OUTPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1050 ab->chcoeffs[1] *= clev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1051 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1052 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1053 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1054 case AC3_INPUT_2F_1R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1055 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1056 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1057 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1058 ab->chcoeffs[1] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1059 ab->chcoeffs[2] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1060 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1061 case AC3_OUTPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1062 ab->chcoeffs[2] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1063 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1064 case AC3_OUTPUT_DOLBY:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1065 ab->chcoeffs[2] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1066 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1067 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1068 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1069 case AC3_INPUT_3F_1R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1070 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1071 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1072 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1073 ab->chcoeffs[2] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1074 ab->chcoeffs[1] *= clev * LEVEL_PLUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1075 ab->chcoeffs[3] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1076 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1077 case AC3_OUTPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1078 ab->chcoeffs[1] *= clev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1079 ab->chcoeffs[3] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1080 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1081 case AC3_OUTPUT_DOLBY:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1082 ab->chcoeffs[1] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1083 ab->chcoeffs[3] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1084 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1085 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1086 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1087 case AC3_INPUT_2F_2R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1088 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1089 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1090 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1091 ab->chcoeffs[1] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1092 ab->chcoeffs[2] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1093 ab->chcoeffs[3] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1094 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1095 case AC3_OUTPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1096 ab->chcoeffs[2] *= slev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1097 ab->chcoeffs[3] *= slev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1098 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1099 case AC3_OUTPUT_DOLBY:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1100 ab->chcoeffs[2] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1101 ab->chcoeffs[3] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1102 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1103 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1104 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1105 case AC3_INPUT_3F_2R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1106 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1107 case AC3_OUTPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1108 ab->chcoeffs[0] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1109 ab->chcoeffs[2] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1110 ab->chcoeffs[1] *= clev * LEVEL_PLUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1111 ab->chcoeffs[3] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1112 ab->chcoeffs[4] *= slev * LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1113 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1114 case AC3_OUTPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1115 ab->chcoeffs[1] *= clev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1116 ab->chcoeffs[3] *= slev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1117 ab->chcoeffs[4] *= slev;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1118 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1119 case AC3_OUTPUT_DOLBY:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1120 ab->chcoeffs[1] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1121 ab->chcoeffs[3] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1122 ab->chcoeffs[4] *= LEVEL_MINUS_3DB;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1123 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1124 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1125 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1126 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1127 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1128
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1129 static inline void mix_dualmono_to_mono(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1130 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1131 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1132 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1133
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1134 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1135 output[1][i] += output[2][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1136 memset(output[2], 0, sizeof(output[2]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1137 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1138
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1139 static inline void mix_dualmono_to_stereo(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1140 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1141 int i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1142 float tmp;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1143 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1144
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1145 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1146 tmp = output[1][i] + output[2][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1147 output[1][i] = output[2][i] = tmp;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1148 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1149 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1150
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1151 static inline void upmix_mono_to_stereo(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1152 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1153 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1154 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1155
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1156 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1157 output[2][i] = output[1][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1158 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1159
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1160 static inline void mix_stereo_to_mono(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1161 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1162 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1163 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1164
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1165 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1166 output[1][i] += output[2][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1167 memset(output[2], 0, sizeof(output[2]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1168 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1169
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1170 static inline void mix_3f_to_mono(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1171 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1172 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1173 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1174
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1175 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1176 output[1][i] += (output[2][i] + output[3][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1177 memset(output[2], 0, sizeof(output[2]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1178 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1179 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1180
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1181 static inline void mix_3f_to_stereo(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1182 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1183 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1184 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1185
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1186 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1187 output[1][i] += output[2][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1188 output[2][i] += output[3][i];
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1189 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1190 memset(output[3], 0, sizeof(output[3]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1191 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1192
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1193 static inline void mix_2f_1r_to_mono(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1194 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1195 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1196 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1197
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1198 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1199 output[1][i] += (output[2][i] + output[3][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1200 memset(output[2], 0, sizeof(output[2]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1201 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1202
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1203 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1204
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1205 static inline void mix_2f_1r_to_stereo(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1206 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1207 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1208 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1209
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1210 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1211 output[1][i] += output[2][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1212 output[2][i] += output[3][i];
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1213 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1214 memset(output[3], 0, sizeof(output[3]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1215 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1216
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1217 static inline void mix_2f_1r_to_dolby(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1218 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1219 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1220 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1221
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1222 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1223 output[1][i] -= output[3][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1224 output[2][i] += output[3][i];
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1225 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1226 memset(output[3], 0, sizeof(output[3]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1227 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1228
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1229 static inline void mix_3f_1r_to_mono(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1230 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1231 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1232 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1233
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1234 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1235 output[1][i] = (output[2][i] + output[3][i] + output[4][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1236 memset(output[2], 0, sizeof(output[2]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1237 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1238 memset(output[4], 0, sizeof(output[4]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1239 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1240
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1241 static inline void mix_3f_1r_to_stereo(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1242 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1243 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1244 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1245
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1246 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1247 output[1][i] += (output[2][i] + output[4][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1248 output[2][i] += (output[3][i] + output[4][i]);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1249 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1250 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1251 memset(output[4], 0, sizeof(output[4]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1252 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1253
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1254 static inline void mix_3f_1r_to_dolby(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1255 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1256 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1257 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1258
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1259 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1260 output[1][i] += (output[2][i] - output[4][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1261 output[2][i] += (output[3][i] + output[4][i]);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1262 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1263 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1264 memset(output[4], 0, sizeof(output[4]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1265 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1266
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1267 static inline void mix_2f_2r_to_mono(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1268 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1269 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1270 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1271
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1272 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1273 output[1][i] = (output[2][i] + output[3][i] + output[4][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1274 memset(output[2], 0, sizeof(output[2]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1275 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1276 memset(output[4], 0, sizeof(output[4]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1277 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1278
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1279 static inline void mix_2f_2r_to_stereo(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1280 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1281 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1282 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1283
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1284 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1285 output[1][i] += output[3][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1286 output[2][i] += output[4][i];
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1287 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1288 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1289 memset(output[4], 0, sizeof(output[4]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1290 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1291
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1292 static inline void mix_2f_2r_to_dolby(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1293 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1294 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1295 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1296
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1297 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1298 output[1][i] -= output[3][i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1299 output[2][i] += output[4][i];
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1300 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1301 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1302 memset(output[4], 0, sizeof(output[4]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1303 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1304
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1305 static inline void mix_3f_2r_to_mono(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1306 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1307 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1308 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1309
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1310 for (i = 0; i < 256; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1311 output[1][i] += (output[2][i] + output[3][i] + output[4][i] + output[5][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1312 memset(output[2], 0, sizeof(output[2]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1313 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1314 memset(output[4], 0, sizeof(output[4]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1315 memset(output[5], 0, sizeof(output[5]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1316 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1317
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1318 static inline void mix_3f_2r_to_stereo(AC3DecodeContext *ctx)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1319 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1320 int i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1321 float (*output)[256] = ctx->audio_block.block_output;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1322
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1323 for (i = 0; i < 256; i++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1324 output[1][i] += (output[2][i] + output[4][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1325 output[2][i] += (output[3][i] + output[5][i]);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1326 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1327 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1328 memset(output[4], 0, sizeof(output[4]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1329 memset(output[5], 0, sizeof(output[5]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1330 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1331
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1332 static inline void mix_3f_2r_to_dolby(AC3DecodeContext *ctx)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1333 {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1334 int i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1335 float (*output)[256] = ctx->audio_block.block_output;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1336
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1337 for (i = 0; i < 256; i++) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1338 output[1][i] += (output[2][i] - output[4][i] - output[5][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1339 output[2][i] += (output[3][i] + output[4][i] + output[5][i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1340 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1341 memset(output[3], 0, sizeof(output[3]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1342 memset(output[4], 0, sizeof(output[4]));
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1343 memset(output[5], 0, sizeof(output[5]));
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1344 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1345
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1346 static void do_downmix(AC3DecodeContext *ctx)
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1347 {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1348 int from = ctx->bsi.acmod;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1349 int to = ctx->output;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1350
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1351 switch (from) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1352 case AC3_INPUT_DUALMONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1353 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1354 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1355 mix_dualmono_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1356 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1357 case AC3_OUTPUT_STEREO: /* We Assume that sum of both mono channels is requested */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1358 mix_dualmono_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1359 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1360 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1361 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1362 case AC3_INPUT_MONO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1363 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1364 case AC3_OUTPUT_STEREO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1365 upmix_mono_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1366 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1367 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1368 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1369 case AC3_INPUT_STEREO:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1370 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1371 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1372 mix_stereo_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1373 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1374 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1375 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1376 case AC3_INPUT_3F:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1377 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1378 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1379 mix_3f_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1380 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1381 case AC3_OUTPUT_STEREO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1382 mix_3f_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1383 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1384 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1385 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1386 case AC3_INPUT_2F_1R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1387 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1388 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1389 mix_2f_1r_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1390 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1391 case AC3_OUTPUT_STEREO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1392 mix_2f_1r_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1393 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1394 case AC3_OUTPUT_DOLBY:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1395 mix_2f_1r_to_dolby(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1396 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1397 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1398 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1399 case AC3_INPUT_3F_1R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1400 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1401 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1402 mix_3f_1r_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1403 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1404 case AC3_OUTPUT_STEREO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1405 mix_3f_1r_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1406 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1407 case AC3_OUTPUT_DOLBY:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1408 mix_3f_1r_to_dolby(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1409 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1410 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1411 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1412 case AC3_INPUT_2F_2R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1413 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1414 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1415 mix_2f_2r_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1416 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1417 case AC3_OUTPUT_STEREO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1418 mix_2f_2r_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1419 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1420 case AC3_OUTPUT_DOLBY:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1421 mix_2f_2r_to_dolby(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1422 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1423 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1424 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1425 case AC3_INPUT_3F_2R:
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1426 switch (to) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1427 case AC3_OUTPUT_MONO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1428 mix_3f_2r_to_mono(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1429 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1430 case AC3_OUTPUT_STEREO:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1431 mix_3f_2r_to_stereo(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1432 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1433 case AC3_OUTPUT_DOLBY:
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1434 mix_3f_2r_to_dolby(ctx);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1435 break;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1436 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1437 break;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1438 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1439 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1440
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1441 static int ac3_parse_audio_block(AC3DecodeContext * ctx, int index)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1442 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1443 ac3_audio_block *ab = &ctx->audio_block;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1444 int nfchans = ctx->bsi.nfchans;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1445 int acmod = ctx->bsi.acmod;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1446 int i, bnd, rbnd, seg, grpsize;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1447 GetBitContext *gb = &ctx->gb;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1448 uint32_t *flags = &ab->flags;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1449 int bit_alloc_flags = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1450 float drange;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1451 uint8_t *dexps;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1452
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1453 *flags = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1454 ab->blksw = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1455 for (i = 0; i < 5; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1456 ab->chcoeffs[i] = 1.0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1457 for (i = 0; i < nfchans; i++) /*block switch flag */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1458 ab->blksw |= get_bits1(gb) << i;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1459 ab->dithflag = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1460 for (i = 0; i < nfchans; i++) /* dithering flag */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1461 ab->dithflag |= get_bits1(gb) << i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1462 if (get_bits1(gb)) { /* dynamic range */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1463 *flags |= AC3_AB_DYNRNGE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1464 ab->dynrng = get_bits(gb, 8);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1465 drange = ((((ab->dynrng & 0x1f) | 0x20) << 13) * scale_factors[3 - (ab->dynrng >> 5)]);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1466 for (i = 0; i < nfchans; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1467 ab->chcoeffs[i] *= drange;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1468 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1469 if (acmod == 0x00) { /* dynamic range 1+1 mode */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1470 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1471 *flags |= AC3_AB_DYNRNG2E;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1472 ab->dynrng2 = get_bits(gb, 8);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1473 drange = ((((ab->dynrng2 & 0x1f) | 0x20) << 13) * scale_factors[3 - (ab->dynrng2 >> 5)]);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1474 ab->chcoeffs[1] *= drange;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1475 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1476 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1477 get_downmix_coeffs(ctx);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1478 ab->chincpl = 0;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1479 if (get_bits1(gb)) { /* coupling strategy */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1480 *flags |= AC3_AB_CPLSTRE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1481 ab->cplbndstrc = 0;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1482 if (get_bits1(gb)) { /* coupling in use */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1483 *flags |= AC3_AB_CPLINU;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1484 for (i = 0; i < nfchans; i++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1485 ab->chincpl |= get_bits1(gb) << i;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1486 if (acmod == 0x00 || acmod == 0x01)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1487 return -1; /* coupling needs atleast two shared channels */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1488 if (acmod == 0x02)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1489 if (get_bits1(gb)) /* phase flag in use */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1490 *flags |= AC3_AB_PHSFLGINU;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1491 ab->cplbegf = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1492 ab->cplendf = get_bits(gb, 4);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1493 if (3 + ab->cplendf - ab->cplbegf < 0)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1494 return -1;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1495 ab->ncplbnd = ab->ncplsubnd = 3 + ab->cplendf - ab->cplbegf;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1496 ab->cplstrtmant = ab->cplbegf * 12 + 37;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1497 ab->cplendmant = ((ab->cplendf + 3) * 12) + 37;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1498 for (i = 0; i < ab->ncplsubnd - 1; i++) /* coupling band structure */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1499 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1500 ab->cplbndstrc |= 1 << i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1501 ab->ncplbnd--;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1502 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1503 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1504 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1505 if (*flags & AC3_AB_CPLINU) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1506 ab->cplcoe = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1507 for (i = 0; i < nfchans; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1508 if (ab->chincpl & (1 << i))
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1509 if (get_bits1(gb)) { /* coupling co-ordinates */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1510 ab->cplcoe |= 1 << i;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1511 ab->mstrcplco[i] = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1512 for (bnd = 0; bnd < ab->ncplbnd; bnd++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1513 ab->cplcoexp[i][bnd] = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1514 ab->cplcomant[i][bnd] = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1515 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1516 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1517 ab->phsflg = 0;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1518 if ((acmod == 0x02) && (*flags & AC3_AB_PHSFLGINU) && (ab->cplcoe & 1 || ab->cplcoe & (1 << 1))) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1519 for (bnd = 0; bnd < ab->ncplbnd; bnd++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1520 if (get_bits1(gb))
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1521 ab->phsflg |= 1 << bnd;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1522 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1523 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1524 generate_coupling_coordinates(ctx);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1525 ab->rematflg = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1526 if (acmod == 0x02) /* rematrixing */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1527 if (get_bits1(gb)) {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1528 *flags |= AC3_AB_REMATSTR;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1529 if (!(*flags & AC3_AB_CPLINU) || ab->cplbegf > 2)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1530 for (rbnd = 0; rbnd < 4; rbnd++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1531 ab->rematflg |= get_bits1(gb) << rbnd;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1532 if (ab->cplbegf > 0 && ab->cplbegf <= 2 && (*flags & AC3_AB_CPLINU))
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1533 for (rbnd = 0; rbnd < 3; rbnd++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1534 ab->rematflg |= get_bits1(gb) << rbnd;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1535 if (ab->cplbegf == 0 && (*flags & AC3_AB_CPLINU))
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1536 for (rbnd = 0; rbnd < 2; rbnd++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1537 ab->rematflg |= get_bits1(gb) << rbnd;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1538 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1539 ab->cplexpstr = AC3_EXPSTR_REUSE;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1540 ab->lfeexpstr = AC3_EXPSTR_REUSE;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1541 if (*flags & AC3_AB_CPLINU) /* coupling exponent strategy */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1542 ab->cplexpstr = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1543 for (i = 0; i < nfchans; i++) /* channel exponent strategy */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1544 ab->chexpstr[i] = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1545 if (ctx->bsi.flags & AC3_BSI_LFEON) /* lfe exponent strategy */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1546 ab->lfeexpstr = get_bits1(gb);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1547 for (i = 0; i < nfchans; i++) /* channel bandwidth code */
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1548 if (ab->chexpstr[i] != AC3_EXPSTR_REUSE) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1549 if ((ab->chincpl & (1 << i)))
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1550 ab->endmant[i] = ab->cplstrtmant;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1551 else {
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1552 ab->chbwcod[i] = get_bits(gb, 6);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1553 if (ab->chbwcod[i] > 60) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1554 av_log(NULL, AV_LOG_ERROR, "chbwcod = %d > 60", ab->chbwcod[i]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1555 return -1;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1556 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1557 ab->endmant[i] = ((ab->chbwcod[i] + 12) * 3) + 37;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1558 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1559 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1560 if (*flags & AC3_AB_CPLINU)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1561 if (ab->cplexpstr != AC3_EXPSTR_REUSE) {/* coupling exponents */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1562 bit_alloc_flags |= 64;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1563 ab->cplabsexp = get_bits(gb, 4) << 1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1564 ab->ncplgrps = (ab->cplendmant - ab->cplstrtmant) / (3 << (ab->cplexpstr - 1));
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1565 if (decode_exponents(gb, ab->cplexpstr, ab->ncplgrps, ab->cplabsexp, ab->dcplexps + ab->cplstrtmant)) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1566 av_log(NULL, AV_LOG_ERROR, "error decoding coupling exponents\n");
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1567 return -1;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1568 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1569 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1570 for (i = 0; i < nfchans; i++) /* fbw channel exponents */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1571 if (ab->chexpstr[i] != AC3_EXPSTR_REUSE) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1572 bit_alloc_flags |= 1 << i;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1573 grpsize = 3 << (ab->chexpstr[i] - 1);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1574 ab->nchgrps[i] = (ab->endmant[i] + grpsize - 4) / grpsize;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1575 dexps = ab->dexps[i];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1576 dexps[0] = get_bits(gb, 4);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1577 if (decode_exponents(gb, ab->chexpstr[i], ab->nchgrps[i], dexps[0], dexps + 1)) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1578 av_log(NULL, AV_LOG_ERROR, "error decoding channel %d exponents\n", i);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1579 return -1;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1580 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1581 ab->gainrng[i] = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1582 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1583 if (ctx->bsi.flags & AC3_BSI_LFEON) /* lfe exponents */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1584 if (ab->lfeexpstr != AC3_EXPSTR_REUSE) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1585 bit_alloc_flags |= 32;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1586 ab->dlfeexps[0] = get_bits(gb, 4);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1587 if (decode_exponents(gb, ab->lfeexpstr, 2, ab->dlfeexps[0], ab->dlfeexps + 1)) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1588 av_log(NULL, AV_LOG_ERROR, "error decoding lfe exponents\n");
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1589 return -1;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1590 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1591 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1592
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1593 if (get_bits1(gb)) { /* bit allocation information */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1594 *flags |= AC3_AB_BAIE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1595 bit_alloc_flags |= 127;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1596 ab->sdcycod = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1597 ab->fdcycod = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1598 ab->sgaincod = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1599 ab->dbpbcod = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1600 ab->floorcod = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1601 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1602 if (get_bits1(gb)) { /* snroffset */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1603 *flags |= AC3_AB_SNROFFSTE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1604 bit_alloc_flags |= 127;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1605 ab->csnroffst = get_bits(gb, 6);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1606 if (*flags & AC3_AB_CPLINU) { /* couling fine snr offset and fast gain code */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1607 ab->cplfsnroffst = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1608 ab->cplfgaincod = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1609 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1610 for (i = 0; i < nfchans; i++) { /* channel fine snr offset and fast gain code */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1611 ab->fsnroffst[i] = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1612 ab->fgaincod[i] = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1613 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1614 if (ctx->bsi.flags & AC3_BSI_LFEON) { /* lfe fine snr offset and fast gain code */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1615 ab->lfefsnroffst = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1616 ab->lfefgaincod = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1617 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1618 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1619 if (*flags & AC3_AB_CPLINU)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1620 if (get_bits1(gb)) { /* coupling leak information */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1621 bit_alloc_flags |= 64;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1622 *flags |= AC3_AB_CPLLEAKE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1623 ab->cplfleak = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1624 ab->cplsleak = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1625 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1626 if (get_bits1(gb)) { /* delta bit allocation information */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1627 *flags |= AC3_AB_DELTBAIE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1628 bit_alloc_flags |= 127;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1629 if (*flags & AC3_AB_CPLINU) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1630 ab->cpldeltbae = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1631 if (ab->cpldeltbae == AC3_DBASTR_RESERVED) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1632 av_log(NULL, AV_LOG_ERROR, "coupling delta bit allocation strategy reserved\n");
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1633 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1634 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1635 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1636 for (i = 0; i < nfchans; i++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1637 ab->deltbae[i] = get_bits(gb, 2);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1638 if (ab->deltbae[i] == AC3_DBASTR_RESERVED) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1639 av_log(NULL, AV_LOG_ERROR, "delta bit allocation strategy reserved\n");
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1640 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1641 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1642 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1643 if (*flags & AC3_AB_CPLINU)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1644 if (ab->cpldeltbae == AC3_DBASTR_NEW) { /*coupling delta offset, len and bit allocation */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1645 ab->cpldeltnseg = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1646 for (seg = 0; seg <= ab->cpldeltnseg; seg++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1647 ab->cpldeltoffst[seg] = get_bits(gb, 5);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1648 ab->cpldeltlen[seg] = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1649 ab->cpldeltba[seg] = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1650 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1651 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1652 for (i = 0; i < nfchans; i++)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1653 if (ab->deltbae[i] == AC3_DBASTR_NEW) {/*channel delta offset, len and bit allocation */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1654 ab->deltnseg[i] = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1655 for (seg = 0; seg <= ab->deltnseg[i]; seg++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1656 ab->deltoffst[i][seg] = get_bits(gb, 5);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1657 ab->deltlen[i][seg] = get_bits(gb, 4);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1658 ab->deltba[i][seg] = get_bits(gb, 3);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1659 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1660 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1661 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1662
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1663 do_bit_allocation (ctx, bit_alloc_flags); /* perform the bit allocation */
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1664
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1665 if (get_bits1(gb)) { /* unused dummy data */
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1666 *flags |= AC3_AB_SKIPLE;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1667 ab->skipl = get_bits(gb, 9);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1668 for (i = 0; i < ab->skipl; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1669 skip_bits(gb, 8);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1670 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1671 /* unpack the transform coefficients
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1672 * * this also uncouples channels if coupling is in use.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1673 */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1674 if (get_transform_coeffs(ctx)) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1675 av_log(NULL, AV_LOG_ERROR, "Error in routine get_transform_coeffs\n");
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1676 return -1;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1677 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1678 /* recover coefficients if rematrixing is in use */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1679 if (*flags & AC3_AB_REMATSTR)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1680 do_rematrixing(ctx);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1681
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1682 return 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1683 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1684
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1685 static int ac3_decode_frame(AVCodecContext * avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1686 {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1687 AC3DecodeContext *ctx = (AC3DecodeContext *)avctx->priv_data;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1688 ac3_audio_block *ab = &ctx->audio_block;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1689 int frame_start;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1690 int i, j, k, l, value;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1691 float tmp_block_first_half[128], tmp_block_second_half[128];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1692 int16_t *out_samples = (int16_t *)data;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1693 int nfchans;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1694
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1695 //Synchronize the frame.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1696 frame_start = ac3_synchronize(buf, buf_size);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1697 if (frame_start == -1) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1698 av_log(avctx, AV_LOG_ERROR, "frame is not synchronized\n");
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1699 *data_size = 0;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1700 return buf_size;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1701 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1702
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1703 //Initialize the GetBitContext with the start of valid AC3 Frame.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1704 init_get_bits(&(ctx->gb), buf + frame_start, (buf_size - frame_start) * 8);
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1705
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1706 //Parse the syncinfo.
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1707 //If 'fscod' or 'bsid' is not valid the decoder shall mute as per the standard.
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1708 if (!ac3_parse_sync_info(ctx)) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1709 av_log(avctx, AV_LOG_ERROR, "\n");
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1710 *data_size = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1711 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1712 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1713
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1714 //Check for the errors.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1715 /* if (ac3_error_check(ctx)) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1716 *data_size = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1717 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1718 } */
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1719
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1720 //Parse the BSI.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1721 //If 'bsid' is not valid decoder shall not decode the audio as per the standard.
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1722 if (ac3_parse_bsi(ctx)) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1723 av_log(avctx, AV_LOG_ERROR, "bsid is not valid\n");
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1724 *data_size = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1725 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1726 }
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1727
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1728 for (i = 0; i < MAX_BLOCKS; i++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1729 memset(ctx->delay[i], 0, sizeof(ctx->delay[i]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1730 avctx->sample_rate = ctx->sync_info.sampling_rate;
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1731 avctx->bit_rate = ctx->sync_info.bit_rate;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1732 if (avctx->channels == 0) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1733 //avctx->channels = ctx->bsi.nfchans + ((ctx->bsi.flags & AC3_BSI_LFEON) ? 1 : 0);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1734 ctx->output = AC3_OUTPUT_UNMODIFIED;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1735 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1736 else if ((ctx->bsi.nfchans + ((ctx->bsi.flags & AC3_BSI_LFEON) ? 1 : 0)) < avctx->channels) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1737 av_log(avctx, AV_LOG_INFO, "ac3_decoder: AC3 Source Channels Are Less Then Specified %d: Output to %d Channels\n",
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1738 avctx->channels, (ctx->bsi.nfchans + ((ctx->bsi.flags & AC3_BSI_LFEON) ? 1 : 0)));
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1739 //avctx->channels = ctx->bsi.nfchans + ((ctx->bsi.flags & AC3_BSI_LFEON) ? 1 : 0);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1740 ctx->output = AC3_OUTPUT_UNMODIFIED;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1741 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1742 else if (avctx->channels == 1) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1743 ctx->output = AC3_OUTPUT_MONO;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1744 } else if (avctx->channels == 2) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1745 if (ctx->bsi.dsurmod == 0x02)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1746 ctx->output = AC3_OUTPUT_DOLBY;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1747 else
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1748 ctx->output = AC3_OUTPUT_STEREO;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1749 }
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1750
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1751
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1752 av_log(avctx, AV_LOG_INFO, "channels = %d \t bit rate = %d \t sampling rate = %d \n", avctx->channels, avctx->sample_rate, avctx->bit_rate);
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1753
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1754 //Parse the Audio Blocks.
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1755 *data_size = 0;
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1756 for (i = 0; i < 6; i++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1757 if (ac3_parse_audio_block(ctx, i)) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1758 av_log(avctx, AV_LOG_ERROR, "error parsing the audio block\n");
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1759 *data_size = 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1760 return -1;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1761 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1762
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1763 av_log(NULL, AV_LOG_INFO, "doing imdct\n");
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1764
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1765 if (ctx->bsi.flags & AC3_BSI_LFEON) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1766 ff_imdct_calc(&ctx->imdct_ctx_512, ctx->tmp_output, ab->transform_coeffs[0], ctx->tmp_imdct);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1767 for (l = 0; l < 256; l++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1768 ab->block_output[0][l] = ctx->tmp_output[l] * window[l] + ctx->delay[0][l] * window[255 -l];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1769 memcpy(ctx->delay[0], ctx->tmp_output + 256, sizeof(ctx->delay[0]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1770 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1771
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1772 for (j = 0; j < ctx->bsi.nfchans; j++) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1773 if (ctx->audio_block.blksw & (1 << j)) {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1774 for (k = 0; k < 128; k++) {
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1775 tmp_block_first_half[k] = ab->transform_coeffs[j + 1][2 * k];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1776 tmp_block_second_half[k] = ab->transform_coeffs[j + 1][2 * k + 1];
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1777 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1778 ff_imdct_calc(&ctx->imdct_ctx_256, ctx->tmp_output, tmp_block_first_half, ctx->tmp_imdct);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1779 for (l = 0; l < 256; l++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1780 ab->block_output[j + 1][l] = ctx->tmp_output[l] * window[l] + ctx->delay[j + 1][l] * window[255 - l];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1781 ff_imdct_calc(&ctx->imdct_ctx_256, ctx->delay[j + 1], tmp_block_second_half, ctx->tmp_imdct);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1782 } else {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1783 ff_imdct_calc(&ctx->imdct_ctx_512, ctx->tmp_output, ab->transform_coeffs[j + 1], ctx->tmp_imdct);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1784 for (l = 0; l < 256; l++)
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1785 ab->block_output[j + 1][l] = ctx->tmp_output[l] * window[l] + ctx->delay[j + 1][l] * window[255 - l];
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1786 memcpy(ctx->delay[j + 1], ctx->tmp_output + 256, sizeof(ctx->delay[j + 1]));
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1787 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1788 }
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1789 if (ctx->bsi.flags & AC3_BSI_LFEON) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1790 for (l = 0; l < 256; l++) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1791 value = lrint(ab->block_output[0][l]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1792 if (value < -32768)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1793 value = -32768;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1794 else if (value > 32767)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1795 value = 32767;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1796 *(out_samples++) = value;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1797 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1798 *data_size += 256 * sizeof(int16_t);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1799 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1800 do_downmix(ctx);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1801 if (ctx->output == AC3_OUTPUT_UNMODIFIED)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1802 nfchans = ctx->bsi.nfchans;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1803 else
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1804 nfchans = avctx->channels;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1805 for (k = 0; k < nfchans; k++)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1806 for (l = 0; l < 256; l++) {
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1807 value = lrint(ab->block_output[k + 1][l]);
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1808 if (value < -32768)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1809 value = -32768;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1810 else if (value > 32767)
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1811 value = 32767;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1812 *(out_samples++) = value;
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1813 }
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1814 *data_size += nfchans * 256 * sizeof (int16_t);
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1815 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1816
5305
5892b4a6380b AC-3 decoder, soc revision 31, Jul 14 23:53:28 2006 UTC by cloud9
jbr
parents: 5304
diff changeset
1817 return ctx->sync_info.framesize;
5303
b8821ff5c30d AC-3 decoder, soc revision 9, Jun 14 03:52:02 2006 UTC by cloud9
jbr
parents:
diff changeset
1818 }
5304
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1819
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1820 static int ac3_decode_end(AVCodecContext *ctx)
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1821 {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1822 return 0;
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1823 }
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1824
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1825 AVCodec lgpl_ac3_decoder = {
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1826 "ac3",
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1827 CODEC_TYPE_AUDIO,
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1828 CODEC_ID_AC3,
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1829 sizeof (AC3DecodeContext),
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1830 ac3_decode_init,
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1831 NULL,
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1832 ac3_decode_end,
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1833 ac3_decode_frame,
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1834 };
eff51058fe13 AC-3 decoder, soc revision 26, Jul 5 04:55:15 2006 UTC by cloud9
jbr
parents: 5303
diff changeset
1835