annotate mpeg4audio.c @ 11352:6e0af2cfdcfe libavcodec

Do MC and IDCT in coding (hilbert) order This increases the slice size to 64 pixels, due to having to decode an entire chroma superblock row per slice. This can be up to 6% slower depending on clip and CPU, but is necessary for future optimizations that gain significantly more than was lost.
author conrad
date Wed, 03 Mar 2010 23:27:40 +0000
parents 95f3daa991a2
children c7ed26e2011f
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;
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
91 if (c->object_type == AOT_SBR) {
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
92 c->ext_object_type = c->object_type;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
93 c->sbr = 1;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
94 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
95 c->object_type = get_object_type(&gb);
9527
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
96 if (c->object_type == AOT_ER_BSAC)
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
97 c->ext_chan_config = get_bits(&gb, 4);
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
98 } else {
10064
41796cdda927 Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents: 10009
diff changeset
99 c->ext_object_type = AOT_NULL;
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
100 c->ext_sample_rate = 0;
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
101 }
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
102 specific_config_bitindex = get_bits_count(&gb);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
103
10521
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
104 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
105 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
106 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
107 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
108
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
109 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
110
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
111 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
112 return -1;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
113 }
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
114
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
115 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
116 int bits_left = buf_size*8 - get_bits_count(&gb);
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
117 for (; bits_left > 15; bits_left--) {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
118 if (show_bits(&gb, 11) == 0x2b7) { // sync extension
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
119 get_bits(&gb, 11);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
120 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
121 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1)
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
122 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
123 break;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
124 } else
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
125 get_bits1(&gb); // skip 1 bit
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
126 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
127 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
128 return specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
129 }
9636
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
130
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
131 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
132 GetBitContext *gb,
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
133 int bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
134 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
135 unsigned int el = get_bits(gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
136 put_bits(pb, bits, el);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
137 return el;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
138 }
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
139
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
140 int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb)
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 five_bit_ch, four_bit_ch, comment_size, bits;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
143 int offset = put_bits_count(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
144
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
145 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
146 five_bit_ch = copy_bits(pb, gb, 4); //Front
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
147 five_bit_ch += copy_bits(pb, gb, 4); //Side
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
148 five_bit_ch += copy_bits(pb, gb, 4); //Back
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
149 four_bit_ch = copy_bits(pb, gb, 2); //LFE
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
150 four_bit_ch += copy_bits(pb, gb, 3); //Data
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
151 five_bit_ch += copy_bits(pb, gb, 4); //Coupling
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
152 if (copy_bits(pb, gb, 1)) //Mono Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
153 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
154 if (copy_bits(pb, gb, 1)) //Stereo 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)) //Matrix Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
157 copy_bits(pb, gb, 3);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
158 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
159 copy_bits(pb, gb, 16);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
160 if (bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
161 copy_bits(pb, gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
162 align_put_bits(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
163 align_get_bits(gb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
164 comment_size = copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
165 for (; comment_size > 0; comment_size--)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
166 copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
167
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
168 return put_bits_count(pb) - offset;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
169 }