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

Side by Side Diff: third_party/WebKit/Source/modules/mediasource/MediaSource.cpp

Issue 2105593002: MSE: Experimental support for customizing live seekable range (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 19 matching lines...) Expand all
30 30
31 #include "modules/mediasource/MediaSource.h" 31 #include "modules/mediasource/MediaSource.h"
32 32
33 #include "bindings/core/v8/ExceptionMessages.h" 33 #include "bindings/core/v8/ExceptionMessages.h"
34 #include "bindings/core/v8/ExceptionState.h" 34 #include "bindings/core/v8/ExceptionState.h"
35 #include "bindings/core/v8/ExceptionStatePlaceholder.h" 35 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
36 #include "core/dom/ExceptionCode.h" 36 #include "core/dom/ExceptionCode.h"
37 #include "core/events/Event.h" 37 #include "core/events/Event.h"
38 #include "core/events/GenericEventQueue.h" 38 #include "core/events/GenericEventQueue.h"
39 #include "core/html/HTMLMediaElement.h" 39 #include "core/html/HTMLMediaElement.h"
40 #include "core/html/TimeRanges.h"
41 #include "modules/mediasource/MediaSourceRegistry.h" 40 #include "modules/mediasource/MediaSourceRegistry.h"
42 #include "platform/ContentType.h" 41 #include "platform/ContentType.h"
43 #include "platform/Logging.h" 42 #include "platform/Logging.h"
44 #include "platform/MIMETypeRegistry.h" 43 #include "platform/MIMETypeRegistry.h"
45 #include "platform/RuntimeEnabledFeatures.h" 44 #include "platform/RuntimeEnabledFeatures.h"
46 #include "platform/TraceEvent.h" 45 #include "platform/TraceEvent.h"
47 #include "public/platform/WebMediaSource.h" 46 #include "public/platform/WebMediaSource.h"
48 #include "public/platform/WebSourceBuffer.h" 47 #include "public/platform/WebSourceBuffer.h"
49 #include "wtf/PtrUtil.h" 48 #include "wtf/PtrUtil.h"
50 #include "wtf/text/CString.h" 49 #include "wtf/text/CString.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 } 96 }
98 97
99 MediaSource::MediaSource(ExecutionContext* context) 98 MediaSource::MediaSource(ExecutionContext* context)
100 : ActiveScriptWrappable(this) 99 : ActiveScriptWrappable(this)
101 , ActiveDOMObject(context) 100 , ActiveDOMObject(context)
102 , m_readyState(closedKeyword()) 101 , m_readyState(closedKeyword())
103 , m_asyncEventQueue(GenericEventQueue::create(this)) 102 , m_asyncEventQueue(GenericEventQueue::create(this))
104 , m_attachedElement(nullptr) 103 , m_attachedElement(nullptr)
105 , m_sourceBuffers(SourceBufferList::create(getExecutionContext(), m_asyncEve ntQueue.get())) 104 , m_sourceBuffers(SourceBufferList::create(getExecutionContext(), m_asyncEve ntQueue.get()))
106 , m_activeSourceBuffers(SourceBufferList::create(getExecutionContext(), m_as yncEventQueue.get())) 105 , m_activeSourceBuffers(SourceBufferList::create(getExecutionContext(), m_as yncEventQueue.get()))
106 , m_liveSeekableRange(TimeRanges::create())
107 , m_isAddedToRegistry(false) 107 , m_isAddedToRegistry(false)
108 { 108 {
109 MSLOG << __FUNCTION__ << " this=" << this; 109 MSLOG << __FUNCTION__ << " this=" << this;
110 } 110 }
111 111
112 MediaSource::~MediaSource() 112 MediaSource::~MediaSource()
113 { 113 {
114 MSLOG << __FUNCTION__ << " this=" << this; 114 MSLOG << __FUNCTION__ << " this=" << this;
115 DCHECK(isClosed()); 115 DCHECK(isClosed());
116 } 116 }
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 { 276 {
277 return ActiveDOMObject::getExecutionContext(); 277 return ActiveDOMObject::getExecutionContext();
278 } 278 }
279 279
280 DEFINE_TRACE(MediaSource) 280 DEFINE_TRACE(MediaSource)
281 { 281 {
282 visitor->trace(m_asyncEventQueue); 282 visitor->trace(m_asyncEventQueue);
283 visitor->trace(m_attachedElement); 283 visitor->trace(m_attachedElement);
284 visitor->trace(m_sourceBuffers); 284 visitor->trace(m_sourceBuffers);
285 visitor->trace(m_activeSourceBuffers); 285 visitor->trace(m_activeSourceBuffers);
286 visitor->trace(m_liveSeekableRange);
286 EventTargetWithInlineData::trace(visitor); 287 EventTargetWithInlineData::trace(visitor);
287 ActiveDOMObject::trace(visitor); 288 ActiveDOMObject::trace(visitor);
288 } 289 }
289 290
290 void MediaSource::setWebMediaSourceAndOpen(std::unique_ptr<WebMediaSource> webMe diaSource) 291 void MediaSource::setWebMediaSourceAndOpen(std::unique_ptr<WebMediaSource> webMe diaSource)
291 { 292 {
292 TRACE_EVENT_ASYNC_END0("media", "MediaSource::attachToElement", this); 293 TRACE_EVENT_ASYNC_END0("media", "MediaSource::attachToElement", this);
293 DCHECK(webMediaSource); 294 DCHECK(webMediaSource);
294 DCHECK(!m_webMediaSource); 295 DCHECK(!m_webMediaSource);
295 DCHECK(m_attachedElement); 296 DCHECK(m_attachedElement);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 // 5.4 Replace the ranges in intersection ranges with the new intersecti on ranges. 357 // 5.4 Replace the ranges in intersection ranges with the new intersecti on ranges.
357 intersectionRanges->intersectWith(sourceRanges); 358 intersectionRanges->intersectWith(sourceRanges);
358 } 359 }
359 360
360 return intersectionRanges; 361 return intersectionRanges;
361 } 362 }
362 363
363 TimeRanges* MediaSource::seekable() const 364 TimeRanges* MediaSource::seekable() const
364 { 365 {
365 // Implements MediaSource algorithm for HTMLMediaElement.seekable. 366 // Implements MediaSource algorithm for HTMLMediaElement.seekable.
366 // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-sou rce.html#htmlmediaelement-extensions 367 // http://w3c.github.io/media-source/#htmlmediaelement-extensions
367 368
368 double sourceDuration = duration(); 369 double sourceDuration = duration();
369 // If duration equals NaN: Return an empty TimeRanges object. 370 // If duration equals NaN: Return an empty TimeRanges object.
370 if (std::isnan(sourceDuration)) 371 if (std::isnan(sourceDuration))
371 return TimeRanges::create(); 372 return TimeRanges::create();
372 373
373 // If duration equals positive Infinity: 374 // If duration equals positive Infinity:
374 if (sourceDuration == std::numeric_limits<double>::infinity()) { 375 if (sourceDuration == std::numeric_limits<double>::infinity()) {
375 TimeRanges* buffered = m_attachedElement->buffered(); 376 TimeRanges* buffered = m_attachedElement->buffered();
376 377
377 // 1. If the HTMLMediaElement.buffered attribute returns an empty TimeRa nges object, then 378 // 1. If live seekable range is not empty:
378 // return an empty TimeRanges object and abort these steps. 379 if (m_liveSeekableRange->length() != 0) {
380 // 1.1. Let union ranges be the union of live seekable range and the
381 // HTMLMediaElement.buffered attribute.
382 // 1.2. Return a single range with a start time equal to the
383 // earliest start time in union ranges and an end time equal to
384 // the highest end time in union ranges and abort these steps.
385 if (buffered->length() == 0) {
386 return TimeRanges::create(m_liveSeekableRange->start(0, ASSERT_N O_EXCEPTION), m_liveSeekableRange->end(0, ASSERT_NO_EXCEPTION));
387 }
388
389 return TimeRanges::create(std::min(m_liveSeekableRange->start(0, ASS ERT_NO_EXCEPTION), buffered->start(0, ASSERT_NO_EXCEPTION)),
390 std::max(m_liveSeekableRange->end(0, ASSERT_NO_EXCEPTION), buffe red->end(buffered->length() - 1, ASSERT_NO_EXCEPTION)));
391 }
392 // 2. If the HTMLMediaElement.buffered attribute returns an empty TimeRa nges object, then
393 // return an empty TimeRanges object and abort these steps.
379 if (buffered->length() == 0) 394 if (buffered->length() == 0)
380 return TimeRanges::create(); 395 return TimeRanges::create();
381 396
382 // 2. Return a single range with a start time of 0 and an end time equal to the highest end 397 // 3. Return a single range with a start time of 0 and an end time equal to the highest end
383 // time reported by the HTMLMediaElement.buffered attribute. 398 // time reported by the HTMLMediaElement.buffered attribute.
384 return TimeRanges::create(0, buffered->end(buffered->length() - 1, ASSER T_NO_EXCEPTION)); 399 return TimeRanges::create(0, buffered->end(buffered->length() - 1, ASSER T_NO_EXCEPTION));
385 } 400 }
386 401
387 // 3. Otherwise: Return a single range with a start time of 0 and an end tim e equal to duration. 402 // 3. Otherwise: Return a single range with a start time of 0 and an end tim e equal to duration.
388 return TimeRanges::create(0, sourceDuration); 403 return TimeRanges::create(0, sourceDuration);
389 } 404 }
390 405
391 void MediaSource::setDuration(double duration, ExceptionState& exceptionState) 406 void MediaSource::setDuration(double duration, ExceptionState& exceptionState)
392 { 407 {
393 // 2.1 http://www.w3.org/TR/media-source/#widl-MediaSource-duration 408 // 2.1 http://www.w3.org/TR/media-source/#widl-MediaSource-duration
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 } else { 490 } else {
476 NOTREACHED(); // IDL enforcement should prevent this case. 491 NOTREACHED(); // IDL enforcement should prevent this case.
477 } 492 }
478 } 493 }
479 494
480 void MediaSource::endOfStream(ExceptionState& exceptionState) 495 void MediaSource::endOfStream(ExceptionState& exceptionState)
481 { 496 {
482 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNoError, exceptionState ); 497 endOfStreamInternal(WebMediaSource::EndOfStreamStatusNoError, exceptionState );
483 } 498 }
484 499
500 void MediaSource::setLiveSeekableRange(double start, double end, ExceptionState& exceptionState)
501 {
502 // http://w3c.github.io/media-source/#widl-MediaSource-setLiveSeekableRange- void-double-start-double-end
503 // 1. If the readyState attribute is not "open" then throw an
504 // InvalidStateError exception and abort these steps.
505 // 2. If the updating attribute equals true on any SourceBuffer in
506 // SourceBuffers, then throw an InvalidStateError exception and abort
507 // these steps.
508 if (throwExceptionIfClosedOrUpdating(isOpen(), isUpdating(), exceptionState) )
509 return;
510
511 // 3. If start is negative or greater than end, then throw a TypeError
512 // exception and abort these steps.
513 if (start < 0 || start > end) {
514 exceptionState.throwTypeError(ExceptionMessages::indexOutsideRange("star t value", start, 0.0, ExceptionMessages::InclusiveBound, end, ExceptionMessages: :InclusiveBound));
515 return;
516 }
517
518 // 4. Set live seekable range to be a new normalized TimeRanges object
519 // containing a single range whose start position is start and end
520 // position is end.
521 m_liveSeekableRange = TimeRanges::create(start, end);
522 }
523
524 void MediaSource::clearLiveSeekableRange(ExceptionState& exceptionState)
525 {
526 // http://w3c.github.io/media-source/#widl-MediaSource-clearLiveSeekableRang e-void
527 // 1. If the readyState attribute is not "open" then throw an
528 // InvalidStateError exception and abort these steps.
529 // 2. If the updating attribute equals true on any SourceBuffer in
530 // SourceBuffers, then throw an InvalidStateError exception and abort
531 // these steps.
532 if (throwExceptionIfClosedOrUpdating(isOpen(), isUpdating(), exceptionState) )
533 return;
534
535 // 3. If live seekable range contains a range, then set live seekable range
536 // to be a new empty TimeRanges object.
537 if (m_liveSeekableRange->length() != 0)
538 m_liveSeekableRange = TimeRanges::create();
539 }
540
485 void MediaSource::endOfStreamInternal(const WebMediaSource::EndOfStreamStatus eo sStatus, ExceptionState& exceptionState) 541 void MediaSource::endOfStreamInternal(const WebMediaSource::EndOfStreamStatus eo sStatus, ExceptionState& exceptionState)
486 { 542 {
487 // 2.2 http://www.w3.org/TR/media-source/#widl-MediaSource-endOfStream-void- EndOfStreamError-error 543 // 2.2 http://www.w3.org/TR/media-source/#widl-MediaSource-endOfStream-void- EndOfStreamError-error
488 // 1. If the readyState attribute is not in the "open" state then throw an 544 // 1. If the readyState attribute is not in the "open" state then throw an
489 // InvalidStateError exception and abort these steps. 545 // InvalidStateError exception and abort these steps.
490 // 2. If the updating attribute equals true on any SourceBuffer in sourceBuf fers, then throw an 546 // 2. If the updating attribute equals true on any SourceBuffer in sourceBuf fers, then throw an
491 // InvalidStateError exception and abort these steps. 547 // InvalidStateError exception and abort these steps.
492 if (throwExceptionIfClosedOrUpdating(isOpen(), isUpdating(), exceptionState) ) 548 if (throwExceptionIfClosedOrUpdating(isOpen(), isUpdating(), exceptionState) )
493 return; 549 return;
494 550
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 672
617 m_asyncEventQueue->enqueueEvent(event); 673 m_asyncEventQueue->enqueueEvent(event);
618 } 674 }
619 675
620 URLRegistry& MediaSource::registry() const 676 URLRegistry& MediaSource::registry() const
621 { 677 {
622 return MediaSourceRegistry::registry(); 678 return MediaSourceRegistry::registry();
623 } 679 }
624 680
625 } // namespace blink 681 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698