Mercurial > libavcodec.hg
annotate mpeg4audio.c @ 9896:bbefbca72722 libavcodec
Drop code that attempts to decode frames that are prefixed by junk.
Too often it ends up decoding random data into noise without detecting
it (for example after seeking of some MP3 data with oddly often occurring
startcode emulation).
Fixes issue1154.
| author | michael |
|---|---|
| date | Tue, 30 Jun 2009 03:57:27 +0000 |
| parents | 8e95c7402d1a |
| children | 8649dc2299e2 |
| rev | line source |
|---|---|
| 6558 | 1 /* |
| 2 * MPEG-4 Audio common code | |
| 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 | 5 * |
| 6 * This file is part of FFmpeg. | |
| 7 * | |
| 8 * FFmpeg is free software; you can redistribute it and/or | |
| 9 * modify it under the terms of the GNU Lesser General Public | |
| 10 * License as published by the Free Software Foundation; either | |
| 11 * version 2.1 of the License, or (at your option) any later version. | |
| 12 * | |
| 13 * FFmpeg is distributed in the hope that it will be useful, | |
| 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 16 * Lesser General Public License for more details. | |
| 17 * | |
| 18 * You should have received a copy of the GNU Lesser General Public | |
| 19 * License along with FFmpeg; if not, write to the Free Software | |
| 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
| 21 */ | |
| 22 | |
| 9428 | 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 | 25 #include "mpeg4audio.h" |
| 26 | |
| 27 const int ff_mpeg4audio_sample_rates[16] = { | |
| 28 96000, 88200, 64000, 48000, 44100, 32000, | |
| 29 24000, 22050, 16000, 12000, 11025, 8000, 7350 | |
| 30 }; | |
| 31 | |
| 32 const uint8_t ff_mpeg4audio_channels[8] = { | |
| 33 0, 1, 2, 3, 4, 5, 6, 8 | |
| 34 }; | |
| 35 | |
| 36 static inline int get_object_type(GetBitContext *gb) | |
| 37 { | |
| 38 int object_type = get_bits(gb, 5); | |
| 39 if (object_type == 31) | |
| 40 object_type = 32 + get_bits(gb, 6); | |
| 41 return object_type; | |
| 42 } | |
| 43 | |
| 44 static inline int get_sample_rate(GetBitContext *gb, int *index) | |
| 45 { | |
| 46 *index = get_bits(gb, 4); | |
| 47 return *index == 0x0f ? get_bits(gb, 24) : | |
| 48 ff_mpeg4audio_sample_rates[*index]; | |
| 49 } | |
| 50 | |
| 51 int ff_mpeg4audio_get_config(MPEG4AudioConfig *c, const uint8_t *buf, int buf_size) | |
| 52 { | |
| 53 GetBitContext gb; | |
| 54 int specific_config_bitindex; | |
| 55 | |
| 56 init_get_bits(&gb, buf, buf_size*8); | |
| 57 c->object_type = get_object_type(&gb); | |
| 58 c->sample_rate = get_sample_rate(&gb, &c->sampling_index); | |
| 59 c->chan_config = get_bits(&gb, 4); | |
| 60 c->sbr = -1; | |
| 61 if (c->object_type == 5) { | |
| 62 c->ext_object_type = c->object_type; | |
| 63 c->sbr = 1; | |
| 64 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); | |
| 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 | 68 } else { |
| 6558 | 69 c->ext_object_type = 0; |
| 9226 | 70 c->ext_sample_rate = 0; |
| 71 } | |
| 6558 | 72 specific_config_bitindex = get_bits_count(&gb); |
| 73 | |
| 74 if (c->ext_object_type != 5) { | |
| 75 int bits_left = buf_size*8 - specific_config_bitindex; | |
| 76 for (; bits_left > 15; bits_left--) { | |
| 77 if (show_bits(&gb, 11) == 0x2b7) { // sync extension | |
| 78 get_bits(&gb, 11); | |
| 79 c->ext_object_type = get_object_type(&gb); | |
| 80 if (c->ext_object_type == 5 && (c->sbr = get_bits1(&gb)) == 1) | |
| 81 c->ext_sample_rate = get_sample_rate(&gb, &c->ext_sampling_index); | |
| 82 break; | |
| 83 } else | |
| 84 get_bits1(&gb); // skip 1 bit | |
| 85 } | |
| 86 } | |
| 87 return specific_config_bitindex; | |
| 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 } |
