Changeset 154908 in webkit
- Timestamp:
- Aug 30, 2013 1:17:27 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 37 added
- 22 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r154907 r154908 1 2013-08-30 Brendan Long <b.long@cablelabs.com> 2 3 <https://webkit.org/b/103771> [GStreamer] support in-band text tracks 4 5 Reviewed by Eric Carlson. 6 7 * media/content/counting-subtitled-kate.ogv: Added. 8 * media/content/counting-subtitled-srt.mkv: Added. 9 * media/in-band-cues.js: Added. 10 * media/track/in-band/track-in-band-kate-ogg-cues-added-once-expected.txt: Added. 11 * media/track/in-band/track-in-band-kate-ogg-cues-added-once.html: Added. 12 * media/track/in-band/track-in-band-kate-ogg-kind-expected.txt: Added. 13 * media/track/in-band/track-in-band-kate-ogg-kind.html: Added. 14 * media/track/in-band/track-in-band-kate-ogg-language-expected.txt: Added. 15 * media/track/in-band/track-in-band-kate-ogg-language.html: Added. 16 * media/track/in-band/track-in-band-kate-ogg-mode-expected.txt: Added. 17 * media/track/in-band/track-in-band-kate-ogg-mode.html: Added. 18 * media/track/in-band/track-in-band-kate-ogg-style-expected.txt: Added. 19 * media/track/in-band/track-in-band-kate-ogg-style.html: Added. 20 * media/track/in-band/track-in-band-kate-ogg-track-order-expected.txt: Added. 21 * media/track/in-band/track-in-band-kate-ogg-track-order.html: Added. 22 * media/track/in-band/track-in-band-srt-mkv-cues-added-once-expected.txt: Added. 23 * media/track/in-band/track-in-band-srt-mkv-cues-added-once.html: Added. 24 * media/track/in-band/track-in-band-srt-mkv-kind-expected.txt: Added. 25 * media/track/in-band/track-in-band-srt-mkv-kind.html: Added. 26 * media/track/in-band/track-in-band-srt-mkv-language-expected.txt: Added. 27 * media/track/in-band/track-in-band-srt-mkv-language.html: Added. 28 * media/track/in-band/track-in-band-srt-mkv-mode-expected.txt: Added. 29 * media/track/in-band/track-in-band-srt-mkv-mode.html: Added. 30 * media/track/in-band/track-in-band-srt-mkv-style-expected.txt: Added. 31 * media/track/in-band/track-in-band-srt-mkv-style.html: Added. 32 * media/track/in-band/track-in-band-srt-mkv-track-order-expected.txt: Added. 33 * media/track/in-band/track-in-band-srt-mkv-track-order.html: Added. 34 * platform/mac/TestExpectations: Skip MKV and OGG tests. 35 1 36 2013-08-30 Joseph Pecoraro <pecoraro@apple.com> 2 37 -
trunk/LayoutTests/platform/mac/TestExpectations
r154860 r154908 1301 1301 1302 1302 webkit.org/b/120387 svg/animations/svglengthlist-animation-3.html [ Pass Failure ] 1303 1304 # Don't run ogv and mkv tests on mac 1305 media/track/in-band [ WontFix ] -
trunk/Source/WebCore/CMakeLists.txt
r154904 r154908 2711 2711 html/track/AudioTrack.cpp 2712 2712 html/track/AudioTrackList.cpp 2713 html/track/InbandGenericTextTrack.cpp 2713 2714 html/track/InbandTextTrack.cpp 2715 html/track/InbandWebVTTTextTrack.cpp 2714 2716 html/track/LoadableTextTrack.cpp 2715 2717 html/track/TextTrack.cpp -
trunk/Source/WebCore/ChangeLog
r154906 r154908 1 2013-08-30 Brendan Long <b.long@cablelabs.com> 2 3 [GStreamer] support in-band text tracks 4 https://bugs.webkit.org/show_bug.cgi?id=103771 5 6 Reviewed by Eric Carlson. 7 8 Tests: New tests added because existing tests were too specific. 9 media/track/in-band/track-in-band-kate-ogg-cues-added-once.html 10 media/track/in-band/track-in-band-kate-ogg-kind.html 11 media/track/in-band/track-in-band-kate-ogg-language.html 12 media/track/in-band/track-in-band-kate-ogg-mode.html 13 media/track/in-band/track-in-band-kate-ogg-style.html 14 media/track/in-band/track-in-band-kate-ogg-track-order.html 15 media/track/in-band/track-in-band-srt-mkv-cues-added-once.html 16 media/track/in-band/track-in-band-srt-mkv-kind.html 17 media/track/in-band/track-in-band-srt-mkv-language.html 18 media/track/in-band/track-in-band-srt-mkv-mode.html 19 media/track/in-band/track-in-band-srt-mkv-style.html 20 media/track/in-band/track-in-band-srt-mkv-track-order.html 21 22 * CMakeLists.txt: Add InbandTextTrackPrivateGStreamer, InbandGenericTextTrack, InbandWebVTTTextTrack, and TextCombinerGStreamer files. 23 * GNUmakefile.list.am: Same. 24 * PlatformEfl.cmake: Same. 25 * Target.pri: Same. 26 * WebCore.vcxproj/WebCore.vcxproj: Same. 27 * WebCore.vcxproj/WebCore.vcxproj.filters: Same. 28 * WebCore.xcodeproj/project.pbxproj: Same. 29 * html/track/InbandGenericTextTrack.cpp: Split out code for handling generic cues. 30 (WebCore::GenericTextTrackCueMap::GenericTextTrackCueMap): Move from InbandTextTrack. 31 (WebCore::GenericTextTrackCueMap::~GenericTextTrackCueMap): Same. 32 (WebCore::GenericTextTrackCueMap::add): Same. 33 (WebCore::GenericTextTrackCueMap::find): Same. 34 (WebCore::GenericTextTrackCueMap::remove): Same. 35 (WebCore::InbandGenericTextTrack::create): Same. 36 (WebCore::InbandGenericTextTrack::updateCueFromCueData): Same. 37 (WebCore::InbandGenericTextTrack::addGenericCue): Same. 38 (WebCore::InbandGenericTextTrack::updateGenericCue): Same. 39 (WebCore::InbandGenericTextTrack::removeGenericCue): Same. 40 (WebCore::InbandGenericTextTrack::removeCue): Same. 41 (WebCore::InbandGenericTextTrack::InbandGenericTextTrack): Empty. 42 (WebCore::InbandGenericTextTrack::~InbandGenericTextTrack): Empty. 43 * html/track/InbandGenericTextTrack.h: Copied from Source/WebCore/html/track/InbandTextTrack.h. 44 The only addition is the ASSERT_NOT_REACHED() for WebVTT cues. 45 * html/track/InbandTextTrack.cpp: Add label and language changed callbacks. 46 (WebCore::InbandTextTrack::create): Return a generic or WebVTT text track based on the private CueFormat. 47 (WebCore::InbandTextTrack::labelChanged): Added. 48 (WebCore::InbandTextTrack::languageChanged): Added. 49 * html/track/InbandTextTrack.h: Add label and language changed callbacks. 50 * html/track/InbandWebVTTTextTrack.cpp: Added, based on InbandTextTrack. 51 (WebCore::InbandWebVTTTextTrack::create): Same. 52 (WebCore::InbandWebVTTTextTrack::InbandWebVTTTextTrack): Empty. 53 (WebCore::InbandWebVTTTextTrack::~InbandWebVTTTextTrack): Empty. 54 (WebCore::InbandWebVTTTextTrack::parseWebVTTCueData): Sends data to a WebVTTParser. 55 (WebCore::InbandWebVTTTextTrack::newCuesParsed): Adds cues when WebVTTParser parses them. 56 (WebCore::InbandWebVTTTextTrack::fileFailedToParse): Prints a warning when WebVTTParser has a problem. 57 * html/track/InbandWebVTTTextTrack.h: Added. 58 * platform/graphics/InbandTextTrackPrivate.h: 59 (WebCore::InbandTextTrackPrivate::cueFormat): For determining if the track will have generic or WebVTT cues. 60 (WebCore::InbandTextTrackPrivate::InbandTextTrackPrivate): Pass CueFormat in the constructor. 61 * platform/graphics/InbandTextTrackPrivateClient.h: Same. 62 * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp: 63 (WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF): Pass CueFormat (Generic) to InbandTextTrackPrivate. 64 * platform/graphics/gstreamer/GRefPtrGStreamer.cpp: Add GRefPtr specializations for GstSample and GstEvent. 65 * platform/graphics/gstreamer/GRefPtrGStreamer.h: Same. 66 * platform/graphics/gstreamer/GStreamerUtilities.h: Add WARN_MEDIA_MESSAGE. 67 * platform/graphics/gstreamer/GStreamerVersioning.h: Add a function to check GStreamer version at runtime. 68 * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp: Added. 69 (WebCore::textTrackPrivateEventCallback): Watches for tag and stream start events. 70 (WebCore::textTrackPrivateSampleTimeoutCallback): See notifyTrackOfSample(); 71 (WebCore::textTrackPrivateStreamTimeoutCallback): See notifyTrackOfStreamChanged(); 72 (WebCore::textTrackPrivateTagsChangeTimeoutCallback): See notifyTrackOfTagsChanged(); 73 (WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer): Initializes tags and stream and sets up event callback. 74 (WebCore::InbandTextTrackPrivateGStreamer::~InbandTextTrackPrivateGStreamer): Calls disconnect: 75 (WebCore::InbandTextTrackPrivateGStreamer::disconnect): Removes signal handlers and frees some memory. 76 (WebCore::InbandTextTrackPrivateGStreamer::handleSample): Adds samples to a list and sets up callback. 77 (WebCore::InbandTextTrackPrivateGStreamer::streamChanged): Sets up callback. 78 (WebCore::InbandTextTrackPrivateGStreamer::tagsChanged): Same. 79 (WebCore::InbandTextTrackPrivateGStreamer::notifyTrackOfSample): Parses all queued samples with WebVTTParser. 80 (WebCore::InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged): Keeps track of current stream. 81 (WebCore::InbandTextTrackPrivateGStreamer::notifyTrackOfTagsChanged): Sets label and language from tags. 82 * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h: Added. 83 (WebCore::InbandTextTrackPrivateGStreamer::create): Basic RefPtr create function. 84 (WebCore::InbandTextTrackPrivateGStreamer::pad): Returns the pad this track is associated with (used 85 to determine if a playbin text stream has already been associated with a text track). 86 (WebCore::InbandTextTrackPrivateGStreamer::setIndex): Sets the track index (used for sorting). 87 (WebCore::InbandTextTrackPrivateGStreamer::streamId): Returns the stream ID (used to handle new samples). 88 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: 89 (WebCore::mediaPlayerPrivateTextChangedCallback): Called for playbin "text-changed" event. See textChanged(). 90 (WebCore::mediaPlayerPrivateTextChangeTimeoutCallback): See notifyPlayerOfText(). 91 (WebCore::mediaPlayerPrivateNewTextSampleCallback): See newTextSample(). 92 (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): Initialize m_textTimerHandler. 93 (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): Disconnect text tracks (they don't necessarily 94 get freed here, since a script could hold a reference). 95 (WebCore::MediaPlayerPrivateGStreamer::textChanged): Setup callback for notifyPlayerOfText. 96 (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfText): Create text tracks. 97 (WebCore::MediaPlayerPrivateGStreamer::newTextSample): Handle new samples by giving them to a text track 98 with a matching stream. This method is syncryonous because we need to get the stream start sticky event 99 immediately. 100 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: 101 * platform/graphics/gstreamer/TextCombinerGStreamer.cpp: Added. This element forwards buffers from all 102 of its input pads, but also converts plain text to WebVTT as needed. 103 (webkit_text_combiner_init): Setup internal funnel. 104 (webkitTextCombinerPadEvent): If the caps are plain text make sure we have a webvttenv, otherwise connect 105 directly to the funnel. 106 (webkitTextCombinerRequestNewPad): Setup ghostpad and event callback. 107 (webkitTextCombinerReleasePad): Release pad and optional associated webvttenc. 108 (webkit_text_combiner_class_init): Setup pad templates and request/release pad functions. 109 (webkitTextCombinerNew): Returns a new WebKitTextCombiner. 110 * platform/graphics/gstreamer/TextCombinerGStreamer.h: Added. 111 * platform/graphics/gstreamer/TextSinkGStreamer.cpp: Added. 112 (webkit_text_sink_init): Set sync=false. 113 (webkitTextSinkGetProperty): Ignore sync property. 114 (webkitTextSinkSetProperty): Same. 115 (webkitTextSinkQuery): Ignore position and duration queries, forward everything else to appsink. 116 (webkit_text_sink_class_init): Setup property and query functions. 117 (webkitTextSinkNew): Return a new WebKitTextSink. 118 * platform/graphics/gstreamer/TextSinkGStreamer.h: Added. 119 1 120 2013-08-30 Dirk Schulze <krit@webkit.org> 2 121 -
trunk/Source/WebCore/GNUmakefile.list.am
r154904 r154908 3726 3726 Source/WebCore/html/track/AudioTrackList.cpp \ 3727 3727 Source/WebCore/html/track/AudioTrackList.h \ 3728 Source/WebCore/html/track/InbandGenericTextTrack.cpp \ 3729 Source/WebCore/html/track/InbandGenericTextTrack.h \ 3728 3730 Source/WebCore/html/track/InbandTextTrack.cpp \ 3729 3731 Source/WebCore/html/track/InbandTextTrack.h \ 3732 Source/WebCore/html/track/InbandWebVTTTextTrack.cpp \ 3733 Source/WebCore/html/track/InbandWebVTTTextTrack.h \ 3730 3734 Source/WebCore/html/track/LoadableTextTrack.cpp \ 3731 3735 Source/WebCore/html/track/LoadableTextTrack.h \ … … 6328 6332 Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h \ 6329 6333 Source/WebCore/platform/graphics/gstreamer/GStreamerVersioning.cpp \ 6330 Source/WebCore/platform/graphics/gstreamer/GStreamerVersioning.h 6334 Source/WebCore/platform/graphics/gstreamer/GStreamerVersioning.h \ 6335 Source/WebCore/platform/graphics/gstreamer/TextCombinerGStreamer.cpp \ 6336 Source/WebCore/platform/graphics/gstreamer/TextCombinerGStreamer.h \ 6337 Source/WebCore/platform/graphics/gstreamer/TextSinkGStreamer.cpp \ 6338 Source/WebCore/platform/graphics/gstreamer/TextSinkGStreamer.h 6339 webcore_platform_sources += \ 6340 Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp \ 6341 Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h 6331 6342 endif 6332 6343 -
trunk/Source/WebCore/PlatformEfl.cmake
r154262 r154908 124 124 platform/graphics/gstreamer/GStreamerVersioning.cpp 125 125 platform/graphics/gstreamer/ImageGStreamerCairo.cpp 126 platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp 126 127 platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp 127 128 platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 128 129 platform/graphics/gstreamer/PlatformVideoWindowEfl.cpp 130 platform/graphics/gstreamer/TextCombinerGStreamer.cpp 131 platform/graphics/gstreamer/TextSinkGStreamer.cpp 129 132 platform/graphics/gstreamer/VideoSinkGStreamer.cpp 130 133 platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp -
trunk/Source/WebCore/Target.pri
r154904 r154908 3334 3334 platform/graphics/gstreamer/PlatformVideoWindowQt.cpp \ 3335 3335 platform/graphics/gstreamer/ImageGStreamerQt.cpp 3336 enable?(VIDEO_TRACK) { 3337 HEADERS += \ 3338 platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h \ 3339 platform/graphics/gstreamer/TextCombinerGStreamer.h \ 3340 platform/graphics/gstreamer/TextSinkGStreamer.h 3341 SOURCES += \ 3342 platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp \ 3343 platform/graphics/gstreamer/TextCombinerGStreamer.cpp \ 3344 platform/graphics/gstreamer/TextSinkGStreamer.cpp 3345 } 3336 3346 3337 3347 } else:use?(QT_MULTIMEDIA) { … … 3903 3913 html/track/AudioTrack.h \ 3904 3914 html/track/AudioTrackList.h \ 3915 html/track/InbandGenericTextTrack.h \ 3905 3916 html/track/InbandTextTrack.h \ 3917 html/track/InbandWebVTTTextTrack.h \ 3906 3918 html/track/LoadableTextTrack.h \ 3907 3919 html/track/TextTrack.h \ … … 3937 3949 html/track/AudioTrack.cpp \ 3938 3950 html/track/AudioTrackList.cpp \ 3951 html/track/InbandGenericTextTrack.cpp \ 3939 3952 html/track/InbandTextTrack.cpp \ 3953 html/track/InbandWebVTTTextTrack.cpp \ 3940 3954 html/track/LoadableTextTrack.cpp \ 3941 3955 html/track/TextTrack.cpp \ -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r154904 r154908 15631 15631 <ClCompile Include="..\html\shadow\SpinButtonElement.cpp" /> 15632 15632 <ClCompile Include="..\html\shadow\TextControlInnerElements.cpp" /> 15633 <ClCompile Include="..\html\track\InbandGenericTextTrack.cpp" /> 15633 15634 <ClCompile Include="..\html\track\InbandTextTrack.cpp" /> 15635 <ClCompile Include="..\html\track\InbandWebVTTTextTrack.cpp" /> 15634 15636 <ClCompile Include="..\html\track\LoadableTextTrack.cpp" /> 15635 15637 <ClCompile Include="..\html\track\TextTrack.cpp" /> … … 20661 20663 <ClInclude Include="..\html\shadow\SpinButtonElement.h" /> 20662 20664 <ClInclude Include="..\html\shadow\TextControlInnerElements.h" /> 20665 <ClInclude Include="..\html\track\InbandGenericTextTrack.h" /> 20663 20666 <ClInclude Include="..\html\track\InbandTextTrack.h" /> 20667 <ClInclude Include="..\html\track\InbandWebVTTTextTrack.h" /> 20664 20668 <ClInclude Include="..\html\track\LoadableTextTrack.h" /> 20665 20669 <ClInclude Include="..\html\track\TextTrack.h" /> -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters
r154904 r154908 4327 4327 <Filter>html\shadow</Filter> 4328 4328 </ClCompile> 4329 <ClCompile Include="..\html\track\InbandGenericTextTrack.cpp"> 4330 <Filter>html\track</Filter> 4331 </ClCompile> 4329 4332 <ClCompile Include="..\html\track\InbandTextTrack.cpp"> 4333 <Filter>html\track</Filter> 4334 </ClCompile> 4335 <ClCompile Include="..\html\track\InbandWebVTTTextTrack.cpp"> 4330 4336 <Filter>html\track</Filter> 4331 4337 </ClCompile> … … 11481 11487 <Filter>html\shadow</Filter> 11482 11488 </ClInclude> 11489 <ClInclude Include="..\html\track\InbandGenericTextTrack.h"> 11490 <Filter>html\track</Filter> 11491 </ClInclude> 11483 11492 <ClInclude Include="..\html\track\InbandTextTrack.h"> 11493 <Filter>html\track</Filter> 11494 </ClInclude> 11495 <ClInclude Include="..\html\track\InbandWebVTTTextTrack.h"> 11484 11496 <Filter>html\track</Filter> 11485 11497 </ClInclude> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r154904 r154908 5042 5042 BCFF64910EAD15C200C1D6F7 /* LengthBox.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFF648F0EAD15C200C1D6F7 /* LengthBox.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5043 5043 BCFF64920EAD15C200C1D6F7 /* LengthSize.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFF64900EAD15C200C1D6F7 /* LengthSize.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5044 BE16C59217CFE17200852C04 /* InbandGenericTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE16C58E17CFE17200852C04 /* InbandGenericTextTrack.cpp */; }; 5045 BE16C59317CFE17200852C04 /* InbandGenericTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = BE16C58F17CFE17200852C04 /* InbandGenericTextTrack.h */; }; 5046 BE16C59417CFE17200852C04 /* InbandWebVTTTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE16C59017CFE17200852C04 /* InbandWebVTTTextTrack.cpp */; }; 5047 BE16C59517CFE17200852C04 /* InbandWebVTTTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = BE16C59117CFE17200852C04 /* InbandWebVTTTextTrack.h */; }; 5044 5048 BE6DF70B171CA2C500DD52B8 /* JSVideoTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE6DF708171CA2C500DD52B8 /* JSVideoTrackCustom.cpp */; }; 5045 5049 BE6DF70D171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE6DF70A171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp */; }; … … 11724 11728 BCFF648F0EAD15C200C1D6F7 /* LengthBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LengthBox.h; sourceTree = "<group>"; }; 11725 11729 BCFF64900EAD15C200C1D6F7 /* LengthSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LengthSize.h; sourceTree = "<group>"; }; 11730 BE16C58E17CFE17200852C04 /* InbandGenericTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandGenericTextTrack.cpp; sourceTree = "<group>"; }; 11731 BE16C58F17CFE17200852C04 /* InbandGenericTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandGenericTextTrack.h; sourceTree = "<group>"; }; 11732 BE16C59017CFE17200852C04 /* InbandWebVTTTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandWebVTTTextTrack.cpp; sourceTree = "<group>"; }; 11733 BE16C59117CFE17200852C04 /* InbandWebVTTTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandWebVTTTextTrack.h; sourceTree = "<group>"; }; 11726 11734 BE6DF708171CA2C500DD52B8 /* JSVideoTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSVideoTrackCustom.cpp; sourceTree = "<group>"; }; 11727 11735 BE6DF70A171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSVideoTrackListCustom.cpp; sourceTree = "<group>"; }; … … 17590 17598 BE88E0D01715D2A200658D98 /* AudioTrackList.h */, 17591 17599 BE88E0D11715D2A200658D98 /* AudioTrackList.idl */, 17600 BE16C58E17CFE17200852C04 /* InbandGenericTextTrack.cpp */, 17601 BE16C58F17CFE17200852C04 /* InbandGenericTextTrack.h */, 17592 17602 0794178F166E855F009416C2 /* InbandTextTrack.cpp */, 17593 17603 07941790166E855F009416C2 /* InbandTextTrack.h */, 17604 BE16C59017CFE17200852C04 /* InbandWebVTTTextTrack.cpp */, 17605 BE16C59117CFE17200852C04 /* InbandWebVTTTextTrack.h */, 17594 17606 9759E93414EF1CF80026A2DD /* LoadableTextTrack.cpp */, 17595 17607 9759E94814EF1D490026A2DD /* LoadableTextTrack.h */, … … 23962 23974 FD1762E4176686EA00D836A8 /* DownSampler.h in Headers */, 23963 23975 FBB0C5B817BBD629003D3677 /* CSSFilterImageValue.h in Headers */, 23976 BE16C59317CFE17200852C04 /* InbandGenericTextTrack.h in Headers */, 23977 BE16C59517CFE17200852C04 /* InbandWebVTTTextTrack.h in Headers */, 23964 23978 ); 23965 23979 runOnlyForDeploymentPostprocessing = 0; … … 26926 26940 6E84E9E017668BEE00815B68 /* RasterShape.cpp in Sources */, 26927 26941 FBB0C5B717BBD626003D3677 /* CSSFilterImageValue.cpp in Sources */, 26942 BE16C59217CFE17200852C04 /* InbandGenericTextTrack.cpp in Sources */, 26943 BE16C59417CFE17200852C04 /* InbandWebVTTTextTrack.cpp in Sources */, 26928 26944 ); 26929 26945 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r154877 r154908 101 101 #include "CaptionUserPreferences.h" 102 102 #include "HTMLTrackElement.h" 103 #include "InbandGenericTextTrack.h" 103 104 #include "InbandTextTrack.h" 104 105 #include "InbandTextTrackPrivate.h" 106 #include "InbandWebVTTTextTrack.h" 105 107 #include "RuntimeEnabledFeatures.h" 106 108 #include "TextTrackCueList.h" -
trunk/Source/WebCore/html/track/InbandGenericTextTrack.h
r154907 r154908 24 24 */ 25 25 26 #ifndef Inband TextTrack_h27 #define Inband TextTrack_h26 #ifndef InbandGenericTextTrack_h 27 #define InbandGenericTextTrack_h 28 28 29 29 #if ENABLE(VIDEO_TRACK) 30 30 31 #include "InbandTextTrackPrivateClient.h" 32 #include "TextTrack.h" 31 #include "InbandTextTrack.h" 33 32 #include "TextTrackCueGeneric.h" 34 33 #include <wtf/RefPtr.h> … … 39 38 class InbandTextTrackPrivate; 40 39 class TextTrackCue; 41 class WebVTTCueData;42 40 43 class TextTrackCueMap {41 class GenericTextTrackCueMap { 44 42 public: 45 TextTrackCueMap();46 virtual ~ TextTrackCueMap();43 GenericTextTrackCueMap(); 44 virtual ~GenericTextTrackCueMap(); 47 45 48 46 void add(GenericCueData*, TextTrackCueGeneric*); 49 void add(WebVTTCueData*, TextTrackCue*);50 47 51 48 void remove(TextTrackCue*); 52 49 void remove(GenericCueData*); 53 void remove(WebVTTCueData*);54 50 55 PassRefPtr<GenericCueData> findGenericData(TextTrackCue*); 56 PassRefPtr<WebVTTCueData> findWebVTTData(TextTrackCue*); 51 PassRefPtr<GenericCueData> find(TextTrackCue*); 57 52 PassRefPtr<TextTrackCueGeneric> find(GenericCueData*); 58 PassRefPtr<TextTrackCue> find(WebVTTCueData*); 59 53 60 54 private: 61 typedef HashMap<RefPtr<TextTrackCue>, RefPtr<GenericCueData> > GenericCueToDataMap; 62 typedef HashMap<RefPtr<GenericCueData>, RefPtr<TextTrackCueGeneric> > GenericCueDataToCueMap; 63 typedef HashMap<RefPtr<TextTrackCue>, RefPtr<WebVTTCueData> > WebVTTCueToDataMap; 64 typedef HashMap<RefPtr<WebVTTCueData>, RefPtr<TextTrackCue> > WebVTTCueDataToCueMap; 55 typedef HashMap<RefPtr<TextTrackCue>, RefPtr<GenericCueData> > CueToDataMap; 56 typedef HashMap<RefPtr<GenericCueData>, RefPtr<TextTrackCueGeneric> > CueDataToCueMap; 65 57 66 GenericCueToDataMap* m_genericCueToDataMap; 67 GenericCueDataToCueMap* m_genericDataToCueMap; 68 WebVTTCueToDataMap* m_webVTTCueToDataMap; 69 WebVTTCueDataToCueMap* m_webVTTDataToCueMap; 58 CueToDataMap m_cueToDataMap; 59 CueDataToCueMap m_dataToCueMap; 70 60 }; 71 61 72 class Inband TextTrack : public TextTrack, public InbandTextTrackPrivateClient{62 class InbandGenericTextTrack : public InbandTextTrack { 73 63 public: 74 static PassRefPtr<InbandTextTrack> create(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>); 75 virtual ~InbandTextTrack(); 76 77 virtual bool isClosedCaptions() const OVERRIDE; 78 virtual bool isSDH() const OVERRIDE; 79 virtual bool containsOnlyForcedSubtitles() const OVERRIDE; 80 virtual bool isMainProgramContent() const OVERRIDE; 81 virtual bool isEasyToRead() const OVERRIDE; 82 virtual void setMode(const AtomicString&) OVERRIDE; 83 size_t inbandTrackIndex(); 64 static PassRefPtr<InbandGenericTextTrack> create(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>); 65 virtual ~InbandGenericTextTrack(); 84 66 85 67 private: 86 Inband TextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);68 InbandGenericTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>); 87 69 88 70 virtual void addGenericCue(InbandTextTrackPrivate*, PassRefPtr<GenericCueData>) OVERRIDE; 89 71 virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 90 72 virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 91 virtual void addWebVTTCue(InbandTextTrackPrivate*, PassRefPtr<WebVTTCueData>) OVERRIDE;92 virtual void removeWebVTTCue(InbandTextTrackPrivate*, WebVTTCueData*) OVERRIDE;93 73 virtual void removeCue(TextTrackCue*, ExceptionCode&) OVERRIDE; 94 virtual void willRemoveTextTrackPrivate(InbandTextTrackPrivate*) OVERRIDE; 74 75 virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char*, unsigned) OVERRIDE { ASSERT_NOT_REACHED(); } 95 76 96 77 PassRefPtr<TextTrackCueGeneric> createCue(PassRefPtr<GenericCueData>); 97 78 void updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*); 98 79 99 #if USE(PLATFORM_TEXT_TRACK_MENU) 100 virtual InbandTextTrackPrivate* privateTrack() OVERRIDE { return m_private.get(); } 101 #endif 102 103 TextTrackCueMap m_cueMap; 104 RefPtr<InbandTextTrackPrivate> m_private; 80 GenericTextTrackCueMap m_cueMap; 105 81 }; 106 82 -
trunk/Source/WebCore/html/track/InbandTextTrack.cpp
r152741 r154908 34 34 #include "ExceptionCodePlaceholder.h" 35 35 #include "HTMLMediaElement.h" 36 #include "InbandGenericTextTrack.h" 36 37 #include "InbandTextTrackPrivate.h" 38 #include "InbandWebVTTTextTrack.h" 37 39 #include "Logging.h" 38 40 #include "TextTrackCueGeneric.h" … … 44 46 namespace WebCore { 45 47 46 TextTrackCueMap::TextTrackCueMap() 47 : m_genericCueToDataMap(0) 48 , m_genericDataToCueMap(0) 49 , m_webVTTCueToDataMap(0) 50 , m_webVTTDataToCueMap(0) 48 PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context, 49 TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate) 51 50 { 52 } 53 54 TextTrackCueMap::~TextTrackCueMap() 55 { 56 if (m_genericCueToDataMap) { 57 delete m_genericCueToDataMap; 58 ASSERT(m_genericDataToCueMap); 59 delete m_genericDataToCueMap; 60 } else 61 ASSERT(!m_genericDataToCueMap); 62 63 if (m_webVTTCueToDataMap) { 64 delete m_webVTTCueToDataMap; 65 ASSERT(m_webVTTDataToCueMap); 66 delete m_webVTTDataToCueMap; 67 } else 68 ASSERT(!m_webVTTDataToCueMap); 69 } 70 71 void TextTrackCueMap::add(GenericCueData* cueData, TextTrackCueGeneric* cue) 72 { 73 if (!m_genericDataToCueMap) { 74 m_genericDataToCueMap = new GenericCueDataToCueMap; 75 ASSERT(!m_genericCueToDataMap); 76 m_genericCueToDataMap = new GenericCueToDataMap; 77 } else 78 ASSERT(m_genericCueToDataMap); 79 80 m_genericDataToCueMap->add(cueData, cue); 81 m_genericCueToDataMap->add(cue, cueData); 82 } 83 84 void TextTrackCueMap::add(WebVTTCueData* cueData, TextTrackCue* cue) 85 { 86 if (!m_webVTTDataToCueMap) { 87 m_webVTTDataToCueMap = new WebVTTCueDataToCueMap; 88 ASSERT(!m_webVTTCueToDataMap); 89 m_webVTTCueToDataMap = new WebVTTCueToDataMap; 90 } else 91 ASSERT(m_webVTTCueToDataMap); 92 93 m_webVTTDataToCueMap->add(cueData, cue); 94 m_webVTTCueToDataMap->add(cue, cueData); 95 } 96 97 PassRefPtr<TextTrackCueGeneric> TextTrackCueMap::find(GenericCueData* cueData) 98 { 99 if (!m_genericDataToCueMap) 51 switch (trackPrivate->cueFormat()) { 52 case InbandTextTrackPrivate::Generic: 53 return InbandGenericTextTrack::create(context, client, trackPrivate); 54 case InbandTextTrackPrivate::WebVTT: 55 return InbandWebVTTTextTrack::create(context, client, trackPrivate); 56 default: 57 ASSERT_NOT_REACHED(); 100 58 return 0; 101 102 GenericCueDataToCueMap::iterator iter = m_genericDataToCueMap->find(cueData);103 if (iter == m_genericDataToCueMap->end())104 return 0;105 106 return iter->value;107 }108 109 PassRefPtr<TextTrackCue> TextTrackCueMap::find(WebVTTCueData* cueData)110 {111 if (!m_webVTTDataToCueMap)112 return 0;113 114 WebVTTCueDataToCueMap::iterator iter = m_webVTTDataToCueMap->find(cueData);115 if (iter == m_webVTTDataToCueMap->end())116 return 0;117 118 return iter->value;119 }120 121 PassRefPtr<GenericCueData> TextTrackCueMap::findGenericData(TextTrackCue* cue)122 {123 if (!m_genericCueToDataMap)124 return 0;125 126 GenericCueToDataMap::iterator iter = m_genericCueToDataMap->find(cue);127 if (iter == m_genericCueToDataMap->end())128 return 0;129 130 return iter->value;131 }132 133 PassRefPtr<WebVTTCueData> TextTrackCueMap::findWebVTTData(TextTrackCue* cue)134 {135 if (!m_webVTTCueToDataMap)136 return 0;137 138 WebVTTCueToDataMap::iterator iter = m_webVTTCueToDataMap->find(cue);139 if (iter == m_webVTTCueToDataMap->end())140 return 0;141 142 return iter->value;143 }144 145 void TextTrackCueMap::remove(GenericCueData* cueData)146 {147 if (!m_genericCueToDataMap)148 return;149 150 RefPtr<TextTrackCueGeneric> cue = find(cueData);151 152 if (cue)153 m_genericCueToDataMap->remove(cue);154 m_genericDataToCueMap->remove(cueData);155 }156 157 void TextTrackCueMap::remove(TextTrackCue* cue)158 {159 if (m_genericCueToDataMap) {160 RefPtr<GenericCueData> genericData = findGenericData(cue);161 if (genericData) {162 m_genericDataToCueMap->remove(genericData);163 m_genericCueToDataMap->remove(cue);164 return;165 }166 59 } 167 168 if (m_webVTTCueToDataMap) {169 RefPtr<WebVTTCueData> webVTTData = findWebVTTData(cue);170 if (webVTTData) {171 m_webVTTDataToCueMap->remove(webVTTData);172 m_webVTTCueToDataMap->remove(cue);173 }174 }175 }176 177 void TextTrackCueMap::remove(WebVTTCueData* cueData)178 {179 if (!m_webVTTCueToDataMap)180 return;181 182 RefPtr<TextTrackCue> cue = find(cueData);183 184 if (cue)185 m_webVTTCueToDataMap->remove(cue);186 m_webVTTDataToCueMap->remove(cueData);187 }188 189 190 PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate)191 {192 return adoptRef(new InbandTextTrack(context, client, playerPrivate));193 60 } 194 61 … … 290 157 } 291 158 292 void InbandTextTrack::updateCueFromCueData(TextTrackCueGeneric* cue, GenericCueData* cueData) 293 { 294 cue->willChange(); 295 296 cue->setStartTime(cueData->startTime(), IGNORE_EXCEPTION); 297 double endTime = cueData->endTime(); 298 if (std::isinf(endTime) && mediaElement()) 299 endTime = mediaElement()->duration(); 300 cue->setEndTime(endTime, IGNORE_EXCEPTION); 301 cue->setText(cueData->content()); 302 cue->setId(cueData->id()); 303 cue->setBaseFontSizeRelativeToVideoHeight(cueData->baseFontSize()); 304 cue->setFontSizeMultiplier(cueData->relativeFontSize()); 305 cue->setFontName(cueData->fontName()); 306 307 if (cueData->position() > 0) 308 cue->setPosition(lround(cueData->position()), IGNORE_EXCEPTION); 309 if (cueData->line() > 0) 310 cue->setLine(lround(cueData->line()), IGNORE_EXCEPTION); 311 if (cueData->size() > 0) 312 cue->setSize(lround(cueData->size()), IGNORE_EXCEPTION); 313 if (cueData->backgroundColor().isValid()) 314 cue->setBackgroundColor(cueData->backgroundColor().rgb()); 315 if (cueData->foregroundColor().isValid()) 316 cue->setForegroundColor(cueData->foregroundColor().rgb()); 317 if (cueData->highlightColor().isValid()) 318 cue->setHighlightColor(cueData->highlightColor().rgb()); 319 320 if (cueData->align() == GenericCueData::Start) 321 cue->setAlign(ASCIILiteral("start"), IGNORE_EXCEPTION); 322 else if (cueData->align() == GenericCueData::Middle) 323 cue->setAlign(ASCIILiteral("middle"), IGNORE_EXCEPTION); 324 else if (cueData->align() == GenericCueData::End) 325 cue->setAlign(ASCIILiteral("end"), IGNORE_EXCEPTION); 326 cue->setSnapToLines(false); 327 328 cue->didChange(); 329 } 330 331 void InbandTextTrack::addGenericCue(InbandTextTrackPrivate* trackPrivate, PassRefPtr<GenericCueData> prpCueData) 159 void InbandTextTrack::labelChanged(InbandTextTrackPrivate* trackPrivate, const String& label) 332 160 { 333 161 ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); 334 335 RefPtr<GenericCueData> cueData = prpCueData; 336 if (m_cueMap.find(cueData.get())) 337 return; 338 339 RefPtr<TextTrackCueGeneric> cue = TextTrackCueGeneric::create(scriptExecutionContext(), cueData->startTime(), cueData->endTime(), cueData->content()); 340 updateCueFromCueData(cue.get(), cueData.get()); 341 if (hasCue(cue.get(), TextTrackCue::IgnoreDuration)) { 342 LOG(Media, "InbandTextTrack::addGenericCue ignoring already added cue: start=%.2f, end=%.2f, content=\"%s\"\n", cueData->startTime(), cueData->endTime(), cueData->content().utf8().data()); 343 return; 344 } 345 346 if (cueData->status() != GenericCueData::Complete) 347 m_cueMap.add(cueData.get(), cue.get()); 348 349 addCue(cue); 162 setLabel(label); 350 163 } 351 164 352 void InbandTextTrack::updateGenericCue(InbandTextTrackPrivate*, GenericCueData* cueData) 353 { 354 RefPtr<TextTrackCueGeneric> cue = m_cueMap.find(cueData); 355 if (!cue) 356 return; 357 358 updateCueFromCueData(cue.get(), cueData); 359 360 if (cueData->status() == GenericCueData::Complete) 361 m_cueMap.remove(cueData); 362 } 363 364 void InbandTextTrack::removeGenericCue(InbandTextTrackPrivate*, GenericCueData* cueData) 365 { 366 RefPtr<TextTrackCueGeneric> cue = m_cueMap.find(cueData); 367 if (cue) { 368 LOG(Media, "InbandTextTrack::removeGenericCue removing cue: start=%.2f, end=%.2f, content=\"%s\"\n", cueData->startTime(), cueData->endTime(), cueData->content().utf8().data()); 369 removeCue(cue.get(), IGNORE_EXCEPTION); 370 } else 371 m_cueMap.remove(cueData); 372 } 373 374 void InbandTextTrack::addWebVTTCue(InbandTextTrackPrivate* trackPrivate, PassRefPtr<WebVTTCueData> prpCueData) 165 void InbandTextTrack::languageChanged(InbandTextTrackPrivate* trackPrivate, const String& language) 375 166 { 376 167 ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); 377 378 RefPtr<WebVTTCueData> cueData = prpCueData; 379 if (m_cueMap.find(cueData.get())) 380 return; 381 382 RefPtr<TextTrackCue> cue = TextTrackCue::create(scriptExecutionContext(), cueData->startTime(), cueData->endTime(), cueData->content()); 383 cue->setId(cueData->id()); 384 cue->setCueSettings(cueData->settings()); 385 386 m_cueMap.add(cueData.get(), cue.get()); 387 addCue(cue.release()); 388 } 389 390 void InbandTextTrack::removeWebVTTCue(InbandTextTrackPrivate*, WebVTTCueData* cueData) 391 { 392 RefPtr<TextTrackCue> cue = m_cueMap.find(cueData); 393 if (cue) { 394 LOG(Media, "InbandTextTrack::removeWebVTTCue removing cue: start=%.2f, end=%.2f, content=\"%s\"\n", cueData->startTime(), cueData->endTime(), cueData->content().utf8().data()); 395 removeCue(cue.get(), IGNORE_EXCEPTION); 396 } else 397 m_cueMap.remove(cueData); 398 } 399 400 void InbandTextTrack::removeCue(TextTrackCue* cue, ExceptionCode& ec) 401 { 402 m_cueMap.remove(cue); 403 TextTrack::removeCue(cue, ec); 168 setLanguage(language); 404 169 } 405 170 -
trunk/Source/WebCore/html/track/InbandTextTrack.h
r152741 r154908 36 36 namespace WebCore { 37 37 38 class Document;39 class InbandTextTrackPrivate;40 class TextTrackCue;41 class WebVTTCueData;42 43 class TextTrackCueMap {44 public:45 TextTrackCueMap();46 virtual ~TextTrackCueMap();47 48 void add(GenericCueData*, TextTrackCueGeneric*);49 void add(WebVTTCueData*, TextTrackCue*);50 51 void remove(TextTrackCue*);52 void remove(GenericCueData*);53 void remove(WebVTTCueData*);54 55 PassRefPtr<GenericCueData> findGenericData(TextTrackCue*);56 PassRefPtr<WebVTTCueData> findWebVTTData(TextTrackCue*);57 PassRefPtr<TextTrackCueGeneric> find(GenericCueData*);58 PassRefPtr<TextTrackCue> find(WebVTTCueData*);59 60 private:61 typedef HashMap<RefPtr<TextTrackCue>, RefPtr<GenericCueData> > GenericCueToDataMap;62 typedef HashMap<RefPtr<GenericCueData>, RefPtr<TextTrackCueGeneric> > GenericCueDataToCueMap;63 typedef HashMap<RefPtr<TextTrackCue>, RefPtr<WebVTTCueData> > WebVTTCueToDataMap;64 typedef HashMap<RefPtr<WebVTTCueData>, RefPtr<TextTrackCue> > WebVTTCueDataToCueMap;65 66 GenericCueToDataMap* m_genericCueToDataMap;67 GenericCueDataToCueMap* m_genericDataToCueMap;68 WebVTTCueToDataMap* m_webVTTCueToDataMap;69 WebVTTCueDataToCueMap* m_webVTTDataToCueMap;70 };71 72 38 class InbandTextTrack : public TextTrack, public InbandTextTrackPrivateClient { 73 39 public: … … 83 49 size_t inbandTrackIndex(); 84 50 85 pr ivate:51 protected: 86 52 InbandTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>); 87 53 88 virtual void addGenericCue(InbandTextTrackPrivate*, PassRefPtr<GenericCueData>) OVERRIDE; 89 virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 90 virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE; 91 virtual void addWebVTTCue(InbandTextTrackPrivate*, PassRefPtr<WebVTTCueData>) OVERRIDE; 92 virtual void removeWebVTTCue(InbandTextTrackPrivate*, WebVTTCueData*) OVERRIDE; 93 virtual void removeCue(TextTrackCue*, ExceptionCode&) OVERRIDE; 54 RefPtr<InbandTextTrackPrivate> m_private; 55 56 private: 57 94 58 virtual void willRemoveTextTrackPrivate(InbandTextTrackPrivate*) OVERRIDE; 95 59 96 PassRefPtr<TextTrackCueGeneric> createCue(PassRefPtr<GenericCueData>);97 v oid updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*);60 virtual void labelChanged(InbandTextTrackPrivate*, const String& label) OVERRIDE; 61 virtual void languageChanged(InbandTextTrackPrivate*, const String& language) OVERRIDE; 98 62 99 63 #if USE(PLATFORM_TEXT_TRACK_MENU) 100 64 virtual InbandTextTrackPrivate* privateTrack() OVERRIDE { return m_private.get(); } 101 65 #endif 102 103 TextTrackCueMap m_cueMap;104 RefPtr<InbandTextTrackPrivate> m_private;105 66 }; 106 67 -
trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivate.h
r151697 r154908 40 40 WTF_MAKE_NONCOPYABLE(InbandTextTrackPrivate); WTF_MAKE_FAST_ALLOCATED; 41 41 public: 42 static PassRefPtr<InbandTextTrackPrivate> create()43 {44 return adoptRef(new InbandTextTrackPrivate());45 }46 42 virtual ~InbandTextTrackPrivate() { } 47 43 … … 79 75 virtual int textTrackIndex() const { return 0; } 80 76 77 enum CueFormat { 78 Generic, 79 WebVTT 80 }; 81 CueFormat cueFormat() const { return m_format; } 82 81 83 void willBeRemoved() 82 84 { … … 86 88 87 89 protected: 88 InbandTextTrackPrivate() 89 : m_client(0) 90 InbandTextTrackPrivate(CueFormat format) 91 : m_format(format) 92 , m_client(0) 90 93 , m_mode(Disabled) 91 94 { … … 93 96 94 97 private: 98 CueFormat m_format; 95 99 InbandTextTrackPrivateClient* m_client; 96 100 Mode m_mode; -
trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h
r152741 r154908 140 140 virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0; 141 141 142 virtual void addWebVTTCue(InbandTextTrackPrivate*, PassRefPtr<WebVTTCueData>) = 0; 143 virtual void removeWebVTTCue(InbandTextTrackPrivate*, WebVTTCueData*) = 0; 142 virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char* data, unsigned length) = 0; 143 144 virtual void labelChanged(InbandTextTrackPrivate*, const String&) = 0; 145 virtual void languageChanged(InbandTextTrackPrivate*, const String&) = 0; 144 146 145 147 virtual void willRemoveTextTrackPrivate(InbandTextTrackPrivate*) = 0; -
trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp
r153758 r154908 98 98 99 99 InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF(AVFInbandTrackParent* owner) 100 : m_owner(owner) 100 : InbandTextTrackPrivate(Generic) 101 , m_owner(owner) 101 102 , m_pendingCueStatus(None) 102 103 , m_index(0) -
trunk/Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.cpp
r139896 r154908 184 184 gst_buffer_unref(ptr); 185 185 } 186 187 #ifdef GST_API_VERSION_1 188 template<> GRefPtr<GstSample> adoptGRef(GstSample* ptr) 189 { 190 return GRefPtr<GstSample>(ptr, GRefPtrAdopt); 191 } 192 193 template<> GstSample* refGPtr<GstSample>(GstSample* ptr) 194 { 195 if (ptr) 196 gst_sample_ref(ptr); 197 198 return ptr; 199 } 200 201 template<> void derefGPtr<GstSample>(GstSample* ptr) 202 { 203 if (ptr) 204 gst_sample_unref(ptr); 205 } 206 #endif 207 208 template<> GRefPtr<GstEvent> adoptGRef(GstEvent* ptr) 209 { 210 return GRefPtr<GstEvent>(ptr, GRefPtrAdopt); 211 } 212 213 template<> GstEvent* refGPtr<GstEvent>(GstEvent* ptr) 214 { 215 if (ptr) 216 gst_event_ref(ptr); 217 218 return ptr; 219 } 220 221 template<> void derefGPtr<GstEvent>(GstEvent* ptr) 222 { 223 if (ptr) 224 gst_event_unref(ptr); 225 } 186 226 } 187 227 #endif // USE(GSTREAMER) -
trunk/Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.h
r139896 r154908 32 32 typedef struct _GstElementFactory GstElementFactory; 33 33 typedef struct _GstBuffer GstBuffer; 34 #ifdef GST_API_VERSION_1 35 typedef struct _GstSample GstSample; 36 #endif 37 typedef struct _GstEvent GstEvent; 34 38 35 39 namespace WTF { … … 66 70 template<> GstBuffer* refGPtr<GstBuffer>(GstBuffer* ptr); 67 71 template<> void derefGPtr<GstBuffer>(GstBuffer* ptr); 72 73 #ifdef GST_API_VERSION_1 74 template<> GRefPtr<GstSample> adoptGRef(GstSample* ptr); 75 template<> GstSample* refGPtr<GstSample>(GstSample* ptr); 76 template<> void derefGPtr<GstSample>(GstSample* ptr); 77 #endif 78 79 template<> GRefPtr<GstEvent> adoptGRef(GstEvent* ptr); 80 template<> GstEvent* refGPtr<GstEvent>(GstEvent* ptr); 81 template<> void derefGPtr<GstEvent>(GstEvent* ptr); 68 82 } 69 83 -
trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h
r150524 r154908 29 29 LOG_VERBOSE(Media, __VA_ARGS__); } while (0) 30 30 31 #define WARN_MEDIA_MESSAGE(...) do { \ 32 GST_WARNING(__VA_ARGS__); \ 33 LOG_VERBOSE(Media, __VA_ARGS__); } while (0) 34 31 35 namespace WebCore { 32 36 bool initializeGStreamer(); -
trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerVersioning.h
r141821 r154908 30 30 }; 31 31 32 inline bool webkitGstCheckVersion(guint major, guint minor, guint micro) 33 { 34 guint currentMajor, currentMinor, currentMicro, currentNano; 35 gst_version(¤tMajor, ¤tMinor, ¤tMicro, ¤tNano); 36 37 if (currentMajor < major) 38 return false; 39 if (currentMajor > major) 40 return true; 41 42 if (currentMinor < minor) 43 return false; 44 if (currentMinor > minor) 45 return true; 46 47 if (currentMicro < micro) 48 return false; 49 50 return true; 51 } 52 32 53 void webkitGstObjectRefSink(GstObject*); 33 54 GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate*, const gchar* name, GstPad* target); -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
r152893 r154908 43 43 #include <wtf/text/CString.h> 44 44 45 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 46 #include "InbandTextTrackPrivateGStreamer.h" 47 #include "TextCombinerGStreamer.h" 48 #include "TextSinkGStreamer.h" 49 #endif 50 45 51 #ifdef GST_API_VERSION_1 46 52 #include <gst/audio/streamvolume.h> … … 132 138 return FALSE; 133 139 } 140 141 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 142 static void mediaPlayerPrivateTextChangedCallback(GObject*, MediaPlayerPrivateGStreamer* player) 143 { 144 player->textChanged(); 145 } 146 147 static gboolean mediaPlayerPrivateTextChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player) 148 { 149 // This is the callback of the timeout source created in ::textChanged. 150 player->notifyPlayerOfText(); 151 return FALSE; 152 } 153 154 static GstFlowReturn mediaPlayerPrivateNewTextSampleCallback(GObject*, MediaPlayerPrivateGStreamer* player) 155 { 156 player->newTextSample(); 157 return GST_FLOW_OK; 158 } 159 #endif 134 160 135 161 static void mediaPlayerPrivatePluginInstallerResultFunction(GstInstallPluginsReturn result, gpointer userData) … … 230 256 , m_hasAudio(false) 231 257 , m_audioTimerHandler(0) 258 , m_textTimerHandler(0) 232 259 , m_videoTimerHandler(0) 233 260 , m_webkitAudioSink(0) … … 241 268 MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer() 242 269 { 270 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 271 for (size_t i = 0; i < m_textTracks.size(); ++i) 272 m_textTracks[i]->disconnect(); 273 #endif 243 274 if (m_fillTimer.isActive()) 244 275 m_fillTimer.stop(); … … 262 293 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateVideoChangedCallback), this); 263 294 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateAudioChangedCallback), this); 295 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 296 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateNewTextSampleCallback), this); 297 g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateTextChangedCallback), this); 298 #endif 264 299 265 300 gst_element_set_state(m_playBin.get(), GST_STATE_NULL); … … 275 310 if (m_audioTimerHandler) 276 311 g_source_remove(m_audioTimerHandler); 312 313 if (m_textTimerHandler) 314 g_source_remove(m_textTimerHandler); 277 315 } 278 316 … … 594 632 m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player); 595 633 } 634 635 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 636 void MediaPlayerPrivateGStreamer::textChanged() 637 { 638 if (m_textTimerHandler) 639 g_source_remove(m_textTimerHandler); 640 m_textTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateTextChangeTimeoutCallback), this); 641 } 642 643 void MediaPlayerPrivateGStreamer::notifyPlayerOfText() 644 { 645 m_textTimerHandler = 0; 646 647 gint numTracks = 0; 648 if (m_playBin) 649 g_object_get(m_playBin.get(), "n-text", &numTracks, NULL); 650 651 for (gint i = 0; i < numTracks; ++i) { 652 GstPad* pad; 653 g_signal_emit_by_name(m_playBin.get(), "get-text-pad", i, &pad, NULL); 654 ASSERT(pad); 655 656 if (i < static_cast<gint>(m_textTracks.size())) { 657 RefPtr<InbandTextTrackPrivateGStreamer> existingTrack = m_textTracks[i]; 658 existingTrack->setIndex(i); 659 if (existingTrack->pad() == pad) { 660 gst_object_unref(pad); 661 continue; 662 } 663 } 664 665 RefPtr<InbandTextTrackPrivateGStreamer> track = InbandTextTrackPrivateGStreamer::create(i, adoptGRef(pad)); 666 m_textTracks.insert(i, track); 667 m_player->addTextTrack(track.release()); 668 } 669 670 while (static_cast<gint>(m_textTracks.size()) > numTracks) { 671 RefPtr<InbandTextTrackPrivateGStreamer> track = m_textTracks.last(); 672 track->disconnect(); 673 m_textTracks.removeLast(); 674 m_player->removeTextTrack(track.release()); 675 } 676 } 677 678 void MediaPlayerPrivateGStreamer::newTextSample() 679 { 680 if (!m_textAppSink) 681 return; 682 683 GRefPtr<GstEvent> streamStartEvent = adoptGRef( 684 gst_pad_get_sticky_event(m_textAppSinkPad.get(), GST_EVENT_STREAM_START, 0)); 685 686 GstSample* sample; 687 g_signal_emit_by_name(m_textAppSink.get(), "pull-sample", &sample, NULL); 688 ASSERT(sample); 689 690 if (streamStartEvent) { 691 bool found = FALSE; 692 const gchar* id; 693 gst_event_parse_stream_start(streamStartEvent.get(), &id); 694 for (size_t i = 0; i < m_textTracks.size(); ++i) { 695 RefPtr<InbandTextTrackPrivateGStreamer> track = m_textTracks[i]; 696 if (track->streamId() == id) { 697 track->handleSample(sample); 698 found = true; 699 break; 700 } 701 } 702 if (!found) 703 WARN_MEDIA_MESSAGE("Got sample with unknown stream ID."); 704 } else 705 WARN_MEDIA_MESSAGE("Unable to handle sample with no stream start event."); 706 gst_sample_unref(sample); 707 } 708 #endif 596 709 597 710 void MediaPlayerPrivateGStreamer::setRate(float rate) … … 1610 1723 g_signal_connect(m_playBin.get(), "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this); 1611 1724 g_signal_connect(m_playBin.get(), "audio-changed", G_CALLBACK(mediaPlayerPrivateAudioChangedCallback), this); 1725 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 1726 if (webkitGstCheckVersion(1, 1, 2)) { 1727 g_signal_connect(m_playBin.get(), "text-changed", G_CALLBACK(mediaPlayerPrivateTextChangedCallback), this); 1728 1729 GstElement* textCombiner = webkitTextCombinerNew(); 1730 ASSERT(textCombiner); 1731 g_object_set(m_playBin.get(), "text-stream-combiner", textCombiner, NULL); 1732 1733 m_textAppSink = webkitTextSinkNew(); 1734 ASSERT(m_textAppSink); 1735 1736 m_textAppSinkPad = adoptGRef(gst_element_get_static_pad(m_textAppSink.get(), "sink")); 1737 ASSERT(m_textAppSinkPad); 1738 1739 g_object_set(m_textAppSink.get(), "emit-signals", true, "enable-last-sample", false, "caps", gst_caps_new_empty_simple("text/vtt"), NULL); 1740 g_signal_connect(m_textAppSink.get(), "new-sample", G_CALLBACK(mediaPlayerPrivateNewTextSampleCallback), this); 1741 1742 g_object_set(m_playBin.get(), "text-sink", m_textAppSink.get(), NULL); 1743 } 1744 #endif 1612 1745 1613 1746 GstElement* videoElement = createVideoSink(m_playBin.get()); -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
r151797 r154908 39 39 40 40 namespace WebCore { 41 42 class InbandTextTrackPrivateGStreamer; 41 43 42 44 class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase { … … 91 93 void notifyPlayerOfAudio(); 92 94 95 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 96 void textChanged(); 97 void notifyPlayerOfText(); 98 99 void newTextSample(); 100 void notifyPlayerOfNewTextSample(); 101 #endif 102 93 103 void sourceChanged(); 94 104 GstElement* audioSink() const; … … 132 142 GRefPtr<GstElement> m_playBin; 133 143 GRefPtr<GstElement> m_source; 144 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 145 GRefPtr<GstElement> m_textAppSink; 146 GRefPtr<GstPad> m_textAppSinkPad; 147 #endif 134 148 float m_seekTime; 135 149 bool m_changingRate; … … 161 175 bool m_hasAudio; 162 176 guint m_audioTimerHandler; 177 guint m_textTimerHandler; 163 178 guint m_videoTimerHandler; 164 179 GRefPtr<GstElement> m_webkitAudioSink; … … 169 184 GRefPtr<GstElement> m_autoAudioSink; 170 185 bool m_missingPlugins; 186 #if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1) 187 Vector<RefPtr<InbandTextTrackPrivateGStreamer> > m_textTracks; 188 #endif 171 189 }; 172 190 }
Note: See TracChangeset
for help on using the changeset viewer.