Mercurial > libavcodec.hg
comparison mlp_parser.c @ 7176:ae78650d4ac8 libavcodec
Make ff_mlp_read_major_sync() take a GetBitContext instead of buffers.
author | ramiro |
---|---|
date | Tue, 01 Jul 2008 01:36:16 +0000 |
parents | a9ed669e8cd1 |
children | a82e7d9c8c34 |
comparison
equal
deleted
inserted
replaced
7175:4a635a1859f0 | 7176:ae78650d4ac8 |
---|---|
86 } | 86 } |
87 | 87 |
88 /** Read a major sync info header - contains high level information about | 88 /** Read a major sync info header - contains high level information about |
89 * the stream - sample rate, channel arrangement etc. Most of this | 89 * the stream - sample rate, channel arrangement etc. Most of this |
90 * information is not actually necessary for decoding, only for playback. | 90 * information is not actually necessary for decoding, only for playback. |
91 * gb must be a freshly initialized GetBitContext with no bits read. | |
91 */ | 92 */ |
92 | 93 |
93 int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, const uint8_t *buf, | 94 int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb) |
94 unsigned int buf_size) | 95 { |
95 { | |
96 GetBitContext gb; | |
97 int ratebits; | 96 int ratebits; |
98 uint16_t checksum; | 97 uint16_t checksum; |
99 | 98 |
100 if (buf_size < 28) { | 99 assert(get_bits_count(gb) == 0); |
100 | |
101 if (gb->size_in_bits < 28 << 3) { | |
101 av_log(log, AV_LOG_ERROR, "Packet too short, unable to read major sync\n"); | 102 av_log(log, AV_LOG_ERROR, "Packet too short, unable to read major sync\n"); |
102 return -1; | 103 return -1; |
103 } | 104 } |
104 | 105 |
105 checksum = mlp_checksum16(buf, 26); | 106 checksum = mlp_checksum16(gb->buffer, 26); |
106 if (checksum != AV_RL16(buf+26)) { | 107 if (checksum != AV_RL16(gb->buffer+26)) { |
107 av_log(log, AV_LOG_ERROR, "Major sync info header checksum error\n"); | 108 av_log(log, AV_LOG_ERROR, "Major sync info header checksum error\n"); |
108 return -1; | 109 return -1; |
109 } | 110 } |
110 | 111 |
111 init_get_bits(&gb, buf, buf_size * 8); | 112 if (get_bits_long(gb, 24) != 0xf8726f) /* Sync words */ |
112 | |
113 if (get_bits_long(&gb, 24) != 0xf8726f) /* Sync words */ | |
114 return -1; | 113 return -1; |
115 | 114 |
116 mh->stream_type = get_bits(&gb, 8); | 115 mh->stream_type = get_bits(gb, 8); |
117 | 116 |
118 if (mh->stream_type == 0xbb) { | 117 if (mh->stream_type == 0xbb) { |
119 mh->group1_bits = mlp_quants[get_bits(&gb, 4)]; | 118 mh->group1_bits = mlp_quants[get_bits(gb, 4)]; |
120 mh->group2_bits = mlp_quants[get_bits(&gb, 4)]; | 119 mh->group2_bits = mlp_quants[get_bits(gb, 4)]; |
121 | 120 |
122 ratebits = get_bits(&gb, 4); | 121 ratebits = get_bits(gb, 4); |
123 mh->group1_samplerate = mlp_samplerate(ratebits); | 122 mh->group1_samplerate = mlp_samplerate(ratebits); |
124 mh->group2_samplerate = mlp_samplerate(get_bits(&gb, 4)); | 123 mh->group2_samplerate = mlp_samplerate(get_bits(gb, 4)); |
125 | 124 |
126 skip_bits(&gb, 11); | 125 skip_bits(gb, 11); |
127 | 126 |
128 mh->channels_mlp = get_bits(&gb, 5); | 127 mh->channels_mlp = get_bits(gb, 5); |
129 } else if (mh->stream_type == 0xba) { | 128 } else if (mh->stream_type == 0xba) { |
130 mh->group1_bits = 24; // TODO: Is this information actually conveyed anywhere? | 129 mh->group1_bits = 24; // TODO: Is this information actually conveyed anywhere? |
131 mh->group2_bits = 0; | 130 mh->group2_bits = 0; |
132 | 131 |
133 ratebits = get_bits(&gb, 4); | 132 ratebits = get_bits(gb, 4); |
134 mh->group1_samplerate = mlp_samplerate(ratebits); | 133 mh->group1_samplerate = mlp_samplerate(ratebits); |
135 mh->group2_samplerate = 0; | 134 mh->group2_samplerate = 0; |
136 | 135 |
137 skip_bits(&gb, 8); | 136 skip_bits(gb, 8); |
138 | 137 |
139 mh->channels_thd_stream1 = get_bits(&gb, 5); | 138 mh->channels_thd_stream1 = get_bits(gb, 5); |
140 | 139 |
141 skip_bits(&gb, 2); | 140 skip_bits(gb, 2); |
142 | 141 |
143 mh->channels_thd_stream2 = get_bits(&gb, 13); | 142 mh->channels_thd_stream2 = get_bits(gb, 13); |
144 } else | 143 } else |
145 return -1; | 144 return -1; |
146 | 145 |
147 mh->access_unit_size = 40 << (ratebits & 7); | 146 mh->access_unit_size = 40 << (ratebits & 7); |
148 mh->access_unit_size_pow2 = 64 << (ratebits & 7); | 147 mh->access_unit_size_pow2 = 64 << (ratebits & 7); |
149 | 148 |
150 skip_bits_long(&gb, 48); | 149 skip_bits_long(gb, 48); |
151 | 150 |
152 mh->is_vbr = get_bits1(&gb); | 151 mh->is_vbr = get_bits1(gb); |
153 | 152 |
154 mh->peak_bitrate = (get_bits(&gb, 15) * mh->group1_samplerate + 8) >> 4; | 153 mh->peak_bitrate = (get_bits(gb, 15) * mh->group1_samplerate + 8) >> 4; |
155 | 154 |
156 mh->num_substreams = get_bits(&gb, 4); | 155 mh->num_substreams = get_bits(gb, 4); |
157 | 156 |
158 skip_bits_long(&gb, 4 + 11 * 8); | 157 skip_bits_long(gb, 4 + 11 * 8); |
159 | 158 |
160 return 0; | 159 return 0; |
161 } | 160 } |
162 | 161 |
163 typedef struct MLPParseContext | 162 typedef struct MLPParseContext |
256 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) { | 255 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) { |
257 av_log(avctx, AV_LOG_INFO, "mlpparse: Parity check failed.\n"); | 256 av_log(avctx, AV_LOG_INFO, "mlpparse: Parity check failed.\n"); |
258 goto lost_sync; | 257 goto lost_sync; |
259 } | 258 } |
260 } else { | 259 } else { |
260 GetBitContext gb; | |
261 MLPHeaderInfo mh; | 261 MLPHeaderInfo mh; |
262 | 262 |
263 if (ff_mlp_read_major_sync(avctx, &mh, buf + 4, buf_size - 4) < 0) | 263 init_get_bits(&gb, buf + 4, (buf_size - 4) << 3); |
264 if (ff_mlp_read_major_sync(avctx, &mh, &gb) < 0) | |
264 goto lost_sync; | 265 goto lost_sync; |
265 | 266 |
266 #ifdef CONFIG_AUDIO_NONSHORT | 267 #ifdef CONFIG_AUDIO_NONSHORT |
267 avctx->bits_per_sample = mh.group1_bits; | 268 avctx->bits_per_sample = mh.group1_bits; |
268 if (avctx->bits_per_sample > 16) | 269 if (avctx->bits_per_sample > 16) |