Mercurial > libavcodec.hg
annotate ac3_parser.c @ 6560:ad2cf074632a libavcodec
Do not use the mlib IDCT by default. We do not want videos which are only
decodable with the mlib IDCT. If anyone knows of other IDCTs which are not
binary identical to a widely available one, ensure that they are not used
by default. Such IDCTs should never have been default anyway, but possibly
something slipped through the reviews ...
| author | michael |
|---|---|
| date | Wed, 02 Apr 2008 11:47:00 +0000 |
| parents | b0d44aec1ec0 |
| children | 013def14c931 |
| rev | line source |
|---|---|
| 4941 | 1 /* |
| 2 * AC3 parser | |
| 3 * Copyright (c) 2003 Fabrice Bellard. | |
| 4 * Copyright (c) 2003 Michael Niedermayer. | |
| 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 | |
| 23 #include "parser.h" | |
| 24 #include "ac3_parser.h" | |
| 25 #include "aac_ac3_parser.h" | |
| 26 #include "bitstream.h" | |
| 27 | |
| 28 | |
| 29 #define AC3_HEADER_SIZE 7 | |
| 30 | |
| 31 | |
| 32 static const uint8_t eac3_blocks[4] = { | |
| 33 1, 2, 3, 6 | |
| 34 }; | |
| 35 | |
| 36 | |
| 37 int ff_ac3_parse_header(const uint8_t buf[7], AC3HeaderInfo *hdr) | |
| 38 { | |
| 39 GetBitContext gbc; | |
| 6116 | 40 int frame_size_code; |
| 6117 | 41 int num_blocks; |
| 4941 | 42 |
| 43 memset(hdr, 0, sizeof(*hdr)); | |
| 44 | |
| 45 init_get_bits(&gbc, buf, 54); | |
| 46 | |
| 47 hdr->sync_word = get_bits(&gbc, 16); | |
| 48 if(hdr->sync_word != 0x0B77) | |
| 5680 | 49 return AC3_PARSE_ERROR_SYNC; |
| 4941 | 50 |
| 6117 | 51 /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */ |
| 6005 | 52 hdr->bitstream_id = show_bits_long(&gbc, 29) & 0x1F; |
| 6117 | 53 if(hdr->bitstream_id > 16) |
| 5680 | 54 return AC3_PARSE_ERROR_BSID; |
| 4941 | 55 |
| 6117 | 56 if(hdr->bitstream_id <= 10) { |
| 6118 | 57 /* Normal AC-3 */ |
| 58 hdr->crc1 = get_bits(&gbc, 16); | |
| 59 hdr->sr_code = get_bits(&gbc, 2); | |
| 60 if(hdr->sr_code == 3) | |
| 61 return AC3_PARSE_ERROR_SAMPLE_RATE; | |
| 4941 | 62 |
| 6118 | 63 frame_size_code = get_bits(&gbc, 6); |
| 64 if(frame_size_code > 37) | |
| 65 return AC3_PARSE_ERROR_FRAME_SIZE; | |
| 4941 | 66 |
| 6118 | 67 skip_bits(&gbc, 5); // skip bsid, already got it |
| 4941 | 68 |
| 6118 | 69 skip_bits(&gbc, 3); // skip bitstream mode |
| 70 hdr->channel_mode = get_bits(&gbc, 3); | |
| 71 if((hdr->channel_mode & 1) && hdr->channel_mode != AC3_CHMODE_MONO) { | |
| 72 skip_bits(&gbc, 2); // skip center mix level | |
| 73 } | |
| 74 if(hdr->channel_mode & 4) { | |
| 75 skip_bits(&gbc, 2); // skip surround mix level | |
| 76 } | |
| 77 if(hdr->channel_mode == AC3_CHMODE_STEREO) { | |
| 78 skip_bits(&gbc, 2); // skip dolby surround mode | |
| 79 } | |
| 80 hdr->lfe_on = get_bits1(&gbc); | |
| 4941 | 81 |
| 6118 | 82 hdr->sr_shift = FFMAX(hdr->bitstream_id, 8) - 8; |
| 83 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code] >> hdr->sr_shift; | |
| 84 hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift; | |
| 85 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; | |
| 86 hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2; | |
|
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
87 hdr->frame_type = EAC3_FRAME_TYPE_INDEPENDENT; |
| 6117 | 88 } else { |
| 89 /* Enhanced AC-3 */ | |
| 90 hdr->crc1 = 0; | |
|
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
91 hdr->frame_type = get_bits(&gbc, 2); |
|
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
92 if(hdr->frame_type == EAC3_FRAME_TYPE_RESERVED) |
|
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
93 return AC3_PARSE_ERROR_FRAME_TYPE; |
| 6529 | 94 |
| 6117 | 95 skip_bits(&gbc, 3); // skip substream id |
| 96 | |
| 97 hdr->frame_size = (get_bits(&gbc, 11) + 1) << 1; | |
| 98 if(hdr->frame_size < AC3_HEADER_SIZE) | |
| 99 return AC3_PARSE_ERROR_FRAME_SIZE; | |
| 100 | |
| 101 hdr->sr_code = get_bits(&gbc, 2); | |
| 102 if (hdr->sr_code == 3) { | |
| 103 int sr_code2 = get_bits(&gbc, 2); | |
| 104 if(sr_code2 == 3) | |
| 105 return AC3_PARSE_ERROR_SAMPLE_RATE; | |
| 106 hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2; | |
| 107 hdr->sr_shift = 1; | |
| 108 num_blocks = 6; | |
| 109 } else { | |
| 110 num_blocks = eac3_blocks[get_bits(&gbc, 2)]; | |
| 111 hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code]; | |
| 112 hdr->sr_shift = 0; | |
| 113 } | |
| 114 | |
| 115 hdr->channel_mode = get_bits(&gbc, 3); | |
| 116 hdr->lfe_on = get_bits1(&gbc); | |
| 117 | |
| 118 hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate / | |
| 119 (num_blocks * 256.0)); | |
| 120 hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on; | |
| 121 } | |
| 4941 | 122 |
| 123 return 0; | |
| 124 } | |
| 125 | |
|
6539
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
126 static int ac3_sync(AACAC3ParseContext *hdr_info, AACAC3FrameFlag *flag) |
| 4941 | 127 { |
| 128 int err; | |
| 129 AC3HeaderInfo hdr; | |
| 130 | |
|
6527
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
131 err = ff_ac3_parse_header(hdr_info->inbuf, &hdr); |
| 4941 | 132 |
| 6117 | 133 if(err < 0) |
| 4941 | 134 return 0; |
| 135 | |
|
6527
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
136 hdr_info->sample_rate = hdr.sample_rate; |
|
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
137 hdr_info->bit_rate = hdr.bit_rate; |
|
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
138 hdr_info->channels = hdr.channels; |
|
32b984487899
Pass AACAC3ParseContext to sync() instead of individual arguments. Patch by
jbr
parents:
6517
diff
changeset
|
139 hdr_info->samples = AC3_FRAME_SIZE; |
|
6539
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
140 |
|
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
141 switch(hdr.frame_type){ |
|
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
142 case EAC3_FRAME_TYPE_INDEPENDENT: |
|
6539
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
143 *flag = FRAME_START; |
|
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
144 break; |
|
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
145 case EAC3_FRAME_TYPE_DEPENDENT: |
|
6539
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
146 *flag = FRAME_CONTINUATION; |
|
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
147 break; |
|
6540
b0d44aec1ec0
change name from stream type to frame type in AC3 code
bwolowiec
parents:
6539
diff
changeset
|
148 case EAC3_FRAME_TYPE_AC3_CONVERT: |
|
6539
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
149 *flag = FRAME_COMPLETE; |
|
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
150 break; |
|
04763b6fd4f0
removal of stream_type in AACAC3ParseContext and adding AACAC3FrameFlag
bwolowiec
parents:
6530
diff
changeset
|
151 } |
| 6118 | 152 return hdr.frame_size; |
| 4941 | 153 } |
| 154 | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6118
diff
changeset
|
155 static av_cold int ac3_parse_init(AVCodecParserContext *s1) |
| 4941 | 156 { |
|
4942
b42e963c8149
cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents:
4941
diff
changeset
|
157 AACAC3ParseContext *s = s1->priv_data; |
| 4941 | 158 s->inbuf_ptr = s->inbuf; |
| 159 s->header_size = AC3_HEADER_SIZE; | |
| 160 s->sync = ac3_sync; | |
| 161 return 0; | |
| 162 } | |
| 163 | |
| 164 | |
| 165 AVCodecParser ac3_parser = { | |
| 166 { CODEC_ID_AC3 }, | |
|
4942
b42e963c8149
cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents:
4941
diff
changeset
|
167 sizeof(AACAC3ParseContext), |
| 4941 | 168 ac3_parse_init, |
|
4942
b42e963c8149
cosmetics: rename for consistency after previous aac and ac3 parsers move
aurel
parents:
4941
diff
changeset
|
169 ff_aac_ac3_parse, |
| 4941 | 170 NULL, |
| 171 }; |
