annotate mpeg4audio.c @ 10463:9f35b262d3f0 libavcodec

Commit some functions that are used by both SIPR and AMR. Based on AMR SoC code by Robert Swain and Colin McQuillan.
author vitor
date Tue, 27 Oct 2009 23:53:18 +0000
parents 41796cdda927
children d7ac0d3ddd95
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
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
27 const int ff_mpeg4audio_sample_rates[16] = {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
28 96000, 88200, 64000, 48000, 44100, 32000,
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
29 24000, 22050, 16000, 12000, 11025, 8000, 7350
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
30 };
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
31
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
32 const uint8_t ff_mpeg4audio_channels[8] = {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
33 0, 1, 2, 3, 4, 5, 6, 8
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
34 };
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
35
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
36 static inline int get_object_type(GetBitContext *gb)
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
37 {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
38 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
39 if (object_type == AOT_ESCAPE)
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
40 object_type = 32 + get_bits(gb, 6);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
41 return object_type;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
42 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
43
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
44 static inline int get_sample_rate(GetBitContext *gb, int *index)
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
45 {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
46 *index = get_bits(gb, 4);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
47 return *index == 0x0f ? get_bits(gb, 24) :
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
48 ff_mpeg4audio_sample_rates[*index];
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
49 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
50
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
51 int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size)
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
52 {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
53 GetBitContext gb;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
54 int specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
55
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
56 init_get_bits(&gb, buf, buf_size*8);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
57 c->object_type = get_object_type(&gb);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
58 c->sample_rate = get_sample_rate(&gb, &c->sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
59 c->chan_config = get_bits(&gb, 4);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
60 c->sbr = -1;
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
61 if (c->object_type == AOT_SBR) {
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
62 c->ext_object_type = c->object_type;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
63 c->sbr = 1;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
64 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
65 c->object_type = get_object_type(&gb);
9527
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
66 if (c->object_type == AOT_ER_BSAC)
b687da895962 Read extended channel configuration when extended AOT is BSAC.
jai_menon
parents: 9428
diff changeset
67 c->ext_chan_config = get_bits(&gb, 4);
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
68 } else {
10064
41796cdda927 Use the AOT enum instead of integer literals for setting and comparing audio
alexc
parents: 10009
diff changeset
69 c->ext_object_type = AOT_NULL;
9226
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
70 c->ext_sample_rate = 0;
13c86fee4873 init ext sample rate to 0 if not present
bcoudurier
parents: 6558
diff changeset
71 }
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
72 specific_config_bitindex = get_bits_count(&gb);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
73
10009
8649dc2299e2 Replace 5 with AOT_SBR when referring to the MPEG-4 audio object type.
jbr
parents: 9636
diff changeset
74 if (c->ext_object_type != AOT_SBR) {
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
75 int bits_left = buf_size*8 - specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
76 for (; bits_left > 15; bits_left--) {
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
77 if (show_bits(&gb, 11) == 0x2b7) { // sync extension
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
78 get_bits(&gb, 11);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
79 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
80 if (c->ext_object_type == AOT_SBR && (c->sbr = get_bits1(&gb)) == 1)
6558
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
81 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index);
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
82 break;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
83 } else
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
84 get_bits1(&gb); // skip 1 bit
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
85 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
86 }
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
87 return specific_config_bitindex;
06b1e0371e90 mpeg4audio common code
bcoudurier
parents:
diff changeset
88 }
9636
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
89
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
90 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
91 GetBitContext *gb,
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
92 int bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
93 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
94 unsigned int el = get_bits(gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
95 put_bits(pb, bits, el);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
96 return el;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
97 }
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
98
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
99 int ff_copy_pce_data(PutBitContext *pb, GetBitContext *gb)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
100 {
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
101 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
102 int offset = put_bits_count(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
103
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
104 copy_bits(pb, gb, 10); //Tag, Object Type, Frequency
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
105 five_bit_ch = copy_bits(pb, gb, 4); //Front
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
106 five_bit_ch += copy_bits(pb, gb, 4); //Side
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
107 five_bit_ch += copy_bits(pb, gb, 4); //Back
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
108 four_bit_ch = copy_bits(pb, gb, 2); //LFE
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
109 four_bit_ch += copy_bits(pb, gb, 3); //Data
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
110 five_bit_ch += copy_bits(pb, gb, 4); //Coupling
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
111 if (copy_bits(pb, gb, 1)) //Mono Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
112 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
113 if (copy_bits(pb, gb, 1)) //Stereo Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
114 copy_bits(pb, gb, 4);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
115 if (copy_bits(pb, gb, 1)) //Matrix Mixdown
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
116 copy_bits(pb, gb, 3);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
117 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
118 copy_bits(pb, gb, 16);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
119 if (bits)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
120 copy_bits(pb, gb, bits);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
121 align_put_bits(pb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
122 align_get_bits(gb);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
123 comment_size = copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
124 for (; comment_size > 0; comment_size--)
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
125 copy_bits(pb, gb, 8);
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
126
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
127 return put_bits_count(pb) - offset;
8e95c7402d1a Subroutine to copy an AAC Program Config Element (PCE)
alexc
parents: 9527
diff changeset
128 }