From c2d132c582b1bf312e4361e65112e09439787aad Mon Sep 17 00:00:00 2001 From: "annacc@chromium.org" Date: Wed, 15 Aug 2012 16:58:02 +0000 Subject: [PATCH] Add the timestampOffset attribute to SourceBuffer. https://bugs.webkit.org/show_bug.cgi?id=93303 Reviewed by Dimitri Glazkov. On the 30 July 2012 version of the Media Source Extensions spec, a timestampOffset attribute was added to the SourceBuffer object: http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#dom-timestampoffset Source/WebCore: Tests: additions to http/tests/media/media-source/video-media-source-objects.html * Modules/mediasource/MediaSource.cpp: (WebCore::MediaSource::setTimestampOffset): Set the timestampOffset on MediaPlayer. (WebCore): * Modules/mediasource/MediaSource.h: (MediaSource): * Modules/mediasource/SourceBuffer.cpp: (WebCore::SourceBuffer::SourceBuffer): Let the timestampOffset be 0 initially (WebCore::SourceBuffer::timestampOffset): Return the last value set. (WebCore): (WebCore::SourceBuffer::setTimestampOffset): Forward the call onto MediaSouce. * Modules/mediasource/SourceBuffer.h: (SourceBuffer): * Modules/mediasource/SourceBuffer.idl: Create the new timestampOffset attr. * platform/graphics/MediaPlayer.cpp: (WebCore::NullMediaPlayerPrivate::sourceSetTimestampOffset): A null media player should just return false (nothing to set). (WebCore): (WebCore::MediaPlayer::sourceSetTimestampOffset): Forward the call. * platform/graphics/MediaPlayer.h: * platform/graphics/MediaPlayerPrivate.h: (WebCore::MediaPlayerPrivateInterface::sourceSetTimestampOffset): Source/WebKit/chromium: * public/WebMediaPlayer.h: (WebKit::WebMediaPlayer::sourceSetTimestampOffset): Add the new method. * src/WebMediaPlayerClientImpl.cpp: (WebKit): (WebKit::WebMediaPlayerClientImpl::sourceSetTimestampOffset): Forward the call. * src/WebMediaPlayerClientImpl.h: (WebMediaPlayerClientImpl): LayoutTests: * http/tests/media/media-source/video-media-source-objects-expected.txt: * http/tests/media/media-source/video-media-source-objects.html: git-svn-id: http://svn.webkit.org/repository/webkit/trunk@125682 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 14 ++++++++ .../video-media-source-objects-expected.txt | 12 +++++++ .../video-media-source-objects.html | 23 ++++++++++++ Source/WebCore/ChangeLog | 35 +++++++++++++++++++ .../Modules/mediasource/MediaSource.cpp | 14 ++++++++ .../WebCore/Modules/mediasource/MediaSource.h | 1 + .../Modules/mediasource/SourceBuffer.cpp | 17 +++++++++ .../Modules/mediasource/SourceBuffer.h | 5 +++ .../Modules/mediasource/SourceBuffer.idl | 4 +++ .../WebCore/platform/graphics/MediaPlayer.cpp | 6 ++++ .../WebCore/platform/graphics/MediaPlayer.h | 1 + .../platform/graphics/MediaPlayerPrivate.h | 1 + Source/WebKit/chromium/ChangeLog | 19 ++++++++++ .../WebKit/chromium/public/WebMediaPlayer.h | 1 + .../chromium/src/WebMediaPlayerClientImpl.cpp | 7 ++++ .../chromium/src/WebMediaPlayerClientImpl.h | 1 + 16 files changed, 161 insertions(+) diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 584511a0e30..c5a6edddb02 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,17 @@ +2012-08-15 Anna Cavender + + Add the timestampOffset attribute to SourceBuffer. + https://bugs.webkit.org/show_bug.cgi?id=93303 + + Reviewed by Dimitri Glazkov. + + On the 30 July 2012 version of the Media Source Extensions spec, a timestampOffset + attribute was added to the SourceBuffer object: + http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#dom-timestampoffset + + * http/tests/media/media-source/video-media-source-objects-expected.txt: + * http/tests/media/media-source/video-media-source-objects.html: + 2012-08-15 Pavel Chadnov Web Inspector: Incorrect XHR responses when two async xhrs are sent synchronously diff --git a/LayoutTests/http/tests/media/media-source/video-media-source-objects-expected.txt b/LayoutTests/http/tests/media/media-source/video-media-source-objects-expected.txt index f308e2628e0..809396714e4 100644 --- a/LayoutTests/http/tests/media/media-source/video-media-source-objects-expected.txt +++ b/LayoutTests/http/tests/media/media-source/video-media-source-objects-expected.txt @@ -26,6 +26,16 @@ EXPECTED (mediaSource.sourceBuffers[0].buffered.length == '1') OK EXPECTED (mediaSource.sourceBuffers[0].buffered.start(0) == '0') OK EXPECTED (mediaSource.sourceBuffers[0].buffered.end(0) > '1') OK +Set timestampOffset. +EXPECTED (segmentHelper.sourceBuffer.timestampOffset == '0') OK +RUN(segmentHelper.sourceBuffer.timestampOffset = 5) +EXPECTED (segmentHelper.sourceBuffer.timestampOffset == '5') OK + +Append 1 second of data. +EXPECTED (mediaSource.sourceBuffers[0].buffered.length == '2') OK +EXPECTED (mediaSource.sourceBuffers[0].buffered.start(1) == '5') OK +EXPECTED (mediaSource.sourceBuffers[0].buffered.end(1) > '1') OK + Remove SourceBuffer RUN(mediaSource.removeSourceBuffer(segmentHelper.sourceBuffer)) EXPECTED (mediaSource.sourceBuffers.length == '0') OK @@ -38,5 +48,7 @@ Got expected exception Error: INVALID_STATE_ERR: DOM Exception 11 EXPECTED (mediaSource.sourceBuffers.length == '0') OK Test that addSourceBuffer() throws and error when the MediaSource is not associated with a media element. Got expected exception Error: INVALID_STATE_ERR: DOM Exception 11 +Test that setting timestampOffset throws an error when the MediaSource is not associated with a media element. +Got expected exception Error: INVALID_STATE_ERR: DOM Exception 11 END OF TEST diff --git a/LayoutTests/http/tests/media/media-source/video-media-source-objects.html b/LayoutTests/http/tests/media/media-source/video-media-source-objects.html index 55ca78b952b..894b7d08f77 100644 --- a/LayoutTests/http/tests/media/media-source/video-media-source-objects.html +++ b/LayoutTests/http/tests/media/media-source/video-media-source-objects.html @@ -42,6 +42,22 @@ testExpected("mediaSource.sourceBuffers[0].buffered.start(0)", 0); testExpected("mediaSource.sourceBuffers[0].buffered.end(0)", 1, '>'); + consoleWrite(""); + consoleWrite("Set timestampOffset."); + testExpected("segmentHelper.sourceBuffer.timestampOffset", 0); + run("segmentHelper.sourceBuffer.timestampOffset = 5"); + testExpected("segmentHelper.sourceBuffer.timestampOffset", 5); + + // Append another 1 second of media data. + consoleWrite(""); + consoleWrite("Append 1 second of data."); + var endIndex = segmentHelper.getMediaSegmentIndexForTimestamp(1); + for (var i = 0; i <= endIndex; i++) + segmentHelper.appendMediaSegment(i); + testExpected("mediaSource.sourceBuffers[0].buffered.length", 2); + testExpected("mediaSource.sourceBuffers[0].buffered.start(1)", 5); + testExpected("mediaSource.sourceBuffers[0].buffered.end(1)", 1, '>'); + consoleWrite(""); consoleWrite("Remove SourceBuffer"); @@ -58,6 +74,13 @@ consoleWrite("Got expected exception " + e); } + consoleWrite("Test that setting timestampOffset throws an error when the MediaSource is not associated with a media element."); + try { + segmentHelper.sourceBuffer.timestampOffset = 10; + } catch (e) { + consoleWrite("Got expected exception " + e); + } + endTest(); } diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 36b84e7143a..65649c7863e 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,38 @@ +2012-08-15 Anna Cavender + + Add the timestampOffset attribute to SourceBuffer. + https://bugs.webkit.org/show_bug.cgi?id=93303 + + Reviewed by Dimitri Glazkov. + + On the 30 July 2012 version of the Media Source Extensions spec, a timestampOffset + attribute was added to the SourceBuffer object: + http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#dom-timestampoffset + + Tests: additions to http/tests/media/media-source/video-media-source-objects.html + + * Modules/mediasource/MediaSource.cpp: + (WebCore::MediaSource::setTimestampOffset): Set the timestampOffset on MediaPlayer. + (WebCore): + * Modules/mediasource/MediaSource.h: + (MediaSource): + * Modules/mediasource/SourceBuffer.cpp: + (WebCore::SourceBuffer::SourceBuffer): Let the timestampOffset be 0 initially + (WebCore::SourceBuffer::timestampOffset): Return the last value set. + (WebCore): + (WebCore::SourceBuffer::setTimestampOffset): Forward the call onto MediaSouce. + * Modules/mediasource/SourceBuffer.h: + (SourceBuffer): + * Modules/mediasource/SourceBuffer.idl: Create the new timestampOffset attr. + * platform/graphics/MediaPlayer.cpp: + (WebCore::NullMediaPlayerPrivate::sourceSetTimestampOffset): A null media player + should just return false (nothing to set). + (WebCore): + (WebCore::MediaPlayer::sourceSetTimestampOffset): Forward the call. + * platform/graphics/MediaPlayer.h: + * platform/graphics/MediaPlayerPrivate.h: + (WebCore::MediaPlayerPrivateInterface::sourceSetTimestampOffset): + 2012-08-15 Pavel Chadnov Web Inspector: Incorrect XHR responses when two async xhrs are sent synchronously diff --git a/Source/WebCore/Modules/mediasource/MediaSource.cpp b/Source/WebCore/Modules/mediasource/MediaSource.cpp index e1317f541e3..cc4f9d7d7b8 100644 --- a/Source/WebCore/Modules/mediasource/MediaSource.cpp +++ b/Source/WebCore/Modules/mediasource/MediaSource.cpp @@ -267,6 +267,20 @@ void MediaSource::abort(const String& id, ExceptionCode& ec) ASSERT_NOT_REACHED(); } +bool MediaSource::setTimestampOffset(const String& id, double offset, ExceptionCode& ec) +{ + if (!m_player || m_readyState != openKeyword()) { + ec = INVALID_STATE_ERR; + return false; + } + + if (!m_player->sourceSetTimestampOffset(id, offset)) { + ec = INVALID_STATE_ERR; + return false; + } + return true; +} + const AtomicString& MediaSource::interfaceName() const { return eventNames().interfaceForMediaSource; diff --git a/Source/WebCore/Modules/mediasource/MediaSource.h b/Source/WebCore/Modules/mediasource/MediaSource.h index 2c85fd011b6..b638333697f 100644 --- a/Source/WebCore/Modules/mediasource/MediaSource.h +++ b/Source/WebCore/Modules/mediasource/MediaSource.h @@ -80,6 +80,7 @@ public: PassRefPtr buffered(const String& id, ExceptionCode&) const; void append(const String& id, PassRefPtr data, ExceptionCode&); void abort(const String& id, ExceptionCode&); + bool setTimestampOffset(const String& id, double, ExceptionCode&); // EventTarget interface virtual const AtomicString& interfaceName() const OVERRIDE; diff --git a/Source/WebCore/Modules/mediasource/SourceBuffer.cpp b/Source/WebCore/Modules/mediasource/SourceBuffer.cpp index 59191080308..1d6e606a7ab 100644 --- a/Source/WebCore/Modules/mediasource/SourceBuffer.cpp +++ b/Source/WebCore/Modules/mediasource/SourceBuffer.cpp @@ -41,6 +41,7 @@ namespace WebCore { SourceBuffer::SourceBuffer(const String& id, PassRefPtr source) : m_id(id) , m_source(source) + , m_timestampOffset(0) { } @@ -58,6 +59,22 @@ PassRefPtr SourceBuffer::buffered(ExceptionCode& ec) const return m_source->buffered(id(), ec); } +double SourceBuffer::timestampOffset() const +{ + return m_timestampOffset; +} + +void SourceBuffer::setTimestampOffset(double offset, ExceptionCode& ec) +{ + if (!m_source) { + ec = INVALID_STATE_ERR; + return; + } + + if (m_source->setTimestampOffset(id(), offset, ec)) + m_timestampOffset = offset; +} + void SourceBuffer::append(PassRefPtr data, ExceptionCode& ec) { if (!m_source) { diff --git a/Source/WebCore/Modules/mediasource/SourceBuffer.h b/Source/WebCore/Modules/mediasource/SourceBuffer.h index d180dd4d7b0..7d1e5861c0f 100644 --- a/Source/WebCore/Modules/mediasource/SourceBuffer.h +++ b/Source/WebCore/Modules/mediasource/SourceBuffer.h @@ -54,6 +54,9 @@ public: PassRefPtr buffered(ExceptionCode&) const; + double timestampOffset() const; + void setTimestampOffset(double, ExceptionCode&); + void append(PassRefPtr data, ExceptionCode&); void abort(ExceptionCode&); @@ -67,6 +70,8 @@ private: String m_id; RefPtr m_source; + + double m_timestampOffset; }; } // namespace WebCore diff --git a/Source/WebCore/Modules/mediasource/SourceBuffer.idl b/Source/WebCore/Modules/mediasource/SourceBuffer.idl index 412b9cb618f..c7c6eb3abdc 100644 --- a/Source/WebCore/Modules/mediasource/SourceBuffer.idl +++ b/Source/WebCore/Modules/mediasource/SourceBuffer.idl @@ -39,6 +39,10 @@ module html { readonly attribute TimeRanges buffered getter raises(DOMException); + // Applies an offset to media segment timestamps. + attribute double timestampOffset + setter raises(DOMException); + // Append segment data. void append(in Uint8Array data) raises (DOMException); diff --git a/Source/WebCore/platform/graphics/MediaPlayer.cpp b/Source/WebCore/platform/graphics/MediaPlayer.cpp index 28c784c03ee..42e308bb5a9 100644 --- a/Source/WebCore/platform/graphics/MediaPlayer.cpp +++ b/Source/WebCore/platform/graphics/MediaPlayer.cpp @@ -155,6 +155,7 @@ public: virtual bool sourceAppend(const String&, const unsigned char*, unsigned) { return false; } virtual bool sourceAbort(const String&) { return false; } virtual void sourceEndOfStream(MediaPlayer::EndOfStreamStatus) { } + virtual bool sourceSetTimestampOffset(const String&, double) { return false; } #endif #if ENABLE(ENCRYPTED_MEDIA) @@ -492,6 +493,11 @@ void MediaPlayer::sourceEndOfStream(MediaPlayer::EndOfStreamStatus status) { return m_private->sourceEndOfStream(status); } + +bool MediaPlayer::sourceSetTimestampOffset(const String& id, double offset) +{ + return m_private->sourceSetTimestampOffset(id, offset); +} #endif #if ENABLE(ENCRYPTED_MEDIA) diff --git a/Source/WebCore/platform/graphics/MediaPlayer.h b/Source/WebCore/platform/graphics/MediaPlayer.h index c86827b8a0f..de692227c27 100644 --- a/Source/WebCore/platform/graphics/MediaPlayer.h +++ b/Source/WebCore/platform/graphics/MediaPlayer.h @@ -256,6 +256,7 @@ public: bool sourceAbort(const String& id); enum EndOfStreamStatus { EosNoError, EosNetworkError, EosDecodeError }; void sourceEndOfStream(EndOfStreamStatus); + bool sourceSetTimestampOffset(const String& id, double offset); #endif #if ENABLE(ENCRYPTED_MEDIA) diff --git a/Source/WebCore/platform/graphics/MediaPlayerPrivate.h b/Source/WebCore/platform/graphics/MediaPlayerPrivate.h index 58f1606d669..28d2d9e0794 100644 --- a/Source/WebCore/platform/graphics/MediaPlayerPrivate.h +++ b/Source/WebCore/platform/graphics/MediaPlayerPrivate.h @@ -174,6 +174,7 @@ public: virtual bool sourceAppend(const String& id, const unsigned char* data, unsigned length) { return false; } virtual bool sourceAbort(const String& id) { return false; } virtual void sourceEndOfStream(MediaPlayer::EndOfStreamStatus) { }; + virtual bool sourceSetTimestampOffset(const String& id, double offset) { return false; } #endif #if ENABLE(ENCRYPTED_MEDIA) diff --git a/Source/WebKit/chromium/ChangeLog b/Source/WebKit/chromium/ChangeLog index f440f7aa57c..a1b8eea7333 100644 --- a/Source/WebKit/chromium/ChangeLog +++ b/Source/WebKit/chromium/ChangeLog @@ -1,3 +1,22 @@ +2012-08-15 Anna Cavender + + Add the timestampOffset attribute to SourceBuffer. + https://bugs.webkit.org/show_bug.cgi?id=93303 + + Reviewed by Dimitri Glazkov. + + On the 30 July 2012 version of the Media Source Extensions spec, a timestampOffset + attribute was added to the SourceBuffer object: + http://dvcs.w3.org/hg/html-media/raw-file/tip/media-source/media-source.html#dom-timestampoffset + + * public/WebMediaPlayer.h: + (WebKit::WebMediaPlayer::sourceSetTimestampOffset): Add the new method. + * src/WebMediaPlayerClientImpl.cpp: + (WebKit): + (WebKit::WebMediaPlayerClientImpl::sourceSetTimestampOffset): Forward the call. + * src/WebMediaPlayerClientImpl.h: + (WebMediaPlayerClientImpl): + 2012-08-15 Peter Beverloo [Chromium] Roll WebKit Chromium DEPS to r151672 diff --git a/Source/WebKit/chromium/public/WebMediaPlayer.h b/Source/WebKit/chromium/public/WebMediaPlayer.h index 3b8ef6451de..ed62754d3e6 100644 --- a/Source/WebKit/chromium/public/WebMediaPlayer.h +++ b/Source/WebKit/chromium/public/WebMediaPlayer.h @@ -187,6 +187,7 @@ public: virtual bool sourceAppend(const WebString& id, const unsigned char* data, unsigned length) { return false; } virtual bool sourceAbort(const WebString& id) { return false; } virtual void sourceEndOfStream(EndOfStreamStatus) { } + virtual bool sourceSetTimestampOffset(const WebString& id, double offset) { return false; } // Returns whether keySystem is supported. If true, the result will be // reported by an event. diff --git a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp index c48aa896735..4a90a988d41 100644 --- a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp +++ b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp @@ -435,6 +435,13 @@ void WebMediaPlayerClientImpl::sourceEndOfStream(WebCore::MediaPlayer::EndOfStre if (m_webMediaPlayer) m_webMediaPlayer->sourceEndOfStream(static_cast(status)); } + +bool WebMediaPlayerClientImpl::sourceSetTimestampOffset(const String& id, double offset) +{ + if (!m_webMediaPlayer) + return false; + return m_webMediaPlayer->sourceSetTimestampOffset(id, offset); +} #endif #if ENABLE(ENCRYPTED_MEDIA) diff --git a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h index 2df54cd2052..373015eb756 100644 --- a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h +++ b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h @@ -164,6 +164,7 @@ public: virtual bool sourceAppend(const String&, const unsigned char* data, unsigned length); virtual bool sourceAbort(const String&); virtual void sourceEndOfStream(WebCore::MediaPlayer::EndOfStreamStatus); + virtual bool sourceSetTimestampOffset(const String&, double offset); #endif #if ENABLE(ENCRYPTED_MEDIA) -- GitLab