| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/formats/mpeg/mpeg_audio_stream_parser_base.h" | 5 #include "media/formats/mpeg/mpeg_audio_stream_parser_base.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 int MPEGAudioStreamParserBase::ParseFrame(const uint8_t* data, | 172 int MPEGAudioStreamParserBase::ParseFrame(const uint8_t* data, |
| 173 int size, | 173 int size, |
| 174 BufferQueue* buffers) { | 174 BufferQueue* buffers) { |
| 175 DVLOG(2) << __FUNCTION__ << "(" << size << ")"; | 175 DVLOG(2) << __FUNCTION__ << "(" << size << ")"; |
| 176 | 176 |
| 177 int sample_rate; | 177 int sample_rate; |
| 178 ChannelLayout channel_layout; | 178 ChannelLayout channel_layout; |
| 179 int frame_size; | 179 int frame_size; |
| 180 int sample_count; | 180 int sample_count; |
| 181 bool metadata_frame = false; | 181 bool metadata_frame = false; |
| 182 int bytes_read = ParseFrameHeader(data, | 182 std::vector<uint8_t> extra_data; |
| 183 size, | 183 int bytes_read = |
| 184 &frame_size, | 184 ParseFrameHeader(data, size, &frame_size, &sample_rate, &channel_layout, |
| 185 &sample_rate, | 185 &sample_count, &metadata_frame, &extra_data); |
| 186 &channel_layout, | |
| 187 &sample_count, | |
| 188 &metadata_frame); | |
| 189 | 186 |
| 190 if (bytes_read <= 0) | 187 if (bytes_read <= 0) |
| 191 return bytes_read; | 188 return bytes_read; |
| 192 | 189 |
| 193 // Make sure data contains the entire frame. | 190 // Make sure data contains the entire frame. |
| 194 if (size < frame_size) | 191 if (size < frame_size) |
| 195 return 0; | 192 return 0; |
| 196 | 193 |
| 197 DVLOG(2) << " sample_rate " << sample_rate | 194 DVLOG(2) << " sample_rate " << sample_rate << " channel_layout " |
| 198 << " channel_layout " << channel_layout | 195 << channel_layout << " frame_size " << frame_size << " sample_count " |
| 199 << " frame_size " << frame_size | 196 << sample_count; |
| 200 << " sample_count " << sample_count; | |
| 201 | 197 |
| 202 if (config_.IsValidConfig() && | 198 if (config_.IsValidConfig() && (config_.samples_per_second() != sample_rate || |
| 203 (config_.samples_per_second() != sample_rate || | 199 config_.channel_layout() != channel_layout)) { |
| 204 config_.channel_layout() != channel_layout)) { | |
| 205 // Clear config data so that a config change is initiated. | 200 // Clear config data so that a config change is initiated. |
| 206 config_ = AudioDecoderConfig(); | 201 config_ = AudioDecoderConfig(); |
| 207 | 202 |
| 208 // Send all buffers associated with the previous config. | 203 // Send all buffers associated with the previous config. |
| 209 if (!buffers->empty() && !SendBuffers(buffers, true)) | 204 if (!buffers->empty() && !SendBuffers(buffers, true)) |
| 210 return -1; | 205 return -1; |
| 211 } | 206 } |
| 212 | 207 |
| 213 if (!config_.IsValidConfig()) { | 208 if (!config_.IsValidConfig()) { |
| 214 config_.Initialize(audio_codec_, kSampleFormatF32, channel_layout, | 209 config_.Initialize(audio_codec_, kSampleFormatF32, channel_layout, |
| 215 sample_rate, std::vector<uint8_t>(), Unencrypted(), | 210 sample_rate, extra_data, Unencrypted(), |
| 216 base::TimeDelta(), codec_delay_); | 211 base::TimeDelta(), codec_delay_); |
| 217 | 212 |
| 218 base::TimeDelta base_timestamp; | 213 base::TimeDelta base_timestamp; |
| 219 if (timestamp_helper_) | 214 if (timestamp_helper_) |
| 220 base_timestamp = timestamp_helper_->GetTimestamp(); | 215 base_timestamp = timestamp_helper_->GetTimestamp(); |
| 221 | 216 |
| 222 timestamp_helper_.reset(new AudioTimestampHelper(sample_rate)); | 217 timestamp_helper_.reset(new AudioTimestampHelper(sample_rate)); |
| 223 timestamp_helper_->SetBaseTimestamp(base_timestamp); | 218 timestamp_helper_->SetBaseTimestamp(base_timestamp); |
| 224 | 219 |
| 225 std::unique_ptr<MediaTracks> media_tracks(new MediaTracks()); | 220 std::unique_ptr<MediaTracks> media_tracks(new MediaTracks()); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 | 289 |
| 295 if (size < 10) | 290 if (size < 10) |
| 296 return 0; | 291 return 0; |
| 297 | 292 |
| 298 BitReader reader(data, size); | 293 BitReader reader(data, size); |
| 299 int32_t id; | 294 int32_t id; |
| 300 int version; | 295 int version; |
| 301 uint8_t flags; | 296 uint8_t flags; |
| 302 int32_t id3_size; | 297 int32_t id3_size; |
| 303 | 298 |
| 304 if (!reader.ReadBits(24, &id) || | 299 if (!reader.ReadBits(24, &id) || !reader.ReadBits(16, &version) || |
| 305 !reader.ReadBits(16, &version) || | 300 !reader.ReadBits(8, &flags) || !ParseSyncSafeInt(&reader, &id3_size)) { |
| 306 !reader.ReadBits(8, &flags) || | |
| 307 !ParseSyncSafeInt(&reader, &id3_size)) { | |
| 308 return -1; | 301 return -1; |
| 309 } | 302 } |
| 310 | 303 |
| 311 int32_t actual_tag_size = 10 + id3_size; | 304 int32_t actual_tag_size = 10 + id3_size; |
| 312 | 305 |
| 313 // Increment size if 'Footer present' flag is set. | 306 // Increment size if 'Footer present' flag is set. |
| 314 if (flags & 0x10) | 307 if (flags & 0x10) |
| 315 actual_tag_size += 10; | 308 actual_tag_size += 10; |
| 316 | 309 |
| 317 // Make sure we have the entire tag. | 310 // Make sure we have the entire tag. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 if (!candidate_start_code) | 349 if (!candidate_start_code) |
| 357 return 0; | 350 return 0; |
| 358 | 351 |
| 359 bool parse_header_failed = false; | 352 bool parse_header_failed = false; |
| 360 const uint8_t* sync = candidate_start_code; | 353 const uint8_t* sync = candidate_start_code; |
| 361 // Try to find 3 valid frames in a row. 3 was selected to decrease | 354 // Try to find 3 valid frames in a row. 3 was selected to decrease |
| 362 // the probability of false positives. | 355 // the probability of false positives. |
| 363 for (int i = 0; i < 3; ++i) { | 356 for (int i = 0; i < 3; ++i) { |
| 364 int sync_size = end - sync; | 357 int sync_size = end - sync; |
| 365 int frame_size; | 358 int frame_size; |
| 366 int sync_bytes = ParseFrameHeader( | 359 int sync_bytes = ParseFrameHeader(sync, sync_size, &frame_size, nullptr, |
| 367 sync, sync_size, &frame_size, NULL, NULL, NULL, NULL); | 360 nullptr, nullptr, nullptr, nullptr); |
| 368 | 361 |
| 369 if (sync_bytes == 0) | 362 if (sync_bytes == 0) |
| 370 return 0; | 363 return 0; |
| 371 | 364 |
| 372 if (sync_bytes > 0) { | 365 if (sync_bytes > 0) { |
| 373 DCHECK_LT(sync_bytes, sync_size); | 366 DCHECK_LT(sync_bytes, sync_size); |
| 374 | 367 |
| 375 // Skip over this frame so we can check the next one. | 368 // Skip over this frame so we can check the next one. |
| 376 sync += frame_size; | 369 sync += frame_size; |
| 377 | 370 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 if (end_of_segment) { | 410 if (end_of_segment) { |
| 418 in_media_segment_ = false; | 411 in_media_segment_ = false; |
| 419 end_of_segment_cb_.Run(); | 412 end_of_segment_cb_.Run(); |
| 420 } | 413 } |
| 421 | 414 |
| 422 timestamp_helper_->SetBaseTimestamp(base::TimeDelta()); | 415 timestamp_helper_->SetBaseTimestamp(base::TimeDelta()); |
| 423 return true; | 416 return true; |
| 424 } | 417 } |
| 425 | 418 |
| 426 } // namespace media | 419 } // namespace media |
| OLD | NEW |