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 static const int64 kUnknownElementSize = 0xffffffffffffff; | |
acolwell GONE FROM CHROMIUM
2014/04/23 16:06:02
nit: Please remove and use the kWebMUnknownSize co
| |
22 | |
21 WebMStreamParser::WebMStreamParser() | 23 WebMStreamParser::WebMStreamParser() |
22 : state_(kWaitingForInit), | 24 : state_(kWaitingForInit), |
25 unknown_segment_size_(false), | |
23 parsing_cluster_(false) { | 26 parsing_cluster_(false) { |
24 } | 27 } |
25 | 28 |
26 WebMStreamParser::~WebMStreamParser() { | 29 WebMStreamParser::~WebMStreamParser() { |
27 } | 30 } |
28 | 31 |
29 void WebMStreamParser::Init(const InitCB& init_cb, | 32 void WebMStreamParser::Init(const InitCB& init_cb, |
30 const NewConfigCB& config_cb, | 33 const NewConfigCB& config_cb, |
31 const NewBuffersCB& new_buffers_cb, | 34 const NewBuffersCB& new_buffers_cb, |
32 bool ignore_text_tracks, | 35 bool ignore_text_tracks, |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
143 case kWebMIdCues: | 146 case kWebMIdCues: |
144 case kWebMIdChapters: | 147 case kWebMIdChapters: |
145 if (cur_size < (result + element_size)) { | 148 if (cur_size < (result + element_size)) { |
146 // We don't have the whole element yet. Signal we need more data. | 149 // We don't have the whole element yet. Signal we need more data. |
147 return 0; | 150 return 0; |
148 } | 151 } |
149 // Skip the element. | 152 // Skip the element. |
150 return result + element_size; | 153 return result + element_size; |
151 break; | 154 break; |
152 case kWebMIdSegment: | 155 case kWebMIdSegment: |
156 // Segment of unknown size indicates live stream. | |
157 if (element_size == kUnknownElementSize) | |
158 unknown_segment_size_ = true; | |
153 // Just consume the segment header. | 159 // Just consume the segment header. |
154 return result; | 160 return result; |
155 break; | 161 break; |
156 case kWebMIdInfo: | 162 case kWebMIdInfo: |
157 // We've found the element we are looking for. | 163 // We've found the element we are looking for. |
158 break; | 164 break; |
159 default: { | 165 default: { |
160 MEDIA_LOG(log_cb_) << "Unexpected element ID 0x" << std::hex << id; | 166 MEDIA_LOG(log_cb_) << "Unexpected element ID 0x" << std::hex << id; |
161 return -1; | 167 return -1; |
162 } | 168 } |
163 } | 169 } |
164 | 170 |
165 WebMInfoParser info_parser; | 171 WebMInfoParser info_parser; |
166 result = info_parser.Parse(cur, cur_size); | 172 result = info_parser.Parse(cur, cur_size); |
167 | 173 |
168 if (result <= 0) | 174 if (result <= 0) |
169 return result; | 175 return result; |
170 | 176 |
171 cur += result; | 177 cur += result; |
172 cur_size -= result; | 178 cur_size -= result; |
173 bytes_parsed += result; | 179 bytes_parsed += result; |
174 | 180 |
175 WebMTracksParser tracks_parser(log_cb_, ignore_text_tracks_); | 181 bool live_mode = unknown_segment_size_ && (info_parser.duration() <= 0) && |
182 !info_parser.date_utc().is_null(); | |
183 | |
184 WebMTracksParser tracks_parser( | |
185 log_cb_, ignore_text_tracks_, live_mode); | |
176 result = tracks_parser.Parse(cur, cur_size); | 186 result = tracks_parser.Parse(cur, cur_size); |
177 | 187 |
178 if (result <= 0) | 188 if (result <= 0) |
179 return result; | 189 return result; |
180 | 190 |
181 bytes_parsed += result; | 191 bytes_parsed += result; |
182 | 192 |
183 double timecode_scale_in_us = info_parser.timecode_scale() / 1000.0; | 193 double timecode_scale_in_us = info_parser.timecode_scale() / 1000.0; |
184 base::TimeDelta duration = kInfiniteDuration(); | 194 base::TimeDelta duration = kInfiniteDuration(); |
185 | 195 |
(...skipping 10 matching lines...) Expand all Loading... | |
196 if (video_config.is_encrypted()) | 206 if (video_config.is_encrypted()) |
197 FireNeedKey(tracks_parser.video_encryption_key_id()); | 207 FireNeedKey(tracks_parser.video_encryption_key_id()); |
198 | 208 |
199 if (!config_cb_.Run(audio_config, | 209 if (!config_cb_.Run(audio_config, |
200 video_config, | 210 video_config, |
201 tracks_parser.text_tracks())) { | 211 tracks_parser.text_tracks())) { |
202 DVLOG(1) << "New config data isn't allowed."; | 212 DVLOG(1) << "New config data isn't allowed."; |
203 return -1; | 213 return -1; |
204 } | 214 } |
205 | 215 |
206 | |
207 cluster_parser_.reset(new WebMClusterParser( | 216 cluster_parser_.reset(new WebMClusterParser( |
208 info_parser.timecode_scale(), | 217 info_parser.timecode_scale(), |
209 tracks_parser.audio_track_num(), | 218 tracks_parser.audio_track_num(), |
210 tracks_parser.GetAudioDefaultDuration(timecode_scale_in_us), | 219 tracks_parser.GetAudioDefaultDuration(timecode_scale_in_us), |
211 tracks_parser.video_track_num(), | 220 tracks_parser.video_track_num(), |
212 tracks_parser.GetVideoDefaultDuration(timecode_scale_in_us), | 221 tracks_parser.GetVideoDefaultDuration(timecode_scale_in_us), |
213 tracks_parser.text_tracks(), | 222 tracks_parser.text_tracks(), |
214 tracks_parser.ignored_tracks(), | 223 tracks_parser.ignored_tracks(), |
215 tracks_parser.audio_encryption_key_id(), | 224 tracks_parser.audio_encryption_key_id(), |
216 tracks_parser.video_encryption_key_id(), | 225 tracks_parser.video_encryption_key_id(), |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
285 | 294 |
286 return bytes_parsed; | 295 return bytes_parsed; |
287 } | 296 } |
288 | 297 |
289 void WebMStreamParser::FireNeedKey(const std::string& key_id) { | 298 void WebMStreamParser::FireNeedKey(const std::string& key_id) { |
290 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); | 299 std::vector<uint8> key_id_vector(key_id.begin(), key_id.end()); |
291 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); | 300 need_key_cb_.Run(kWebMEncryptInitDataType, key_id_vector); |
292 } | 301 } |
293 | 302 |
294 } // namespace media | 303 } // namespace media |
OLD | NEW |