Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Side by Side Diff: media/formats/webm/webm_stream_parser.cc

Issue 231283005: Add live mode detection in WebM MediaSource parser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/formats/webm/webm_stream_parser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « media/formats/webm/webm_stream_parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698