annotate aac_parser.c @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 0dce4fe6e6f3
children 9592af8b6ce0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
1 /*
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
2 * Audio and Video frame extraction
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8549
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8549
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
5 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
6 * This file is part of FFmpeg.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
7 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
12 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
16 * Lesser General Public License for more details.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
17 *
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
21 */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
22
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
23 #include "parser.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
24 #include "aac_ac3_parser.h"
8549
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
25 #include "aac_parser.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9016
diff changeset
26 #include "get_bits.h"
6559
23430438e4e8 use mpeg4audio common code in aac parser
bcoudurier
parents: 6539
diff changeset
27 #include "mpeg4audio.h"
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
28
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
29 #define AAC_HEADER_SIZE 7
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
30
8549
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
31 int ff_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
32 {
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
33 int size, rdb, ch, sr;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
34 int aot, crc_abs;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
35
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
36 if(get_bits(gbc, 12) != 0xfff)
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
37 return AAC_AC3_PARSE_ERROR_SYNC;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
38
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
39 skip_bits1(gbc); /* id */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
40 skip_bits(gbc, 2); /* layer */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
41 crc_abs = get_bits1(gbc); /* protection_absent */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
42 aot = get_bits(gbc, 2); /* profile_objecttype */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
43 sr = get_bits(gbc, 4); /* sample_frequency_index */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
44 if(!ff_mpeg4audio_sample_rates[sr])
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
45 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
46 skip_bits1(gbc); /* private_bit */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
47 ch = get_bits(gbc, 3); /* channel_configuration */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
48
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
49 if(!ff_mpeg4audio_channels[ch])
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
50 return AAC_AC3_PARSE_ERROR_CHANNEL_CFG;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
51
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
52 skip_bits1(gbc); /* original/copy */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
53 skip_bits1(gbc); /* home */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
54
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
55 /* adts_variable_header */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
56 skip_bits1(gbc); /* copyright_identification_bit */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
57 skip_bits1(gbc); /* copyright_identification_start */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
58 size = get_bits(gbc, 13); /* aac_frame_length */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
59 if(size < AAC_HEADER_SIZE)
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
60 return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
61
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
62 skip_bits(gbc, 11); /* adts_buffer_fullness */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
63 rdb = get_bits(gbc, 2); /* number_of_raw_data_blocks_in_frame */
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
64
8819
b6e7247d3f0e Correctly map ADTS profile_ObjectType to MPEG-4 AOT
superdump
parents: 8629
diff changeset
65 hdr->object_type = aot + 1;
8549
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
66 hdr->chan_config = ch;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
67 hdr->crc_absent = crc_abs;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
68 hdr->num_aac_frames = rdb + 1;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
69 hdr->sampling_index = sr;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
70 hdr->sample_rate = ff_mpeg4audio_sample_rates[sr];
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
71 hdr->samples = (rdb + 1) * 1024;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
72 hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
73
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
74 return size;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
75 }
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
76
6643
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
77 static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
78 int *need_next_header, int *new_frame_start)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
79 {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
80 GetBitContext bits;
8549
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
81 AACADTSHeaderInfo hdr;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
82 int size;
8360
850b735daef8 AAC: fix strict aliasing violation in parser
mru
parents: 8018
diff changeset
83 union {
850b735daef8 AAC: fix strict aliasing violation in parser
mru
parents: 8018
diff changeset
84 uint64_t u64;
850b735daef8 AAC: fix strict aliasing violation in parser
mru
parents: 8018
diff changeset
85 uint8_t u8[8];
850b735daef8 AAC: fix strict aliasing violation in parser
mru
parents: 8018
diff changeset
86 } tmp;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
87
8360
850b735daef8 AAC: fix strict aliasing violation in parser
mru
parents: 8018
diff changeset
88 tmp.u64 = be2me_64(state);
850b735daef8 AAC: fix strict aliasing violation in parser
mru
parents: 8018
diff changeset
89 init_get_bits(&bits, tmp.u8+8-AAC_HEADER_SIZE, AAC_HEADER_SIZE * 8);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
90
8549
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
91 if ((size = ff_aac_parse_header(&bits, &hdr)) < 0)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
92 return 0;
6643
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
93 *need_next_header = 0;
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
94 *new_frame_start = 1;
8549
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
95 hdr_info->sample_rate = hdr.sample_rate;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
96 hdr_info->channels = ff_mpeg4audio_channels[hdr.chan_config];
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
97 hdr_info->samples = hdr.samples;
2cbfa4cd4670 Support ADTS AAC files in the ffaac decoder (limited to streams containing one
superdump
parents: 8360
diff changeset
98 hdr_info->bit_rate = hdr.bit_rate;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
99 return size;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
100 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
101
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 5817
diff changeset
102 static av_cold int aac_parse_init(AVCodecParserContext *s1)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
103 {
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
104 AACAC3ParseContext *s = s1->priv_data;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
105 s->header_size = AAC_HEADER_SIZE;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
106 s->sync = aac_sync;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
107 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
108 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
109
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
110
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
111 AVCodecParser aac_parser = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
112 { CODEC_ID_AAC },
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
113 sizeof(AACAC3ParseContext),
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
114 aac_parse_init,
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
115 ff_aac_ac3_parse,
9016
2c23106a79eb Close the AAC parse context, discovered by Netgem.
alexc
parents: 8819
diff changeset
116 ff_parse_close,
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
117 };