| 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/webm/webm_stream_parser.h" | 5 #include "media/formats/webm/webm_stream_parser.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "media/formats/webm/webm_cluster_parser.h" | 12 #include "media/formats/webm/webm_cluster_parser.h" |
| 13 #include "media/formats/webm/webm_constants.h" | 13 #include "media/formats/webm/webm_constants.h" |
| 14 #include "media/formats/webm/webm_content_encodings.h" | 14 #include "media/formats/webm/webm_content_encodings.h" |
| 15 #include "media/formats/webm/webm_crypto_helpers.h" | 15 #include "media/formats/webm/webm_crypto_helpers.h" |
| 16 #include "media/formats/webm/webm_info_parser.h" | 16 #include "media/formats/webm/webm_info_parser.h" |
| 17 #include "media/formats/webm/webm_tracks_parser.h" | 17 #include "media/formats/webm/webm_tracks_parser.h" |
| 18 | 18 |
| 19 namespace media { | 19 namespace media { |
| 20 | 20 |
| 21 WebMStreamParser::WebMStreamParser() | 21 WebMStreamParser::WebMStreamParser() |
| 22 : state_(kWaitingForInit), | 22 : state_(kWaitingForInit), |
| 23 unknown_segment_size_(false), |
| 23 parsing_cluster_(false) { | 24 parsing_cluster_(false) { |
| 24 } | 25 } |
| 25 | 26 |
| 26 WebMStreamParser::~WebMStreamParser() { | 27 WebMStreamParser::~WebMStreamParser() { |
| 27 } | 28 } |
| 28 | 29 |
| 29 void WebMStreamParser::Init(const InitCB& init_cb, | 30 void WebMStreamParser::Init(const InitCB& init_cb, |
| 30 const NewConfigCB& config_cb, | 31 const NewConfigCB& config_cb, |
| 31 const NewBuffersCB& new_buffers_cb, | 32 const NewBuffersCB& new_buffers_cb, |
| 32 bool ignore_text_tracks, | 33 bool ignore_text_tracks, |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 case kWebMIdCues: | 144 case kWebMIdCues: |
| 144 case kWebMIdChapters: | 145 case kWebMIdChapters: |
| 145 if (cur_size < (result + element_size)) { | 146 if (cur_size < (result + element_size)) { |
| 146 // We don't have the whole element yet. Signal we need more data. | 147 // We don't have the whole element yet. Signal we need more data. |
| 147 return 0; | 148 return 0; |
| 148 } | 149 } |
| 149 // Skip the element. | 150 // Skip the element. |
| 150 return result + element_size; | 151 return result + element_size; |
| 151 break; | 152 break; |
| 152 case kWebMIdSegment: | 153 case kWebMIdSegment: |
| 154 // Segment of unknown size indicates live stream. |
| 155 if (element_size == kWebMUnknownSize) |
| 156 unknown_segment_size_ = true; |
| 153 // Just consume the segment header. | 157 // Just consume the segment header. |
| 154 return result; | 158 return result; |
| 155 break; | 159 break; |
| 156 case kWebMIdInfo: | 160 case kWebMIdInfo: |
| 157 // We've found the element we are looking for. | 161 // We've found the element we are looking for. |
| 158 break; | 162 break; |
| 159 default: { | 163 default: { |
| 160 MEDIA_LOG(log_cb_) << "Unexpected element ID 0x" << std::hex << id; | 164 MEDIA_LOG(log_cb_) << "Unexpected element ID 0x" << std::hex << id; |
| 161 return -1; | 165 return -1; |
| 162 } | 166 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 183 double timecode_scale_in_us = info_parser.timecode_scale() / 1000.0; | 187 double timecode_scale_in_us = info_parser.timecode_scale() / 1000.0; |
| 184 InitParameters params(kInfiniteDuration()); | 188 InitParameters params(kInfiniteDuration()); |
| 185 | 189 |
| 186 if (info_parser.duration() > 0) { | 190 if (info_parser.duration() > 0) { |
| 187 int64 duration_in_us = info_parser.duration() * timecode_scale_in_us; | 191 int64 duration_in_us = info_parser.duration() * timecode_scale_in_us; |
| 188 params.duration = base::TimeDelta::FromMicroseconds(duration_in_us); | 192 params.duration = base::TimeDelta::FromMicroseconds(duration_in_us); |
| 189 } | 193 } |
| 190 | 194 |
| 191 params.timeline_offset = info_parser.date_utc(); | 195 params.timeline_offset = info_parser.date_utc(); |
| 192 | 196 |
| 197 if (unknown_segment_size_ && (info_parser.duration() <= 0) && |
| 198 !info_parser.date_utc().is_null()) { |
| 199 params.liveness = Demuxer::LIVENESS_LIVE; |
| 200 } else if (info_parser.duration() >= 0) { |
| 201 params.liveness = Demuxer::LIVENESS_RECORDED; |
| 202 } else { |
| 203 params.liveness = Demuxer::LIVENESS_UNKNOWN; |
| 204 } |
| 205 |
| 193 const AudioDecoderConfig& audio_config = tracks_parser.audio_decoder_config(); | 206 const AudioDecoderConfig& audio_config = tracks_parser.audio_decoder_config(); |
| 194 if (audio_config.is_encrypted()) | 207 if (audio_config.is_encrypted()) |
| 195 FireNeedKey(tracks_parser.audio_encryption_key_id()); | 208 FireNeedKey(tracks_parser.audio_encryption_key_id()); |
| 196 | 209 |
| 197 const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config(); | 210 const VideoDecoderConfig& video_config = tracks_parser.video_decoder_config(); |
| 198 if (video_config.is_encrypted()) | 211 if (video_config.is_encrypted()) |
| 199 FireNeedKey(tracks_parser.video_encryption_key_id()); | 212 FireNeedKey(tracks_parser.video_encryption_key_id()); |
| 200 | 213 |
| 201 if (!config_cb_.Run(audio_config, | 214 if (!config_cb_.Run(audio_config, |
| 202 video_config, | 215 video_config, |
| 203 tracks_parser.text_tracks())) { | 216 tracks_parser.text_tracks())) { |
| 204 DVLOG(1) << "New config data isn't allowed."; | 217 DVLOG(1) << "New config data isn't allowed."; |
| 205 return -1; | 218 return -1; |
| 206 } | 219 } |
| 207 | 220 |
| 208 | |
| 209 cluster_parser_.reset(new WebMClusterParser( | 221 cluster_parser_.reset(new WebMClusterParser( |
| 210 info_parser.timecode_scale(), | 222 info_parser.timecode_scale(), |
| 211 tracks_parser.audio_track_num(), | 223 tracks_parser.audio_track_num(), |
| 212 tracks_parser.GetAudioDefaultDuration(timecode_scale_in_us), | 224 tracks_parser.GetAudioDefaultDuration(timecode_scale_in_us), |
| 213 tracks_parser.video_track_num(), | 225 tracks_parser.video_track_num(), |
| 214 tracks_parser.GetVideoDefaultDuration(timecode_scale_in_us), | 226 tracks_parser.GetVideoDefaultDuration(timecode_scale_in_us), |
| 215 tracks_parser.text_tracks(), | 227 tracks_parser.text_tracks(), |
| 216 tracks_parser.ignored_tracks(), | 228 tracks_parser.ignored_tracks(), |
| 217 tracks_parser.audio_encryption_key_id(), | 229 tracks_parser.audio_encryption_key_id(), |
| 218 tracks_parser.video_encryption_key_id(), | 230 tracks_parser.video_encryption_key_id(), |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 | 298 |
| 287 return bytes_parsed; | 299 return bytes_parsed; |
| 288 } | 300 } |
| 289 | 301 |
| 290 void WebMStreamParser::FireNeedKey(const std::string& key_id) { | 302 void WebMStreamParser::FireNeedKey(const std::string& key_id) { |
| 291 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); | 303 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); |
| 292 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); | 304 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); |
| 293 } | 305 } |
| 294 | 306 |
| 295 } // namespace media | 307 } // namespace media |
| OLD | NEW |