annotate mpeg4audio.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 2d81202be6e2
children
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;
11588
480a999ce2c4 Add support for PS sync extensions.
alexc
parents: 11587
diff changeset
91 c->ps = -1;
11387
c7ed26e2011f Add support for non-backwards compatible signaled parametric stereo.
alexc
parents: 10535
diff changeset
92 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
93 // check for W6132 Annex YYYY draft MP3onMP4
c7ed26e2011f Add support for non-backwards compatible signaled parametric stereo.
alexc
parents: 10535
diff changeset
94 !(show_bits(&gb, 3) & 0x03 && !(show_bits(&gb, 9) & 0x3F)))) {
11588
480a999ce2c4 Add support for PS sync extensions.
alexc
parents: 11587
diff changeset
95 if (c->object_type == AOT_PS)
480a999ce2c4 Add support for PS sync extensions.
alexc
parents: 11587
diff changeset
96 c->ps = 1;
11586
2dc5036a8d18 Fix ext_object_type.
alexc
parents: 11387
diff changeset
97 c->ext_object_type = AOT_SBR;
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
98 c->sbr = 1;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
99 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
100 c->object_type = get_object_type(&gb);
9527
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
101 if (c->object_type == AOT_ER_BSAC)
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
102 c->ext_chan_config = get_bits(&gb, 4);
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
103 } else {
10064
41796cdda927 Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents: 10009
diff changeset
104 c->ext_object_type = AOT_NULL;
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
105 c->ext_sample_rate = 0;
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
106 }
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
107 specific_config_bitindex = get_bits_count(&gb);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
108
10521
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
109 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
110 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
111 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
112 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
113
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
114 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
115
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
116 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
117 return -1;
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
118 }
33890a382b36 Add the ability to parse the ALSSpecificConfig from an MPEG-4 AudioSpecificConfig. Patch by Thilo Borgmann
alexc
parents: 10518
diff changeset
119
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
120 if (c->ext_object_type != AOT_SBR) {
11587
d80d54dd267d Use get_bits_left() in the sync extension check.
alexc
parents: 11586
diff changeset
121 while (get_bits_left(&gb) > 15) {
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
122 if (show_bits(&gb, 11) == 0x2b7) { // sync extension
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
123 get_bits(&gb, 11);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
124 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
125 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1)
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
126 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
11588
480a999ce2c4 Add support for PS sync extensions.
alexc
parents: 11587
diff changeset
127 if (get_bits_left(&gb) > 11 && get_bits(&gb, 11) == 0x548)
480a999ce2c4 Add support for PS sync extensions.
alexc
parents: 11587
diff changeset
128 c->ps = get_bits1(&gb);
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
129 break;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
130 } else
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
131 get_bits1(&gb); // skip 1 bit
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
132 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
133 }
11886
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
134
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
135 //PS requires SBR
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
136 if (!c->sbr)
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
137 c->ps = 0;
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
138 //Limit implicit PS to the HE-AACv2 Profile
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
139 if ((c->ps == -1 && c->object_type != AOT_AAC_LC) || c->channels & ~0x01)
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
140 c->ps = 0;
2d81202be6e2 Add HE-AAC v2 support to the AAC decoder.
alexc
parents: 11588
diff changeset
141
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
142 return specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
143 }
9636
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 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
146 GetBitContext *gb,
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
147 int bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
148 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
149 unsigned int el = get_bits(gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
150 put_bits(pb, bits, el);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
151 return el;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
152 }
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
153
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
154 int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
155 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
156 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
157 int offset = put_bits_count(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
158
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
159 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
160 five_bit_ch = copy_bits(pb, gb, 4); //Front
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
161 five_bit_ch += copy_bits(pb, gb, 4); //Side
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
162 five_bit_ch += copy_bits(pb, gb, 4); //Back
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
163 four_bit_ch = copy_bits(pb, gb, 2); //LFE
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
164 four_bit_ch += copy_bits(pb, gb, 3); //Data
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
165 five_bit_ch += copy_bits(pb, gb, 4); //Coupling
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
166 if (copy_bits(pb, gb, 1)) //Mono Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
167 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
168 if (copy_bits(pb, gb, 1)) //Stereo Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
169 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
170 if (copy_bits(pb, gb, 1)) //Matrix Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
171 copy_bits(pb, gb, 3);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
172 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
173 copy_bits(pb, gb, 16);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
174 if (bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
175 copy_bits(pb, gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
176 align_put_bits(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
177 align_get_bits(gb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
178 comment_size = copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
179 for (; comment_size > 0; comment_size--)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
180 copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
181
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
182 return put_bits_count(pb) - offset;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
183 }