annotate aac_parser.c @ 6920:d02af7474bff libavcodec

Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays. fixes CID84 RUN2 CID85 RUN2 CID86 RUN2 CID87 RUN2 CID88 RUN2 CID89 RUN2 CID90 RUN2 CID91 RUN2 CID92 RUN2 CID93 RUN2 CID94 RUN2 CID95 RUN2 CID96 RUN2 CID97 RUN2 CID98 RUN2 CID99 RUN2 CID100 RUN2 CID101 RUN2 CID102 RUN2 CID103 RUN2 CID104 RUN2 CID105 RUN2 CID106 RUN2
author michael
date Wed, 28 May 2008 11:59:41 +0000
parents 4d04fcb5e1e4
children e381bf921a88
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
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard.
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer.
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"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
25 #include "bitstream.h"
6559
23430438e4e8 use mpeg4audio common code in aac parser
bcoudurier
parents: 6539
diff changeset
26 #include "mpeg4audio.h"
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
27
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
28 #define AAC_HEADER_SIZE 7
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
29
6643
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
30 static int aac_sync(uint64_t state, AACAC3ParseContext *hdr_info,
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
31 int *need_next_header, int *new_frame_start)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
32 {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
33 GetBitContext bits;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
34 int size, rdb, ch, sr;
6642
866b9ade048c Change aac and ac3 parsers to use ff_combine_frame().
michael
parents: 6639
diff changeset
35 uint64_t tmp = be2me_64(state);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
36
6642
866b9ade048c Change aac and ac3 parsers to use ff_combine_frame().
michael
parents: 6639
diff changeset
37 init_get_bits(&bits, ((uint8_t *)&tmp)+8-AAC_HEADER_SIZE, AAC_HEADER_SIZE * 8);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
38
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
39 if(get_bits(&bits, 12) != 0xfff)
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
40 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
41
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
42 skip_bits1(&bits); /* id */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
43 skip_bits(&bits, 2); /* layer */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
44 skip_bits1(&bits); /* protection_absent */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
45 skip_bits(&bits, 2); /* profile_objecttype */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
46 sr = get_bits(&bits, 4); /* sample_frequency_index */
6559
23430438e4e8 use mpeg4audio common code in aac parser
bcoudurier
parents: 6539
diff changeset
47 if(!ff_mpeg4audio_sample_rates[sr])
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
48 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
49 skip_bits1(&bits); /* private_bit */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
50 ch = get_bits(&bits, 3); /* channel_configuration */
6559
23430438e4e8 use mpeg4audio common code in aac parser
bcoudurier
parents: 6539
diff changeset
51 if(!ff_mpeg4audio_channels[ch])
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
52 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
53 skip_bits1(&bits); /* original/copy */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
54 skip_bits1(&bits); /* home */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
55
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
56 /* adts_variable_header */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
57 skip_bits1(&bits); /* copyright_identification_bit */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
58 skip_bits1(&bits); /* copyright_identification_start */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
59 size = get_bits(&bits, 13); /* aac_frame_length */
5817
ced30500e2b1 prevent infinite loop and memcpy of negative amounts
michael
parents: 4942
diff changeset
60 if(size < AAC_HEADER_SIZE)
ced30500e2b1 prevent infinite loop and memcpy of negative amounts
michael
parents: 4942
diff changeset
61 return 0;
ced30500e2b1 prevent infinite loop and memcpy of negative amounts
michael
parents: 4942
diff changeset
62
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
63 skip_bits(&bits, 11); /* adts_buffer_fullness */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
64 rdb = get_bits(&bits, 2); /* number_of_raw_data_blocks_in_frame */
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
65
6559
23430438e4e8 use mpeg4audio common code in aac parser
bcoudurier
parents: 6539
diff changeset
66 hdr_info->channels = ff_mpeg4audio_channels[ch];
23430438e4e8 use mpeg4audio common code in aac parser
bcoudurier
parents: 6539
diff changeset
67 hdr_info->sample_rate = ff_mpeg4audio_sample_rates[sr];
6527
32b984487899 Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents: 6517
diff changeset
68 hdr_info->samples = (rdb + 1) * 1024;
32b984487899 Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents: 6517
diff changeset
69 hdr_info->bit_rate = size * 8 * hdr_info->sample_rate / hdr_info->samples;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
70
6643
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
71 *need_next_header = 0;
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
72 *new_frame_start = 1;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
73 return size;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
74 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
75
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 5817
diff changeset
76 static av_cold int aac_parse_init(AVCodecParserContext *s1)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
77 {
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
78 AACAC3ParseContext *s = s1->priv_data;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
79 s->header_size = AAC_HEADER_SIZE;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
80 s->sync = aac_sync;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
81 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
82 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
83
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
84
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
85 AVCodecParser aac_parser = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
86 { CODEC_ID_AAC },
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
87 sizeof(AACAC3ParseContext),
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
88 aac_parse_init,
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
89 ff_aac_ac3_parse,
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
90 NULL,
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
91 };