| 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/mp4/mp4_stream_parser.h" | 5 #include "media/formats/mp4/mp4_stream_parser.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 |
| 8 #include <limits> | 9 #include <limits> |
| 10 #include <memory> |
| 9 #include <utility> | 11 #include <utility> |
| 10 #include <vector> | 12 #include <vector> |
| 11 | 13 |
| 12 #include "base/callback_helpers.h" | 14 #include "base/callback_helpers.h" |
| 13 #include "base/logging.h" | 15 #include "base/logging.h" |
| 14 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 15 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 16 #include "build/build_config.h" | 18 #include "build/build_config.h" |
| 17 #include "media/base/audio_decoder_config.h" | 19 #include "media/base/audio_decoder_config.h" |
| 18 #include "media/base/media_tracks.h" | 20 #include "media/base/media_tracks.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 | 147 |
| 146 return true; | 148 return true; |
| 147 } | 149 } |
| 148 | 150 |
| 149 bool MP4StreamParser::ParseBox(bool* err) { | 151 bool MP4StreamParser::ParseBox(bool* err) { |
| 150 const uint8_t* buf; | 152 const uint8_t* buf; |
| 151 int size; | 153 int size; |
| 152 queue_.Peek(&buf, &size); | 154 queue_.Peek(&buf, &size); |
| 153 if (!size) return false; | 155 if (!size) return false; |
| 154 | 156 |
| 155 scoped_ptr<BoxReader> reader( | 157 std::unique_ptr<BoxReader> reader( |
| 156 BoxReader::ReadTopLevelBox(buf, size, media_log_, err)); | 158 BoxReader::ReadTopLevelBox(buf, size, media_log_, err)); |
| 157 if (reader.get() == NULL) return false; | 159 if (reader.get() == NULL) return false; |
| 158 | 160 |
| 159 if (reader->type() == FOURCC_MOOV) { | 161 if (reader->type() == FOURCC_MOOV) { |
| 160 *err = !ParseMoov(reader.get()); | 162 *err = !ParseMoov(reader.get()); |
| 161 } else if (reader->type() == FOURCC_MOOF) { | 163 } else if (reader->type() == FOURCC_MOOF) { |
| 162 moof_head_ = queue_.head(); | 164 moof_head_ = queue_.head(); |
| 163 *err = !ParseMoof(reader.get()); | 165 *err = !ParseMoof(reader.get()); |
| 164 | 166 |
| 165 // Set up first mdat offset for ReadMDATsUntil(). | 167 // Set up first mdat offset for ReadMDATsUntil(). |
| (...skipping 16 matching lines...) Expand all Loading... |
| 182 } | 184 } |
| 183 | 185 |
| 184 bool MP4StreamParser::ParseMoov(BoxReader* reader) { | 186 bool MP4StreamParser::ParseMoov(BoxReader* reader) { |
| 185 moov_.reset(new Movie); | 187 moov_.reset(new Movie); |
| 186 RCHECK(moov_->Parse(reader)); | 188 RCHECK(moov_->Parse(reader)); |
| 187 runs_.reset(); | 189 runs_.reset(); |
| 188 | 190 |
| 189 has_audio_ = false; | 191 has_audio_ = false; |
| 190 has_video_ = false; | 192 has_video_ = false; |
| 191 | 193 |
| 192 scoped_ptr<MediaTracks> media_tracks(new MediaTracks()); | 194 std::unique_ptr<MediaTracks> media_tracks(new MediaTracks()); |
| 193 AudioDecoderConfig audio_config; | 195 AudioDecoderConfig audio_config; |
| 194 VideoDecoderConfig video_config; | 196 VideoDecoderConfig video_config; |
| 195 int detected_audio_track_count = 0; | 197 int detected_audio_track_count = 0; |
| 196 int detected_video_track_count = 0; | 198 int detected_video_track_count = 0; |
| 197 int detected_text_track_count = 0; | 199 int detected_text_track_count = 0; |
| 198 | 200 |
| 199 for (std::vector<Track>::const_iterator track = moov_->tracks.begin(); | 201 for (std::vector<Track>::const_iterator track = moov_->tracks.begin(); |
| 200 track != moov_->tracks.end(); ++track) { | 202 track != moov_->tracks.end(); ++track) { |
| 201 // TODO(strobe): Only the first audio and video track present in a file are | 203 // TODO(strobe): Only the first audio and video track present in a file are |
| 202 // used. (Track selection is better accomplished via Source IDs, though, so | 204 // used. (Track selection is better accomplished via Source IDs, though, so |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 if (runs_->AuxInfoNeedsToBeCached()) { | 529 if (runs_->AuxInfoNeedsToBeCached()) { |
| 528 queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size); | 530 queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size); |
| 529 if (buf_size < runs_->aux_info_size()) return false; | 531 if (buf_size < runs_->aux_info_size()) return false; |
| 530 *err = !runs_->CacheAuxInfo(buf, buf_size); | 532 *err = !runs_->CacheAuxInfo(buf, buf_size); |
| 531 return !*err; | 533 return !*err; |
| 532 } | 534 } |
| 533 | 535 |
| 534 queue_.PeekAt(runs_->sample_offset() + moof_head_, &buf, &buf_size); | 536 queue_.PeekAt(runs_->sample_offset() + moof_head_, &buf, &buf_size); |
| 535 if (buf_size < runs_->sample_size()) return false; | 537 if (buf_size < runs_->sample_size()) return false; |
| 536 | 538 |
| 537 scoped_ptr<DecryptConfig> decrypt_config; | 539 std::unique_ptr<DecryptConfig> decrypt_config; |
| 538 std::vector<SubsampleEntry> subsamples; | 540 std::vector<SubsampleEntry> subsamples; |
| 539 if (runs_->is_encrypted()) { | 541 if (runs_->is_encrypted()) { |
| 540 decrypt_config = runs_->GetDecryptConfig(); | 542 decrypt_config = runs_->GetDecryptConfig(); |
| 541 if (!decrypt_config) { | 543 if (!decrypt_config) { |
| 542 *err = true; | 544 *err = true; |
| 543 return false; | 545 return false; |
| 544 } | 546 } |
| 545 subsamples = decrypt_config->subsamples(); | 547 subsamples = decrypt_config->subsamples(); |
| 546 } | 548 } |
| 547 | 549 |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 693 runs.AdvanceSample(); | 695 runs.AdvanceSample(); |
| 694 } | 696 } |
| 695 runs.AdvanceRun(); | 697 runs.AdvanceRun(); |
| 696 } | 698 } |
| 697 | 699 |
| 698 return true; | 700 return true; |
| 699 } | 701 } |
| 700 | 702 |
| 701 } // namespace mp4 | 703 } // namespace mp4 |
| 702 } // namespace media | 704 } // namespace media |
| OLD | NEW |