annotate mpeg4audio.c @ 11560:8a4984c5cacc libavcodec

Define AVMediaType enum, and use it instead of enum CodecType, which is deprecated and will be dropped at the next major bump.
author stefano
date Tue, 30 Mar 2010 23:30:55 +0000
parents c7ed26e2011f
children 2dc5036a8d18
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
1 /*
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
2 * MPEG-4 Audio common code
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
3 * Copyright (c) 2008 Baptiste Coudurier <baptiste.coudurier@free.fr>
9636
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
4 * Copyright (c) 2009 Alex Converse <alex.converse@gmail.com>
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
5 *
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
6 * This file is part of FFmpeg.
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
7 *
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
12 *
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
16 * Lesser General Public License for more details.
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
17 *
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
21 */
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
22
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9226
diff changeset
23 #include "get_bits.h"
9636
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
24 #include "put_bits.h"
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
25 #include "mpeg4audio.h"
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
26
10521
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
27 /**
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
28 * Parse MPEG-4 audio configuration for ALS object type.
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
29 * @param[in] gb bit reader context
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
30 * @param[in] c MPEG4AudioConfig structure to fill
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
31 * @return on success 0 is returned, otherwise a value < 0
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
32 */
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
33 static int parse_config_ALS(GetBitContext *gb, MPEG4AudioConfig *c)
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
34 {
10535
95f3daa991a2 Use get_bits_left() instead of size_in_bits - get_bits_count().
rbultje
parents: 10521
diff changeset
35 if (get_bits_left(gb) < 112)
10521
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
36 return -1;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
37
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
38 if (get_bits_long(gb, 32) != MKBETAG('A','L','S','\0'))
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
39 return -1;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
40
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
41 // override AudioSpecificConfig channel configuration and sample rate
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
42 // which are buggy in old ALS conformance files
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
43 c->sample_rate = get_bits_long(gb, 32);
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
44
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
45 // skip number of samples
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
46 skip_bits_long(gb, 32);
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
47
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
48 // read number of channels
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
49 c->chan_config = 0;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
50 c->channels = get_bits(gb, 16) + 1;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
51
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
52 return 0;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
53 }
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
54
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
55 const int ff_mpeg4audio_sample_rates[16] = {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
56 96000, 88200, 64000, 48000, 44100, 32000,
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
57 24000, 22050, 16000, 12000, 11025, 8000, 7350
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
58 };
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
59
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
60 const uint8_t ff_mpeg4audio_channels[8] = {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
61 0, 1, 2, 3, 4, 5, 6, 8
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
62 };
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
63
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
64 static inline int get_object_type(GetBitContext *gb)
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
65 {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
66 int object_type = get_bits(gb, 5);
10064
41796cdda927 Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents: 10009
diff changeset
67 if (object_type == AOT_ESCAPE)
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
68 object_type = 32 + get_bits(gb, 6);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
69 return object_type;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
70 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
71
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
72 static inline int get_sample_rate(GetBitContext *gb, int *index)
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
73 {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
74 *index = get_bits(gb, 4);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
75 return *index == 0x0f ? get_bits(gb, 24) :
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
76 ff_mpeg4audio_sample_rates[*index];
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
77 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
78
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
79 int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size)
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
80 {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
81 GetBitContext gb;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
82 int specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
83
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
84 init_get_bits(&gb, buf, buf_size*8);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
85 c->object_type = get_object_type(&gb);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
86 c->sample_rate = get_sample_rate(&gb, &c->sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
87 c->chan_config = get_bits(&gb, 4);
10518
d7ac0d3ddd95 Add a channels field to MPEG4AudioConfig.
alexc
parents: 10064
diff changeset
88 if (c->chan_config < FF_ARRAY_ELEMS(ff_mpeg4audio_channels))
d7ac0d3ddd95 Add a channels field to MPEG4AudioConfig.
alexc
parents: 10064
diff changeset
89 c->channels = ff_mpeg4audio_channels[c->chan_config];
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
90 c->sbr = -1;
11387
c7ed26e2011f Add support for non-backwards compatible signaled parametric stereo.
alexc
parents: 10535
diff changeset
91 if (c->object_type == AOT_SBR || (c->object_type == AOT_PS &&
c7ed26e2011f Add support for non-backwards compatible signaled parametric stereo.
alexc
parents: 10535
diff changeset
92 // check for W6132 Annex YYYY draft MP3onMP4
c7ed26e2011f Add support for non-backwards compatible signaled parametric stereo.
alexc
parents: 10535
diff changeset
93 !(show_bits(&gb, 3) & 0x03 && !(show_bits(&gb, 9) & 0x3F)))) {
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
94 c->ext_object_type = c->object_type;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
95 c->sbr = 1;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
96 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
97 c->object_type = get_object_type(&gb);
9527
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
98 if (c->object_type == AOT_ER_BSAC)
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
99 c->ext_chan_config = get_bits(&gb, 4);
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
100 } else {
10064
41796cdda927 Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents: 10009
diff changeset
101 c->ext_object_type = AOT_NULL;
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
102 c->ext_sample_rate = 0;
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
103 }
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
104 specific_config_bitindex = get_bits_count(&gb);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
105
10521
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
106 if (c->object_type == AOT_ALS) {
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
107 skip_bits(&gb, 5);
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
108 if (show_bits_long(&gb, 24) != MKBETAG('\0','A','L','S'))
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
109 skip_bits_long(&gb, 24);
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
110
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
111 specific_config_bitindex = get_bits_count(&gb);
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
112
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
113 if (parse_config_ALS(&gb, c))
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
114 return -1;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
115 }
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
116
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
117 if (c->ext_object_type != AOT_SBR) {
10521
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
118 int bits_left = buf_size*8 - get_bits_count(&gb);
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
119 for (; bits_left > 15; bits_left--) {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
120 if (show_bits(&gb, 11) == 0x2b7) { // sync extension
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
121 get_bits(&gb, 11);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
122 c->ext_object_type = get_object_type(&gb);
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
123 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1)
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
124 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
125 break;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
126 } else
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
127 get_bits1(&gb); // skip 1 bit
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
128 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
129 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
130 return specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
131 }
9636
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
132
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
133 static av_always_inline unsigned int copy_bits(PutBitContext *pb,
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
134 GetBitContext *gb,
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
135 int bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
136 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
137 unsigned int el = get_bits(gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
138 put_bits(pb, bits, el);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
139 return el;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
140 }
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
141
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
142 int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
143 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
144 int five_bit_ch, four_bit_ch, comment_size, bits;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
145 int offset = put_bits_count(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
146
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
147 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
148 five_bit_ch = copy_bits(pb, gb, 4); //Front
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
149 five_bit_ch += copy_bits(pb, gb, 4); //Side
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
150 five_bit_ch += copy_bits(pb, gb, 4); //Back
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
151 four_bit_ch = copy_bits(pb, gb, 2); //LFE
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
152 four_bit_ch += copy_bits(pb, gb, 3); //Data
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
153 five_bit_ch += copy_bits(pb, gb, 4); //Coupling
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
154 if (copy_bits(pb, gb, 1)) //Mono Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
155 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
156 if (copy_bits(pb, gb, 1)) //Stereo Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
157 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
158 if (copy_bits(pb, gb, 1)) //Matrix Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
159 copy_bits(pb, gb, 3);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
160 for (bits = five_bit_ch*5+four_bit_ch*4; bits > 16; bits -= 16)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
161 copy_bits(pb, gb, 16);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
162 if (bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
163 copy_bits(pb, gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
164 align_put_bits(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
165 align_get_bits(gb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
166 comment_size = copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
167 for (; comment_size > 0; comment_size--)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
168 copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
169
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
170 return put_bits_count(pb) - offset;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
171 }