annotate ac3_parser.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 8b28e74de2c0
children
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 /*
7470
1a93d3bbe3ee cosmetics: make all references to AC-3 capitalized and hyphenated
jbr
parents: 7138
diff changeset
2 * AC-3 parser
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8545
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8545
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 "ac3_parser.h"
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
25 #include "aac_ac3_parser.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 8992
diff changeset
26 #include "get_bits.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
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
29 #define AC3_HEADER_SIZE 7
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
30
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
31
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
32 static const uint8_t eac3_blocks[4] = {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
33 1, 2, 3, 6
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
34 };
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
35
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
36
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
37 int ff_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
38 {
6116
4f8fcb40bf2c remove unneeded variables from AC3HeaderInfo
jbr
parents: 6005
diff changeset
39 int frame_size_code;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
40
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
41 memset(hdr, 0, sizeof(*hdr));
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
42
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
43 hdr->sync_word = get_bits(gbc, 16);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
44 if(hdr->sync_word != 0x0B77)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
45 return AAC_AC3_PARSE_ERROR_SYNC;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
46
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
47 /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
48 hdr->bitstream_id = show_bits_long(gbc, 29) & 0x1F;
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
49 if(hdr->bitstream_id > 16)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
50 return AAC_AC3_PARSE_ERROR_BSID;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
51
7011
77f607fb4e8b get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents: 6671
diff changeset
52 hdr->num_blocks = 6;
77f607fb4e8b get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents: 6671
diff changeset
53
7016
b514562e0aef set default mix levels regardless of bitstream id
jbr
parents: 7012
diff changeset
54 /* set default mix levels */
7019
81d5c68233e5 move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents: 7018
diff changeset
55 hdr->center_mix_level = 1; // -4.5dB
81d5c68233e5 move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents: 7018
diff changeset
56 hdr->surround_mix_level = 1; // -6.0dB
7016
b514562e0aef set default mix levels regardless of bitstream id
jbr
parents: 7012
diff changeset
57
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
58 if(hdr->bitstream_id <= 10) {
6118
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
59 /* Normal AC-3 */
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
60 hdr->crc1 = get_bits(gbc, 16);
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
61 hdr->sr_code = get_bits(gbc, 2);
6118
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
62 if(hdr->sr_code == 3)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
63 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
64
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
65 frame_size_code = get_bits(gbc, 6);
6118
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
66 if(frame_size_code > 37)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
67 return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
68
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
69 skip_bits(gbc, 5); // skip bsid, already got it
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
70
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
71 skip_bits(gbc, 3); // skip bitstream mode
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
72 hdr->channel_mode = get_bits(gbc, 3);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
73
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
74 if(hdr->channel_mode == AC3_CHMODE_STEREO) {
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
75 skip_bits(gbc, 2); // skip dsurmod
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
76 } else {
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
77 if((hdr->channel_mode & 1) && hdr->channel_mode != AC3_CHMODE_MONO)
7019
81d5c68233e5 move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents: 7018
diff changeset
78 hdr->center_mix_level = get_bits(gbc, 2);
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
79 if(hdr->channel_mode & 4)
7019
81d5c68233e5 move mix level tables from parser to decoder. have parser read bitstream value instead of using an index to a table in the decoder.
jbr
parents: 7018
diff changeset
80 hdr->surround_mix_level = get_bits(gbc, 2);
6118
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
81 }
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
82 hdr->lfe_on = get_bits1(gbc);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
83
6118
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
84 hdr->sr_shift = FFMAX(hdr->bitstream_id, 8) - 8;
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
85 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code] >> hdr->sr_shift;
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
86 hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift;
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
87 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
88 hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2;
6651
abc8176ddf88 Make most of E-AC-3 work without breaking regression tests.
michael
parents: 6645
diff changeset
89 hdr->frame_type = EAC3_FRAME_TYPE_AC3_CONVERT; //EAC3_FRAME_TYPE_INDEPENDENT;
7012
4156c54aedba get substreamid from ac3 parser
jbr
parents: 7011
diff changeset
90 hdr->substreamid = 0;
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
91 } else {
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
92 /* Enhanced AC-3 */
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
93 hdr->crc1 = 0;
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
94 hdr->frame_type = get_bits(gbc, 2);
6540
b0d44aec1ec0 change name from stream type to frame type in AC3 code
bwolowiec
parents: 6539
diff changeset
95 if(hdr->frame_type == EAC3_FRAME_TYPE_RESERVED)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
96 return AAC_AC3_PARSE_ERROR_FRAME_TYPE;
6529
5542d0c04a55 using stream type in eac3 parser
bwolowiec
parents: 6527
diff changeset
97
7012
4156c54aedba get substreamid from ac3 parser
jbr
parents: 7011
diff changeset
98 hdr->substreamid = get_bits(gbc, 3);
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
99
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
100 hdr->frame_size = (get_bits(gbc, 11) + 1) << 1;
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
101 if(hdr->frame_size < AC3_HEADER_SIZE)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
102 return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
103
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
104 hdr->sr_code = get_bits(gbc, 2);
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
105 if (hdr->sr_code == 3) {
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
106 int sr_code2 = get_bits(gbc, 2);
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
107 if(sr_code2 == 3)
8545
a5402e89a80c Factorise enum of AC3 error types to be usable by AAC in the ADTS patch that
superdump
parents: 8361
diff changeset
108 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
109 hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2;
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
110 hdr->sr_shift = 1;
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
111 } else {
7011
77f607fb4e8b get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents: 6671
diff changeset
112 hdr->num_blocks = eac3_blocks[get_bits(gbc, 2)];
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
113 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code];
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
114 hdr->sr_shift = 0;
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
115 }
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
116
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
117 hdr->channel_mode = get_bits(gbc, 3);
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
118 hdr->lfe_on = get_bits1(gbc);
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
119
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
120 hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate /
7011
77f607fb4e8b get the number of blocks from the ac3 parser and use in the ac3 decoder.
jbr
parents: 6671
diff changeset
121 (hdr->num_blocks * 256.0));
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
122 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
123 }
9512
ba5d9a97ab2f Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents: 9428
diff changeset
124 hdr->channel_layout = ff_ac3_channel_layout_tab[hdr->channel_mode];
ba5d9a97ab2f Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents: 9428
diff changeset
125 if (hdr->lfe_on)
ba5d9a97ab2f Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents: 9428
diff changeset
126 hdr->channel_layout |= CH_LOW_FREQUENCY;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
127
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
128 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
129 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
130
6671
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
131 int ff_ac3_parse_header_full(GetBitContext *gbc, AC3HeaderInfo *hdr){
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
132 int ret, i;
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
133 ret = ff_ac3_parse_header(gbc, hdr);
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
134 if(!ret){
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
135 if(hdr->bitstream_id>10){
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
136 /* Enhanced AC-3 */
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
137 skip_bits(gbc, 5); // skip bitstream id
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
138
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
139 /* skip dialog normalization and compression gain */
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
140 for (i = 0; i < (hdr->channel_mode ? 1 : 2); i++) {
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
141 skip_bits(gbc, 5); // skip dialog normalization
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
142 if (get_bits1(gbc)) {
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
143 skip_bits(gbc, 8); //skip Compression gain word
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
144 }
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
145 }
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
146 /* dependent stream channel map */
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
147 if (hdr->frame_type == EAC3_FRAME_TYPE_DEPENDENT && get_bits1(gbc)) {
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
148 hdr->channel_map = get_bits(gbc, 16); //custom channel map
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
149 return 0;
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
150 }
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
151 }
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
152 //default channel map based on acmod and lfeon
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
153 hdr->channel_map = ff_eac3_default_chmap[hdr->channel_mode];
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
154 if(hdr->lfe_on)
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
155 hdr->channel_map |= AC3_CHMAP_LFE;
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
156 }
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
157 return ret;
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
158 }
2d0b86dfe5bb add a ff_ac3_parse_header_full() which calls ff_ac3_parse_header()
bwolowiec
parents: 6661
diff changeset
159
6643
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
160 static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info,
4d04fcb5e1e4 Add new_frame_start and need_next_header.
michael
parents: 6642
diff changeset
161 int *need_next_header, int *new_frame_start)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
162 {
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
163 int err;
8361
c34d5e164b22 AC3: fix strict aliasing violation in parser
mru
parents: 7769
diff changeset
164 union {
c34d5e164b22 AC3: fix strict aliasing violation in parser
mru
parents: 7769
diff changeset
165 uint64_t u64;
c34d5e164b22 AC3: fix strict aliasing violation in parser
mru
parents: 7769
diff changeset
166 uint8_t u8[8];
12129
8b28e74de2c0 Add av_ prefix to bswap macros
mru
parents: 12128
diff changeset
167 } tmp = { av_be2ne64(state) };
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
168 AC3HeaderInfo hdr;
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
169 GetBitContext gbc;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
170
8361
c34d5e164b22 AC3: fix strict aliasing violation in parser
mru
parents: 7769
diff changeset
171 init_get_bits(&gbc, tmp.u8+8-AC3_HEADER_SIZE, 54);
6661
a409fbf1f42b change ff_ac3_parse_header() to take a GetBitContext instead of const char*
bwolowiec
parents: 6651
diff changeset
172 err = ff_ac3_parse_header(&gbc, &hdr);
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
173
6117
01b1342e717b move E-AC3 header parsing to ff_ac3_parse_header()
jbr
parents: 6116
diff changeset
174 if(err < 0)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
175 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
176
6527
32b984487899 Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents: 6517
diff changeset
177 hdr_info->sample_rate = hdr.sample_rate;
32b984487899 Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents: 6517
diff changeset
178 hdr_info->bit_rate = hdr.bit_rate;
32b984487899 Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents: 6517
diff changeset
179 hdr_info->channels = hdr.channels;
9512
ba5d9a97ab2f Add channel layout support to the AC-3 decoder and AC-3 parser.
jbr
parents: 9428
diff changeset
180 hdr_info->channel_layout = hdr.channel_layout;
8992
5a3426d7d053 Set the correct number of samples for E-AC-3 in the AC3 parser.
jbr
parents: 8977
diff changeset
181 hdr_info->samples = hdr.num_blocks * 256;
8977
82ab0b77695b Allow AC-3 parser to modify codec_id.
jbr
parents: 8629
diff changeset
182 if(hdr.bitstream_id>10)
82ab0b77695b Allow AC-3 parser to modify codec_id.
jbr
parents: 8629
diff changeset
183 hdr_info->codec_id = CODEC_ID_EAC3;
12111
6e15ce7ca0ca ac3: make the value of codec_id during (E-)AC-3 parsing stay CODEC_ID_EAC3
jbr
parents: 9512
diff changeset
184 else if (hdr_info->codec_id == CODEC_ID_NONE)
8977
82ab0b77695b Allow AC-3 parser to modify codec_id.
jbr
parents: 8629
diff changeset
185 hdr_info->codec_id = CODEC_ID_AC3;
6539
04763b6fd4f0 removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents: 6530
diff changeset
186
6651
abc8176ddf88 Make most of E-AC-3 work without breaking regression tests.
michael
parents: 6645
diff changeset
187 *need_next_header = (hdr.frame_type != EAC3_FRAME_TYPE_AC3_CONVERT);
abc8176ddf88 Make most of E-AC-3 work without breaking regression tests.
michael
parents: 6645
diff changeset
188 *new_frame_start = (hdr.frame_type != EAC3_FRAME_TYPE_DEPENDENT);
6118
76801e61ddc4 cosmetics: indentation after last commit
jbr
parents: 6117
diff changeset
189 return hdr.frame_size;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
190 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
191
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6118
diff changeset
192 static av_cold int ac3_parse_init(AVCodecParserContext *s1)
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
193 {
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
194 AACAC3ParseContext *s = s1->priv_data;
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
195 s->header_size = AC3_HEADER_SIZE;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
196 s->sync = ac3_sync;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
197 return 0;
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
198 }
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
199
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
200
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
201 AVCodecParser ac3_parser = {
7769
e5f7a43f63ae create a separate codec_id for E-AC-3
jbr
parents: 7470
diff changeset
202 { CODEC_ID_AC3, CODEC_ID_EAC3 },
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
203 sizeof(AACAC3ParseContext),
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
204 ac3_parse_init,
4942
b42e963c8149 cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents: 4941
diff changeset
205 ff_aac_ac3_parse,
7138
1f85910c9ab2 Close parse context.
benoit
parents: 7019
diff changeset
206 ff_parse_close,
4941
c3ee5c30c297 move aac and ac3 parsers in their own files
aurel
parents:
diff changeset
207 };