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 |