diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 584511a0e30c97f99dfca00b020cf328035d0c72..c5a6edddb02a5a33db82bcdc783191a4fb491a74 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 f308e2628e07172e2d9a5f8e500516d9b72e1758..809396714e4c4d2acd898625afb7419911813e5a 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 55ca78b952be6c6a55bcb44ca4a48ec8c4279415..894b7d08f77ce4faf700cb3c2019f1900aacad72 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 36b84e7143a51d207107274ab8229da1fc86d82a..65649c7863ec9d45e6f0deff1656b210c06328af 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 e1317f541e39c1f8a678ad08249c97ba956ad7eb..cc4f9d7d7b89918543d49532b8f6f4e65e99d1aa 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 2c85fd011b6566c2fb8261a6eb6e26ae08adaa3b..b638333697f88b014620c622a3158d6704c60b6c 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 5919108030808057a8f870bab3d88f02f5db091a..1d6e606a7ab7d1dc3e758442ac6f1472a7bb7386 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 d180dd4d7b069f18528fabbdf002a921bc6ad26e..7d1e5861c0f21ddeeacd347a78cbf23e033e3b7c 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 412b9cb618f55015527b3d69af296f69f7bd9f52..c7c6eb3abdcfdb68d3d60791958fcc9df7116eb3 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 28c784c03eeb82df942a895e68355e8bde0ce494..42e308bb5a986646a9504f13fc6c6f80e2e5ec50 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 c86827b8a0f34b493c4f60c7d41f8e915113a0db..de692227c27c0a938655877f9da8cf40bffa1f3e 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 58f1606d66960ed76aab082592b74b7cbef4ea68..28d2d9e0794187308830c5fe57e6a93d2ac1661b 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 f440f7aa57c306495b5c28d3e707695eb5e048ef..a1b8eea7333603aeb7dc95bd95c9925c6a32cc43 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 3b8ef6451de716be477a16a8c16c2a25b960cb3d..ed62754d3e66eb869c67b5bd51f032f554fc4841 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 c48aa8967353c360a0363450df2d558773dda29b..4a90a988d41c6ce4e56ba59a4d76bd65afa913dd 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 2df54cd20522be2442063ddf32cbb35f67f8fc3d..373015eb756af0f4511dae981e6bf2e1b54dd488 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)