Changeset 154908 in webkit


Ignore:
Timestamp:
Aug 30, 2013 1:17:27 PM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Source/WebCore: [GStreamer] support in-band text tracks
https://bugs.webkit.org/show_bug.cgi?id=103771

Patch by Brendan Long <b.long@cablelabs.com> on 2013-08-30
Reviewed by Eric Carlson.

Tests: New tests added because existing tests were too specific.

media/track/in-band/track-in-band-kate-ogg-cues-added-once.html
media/track/in-band/track-in-band-kate-ogg-kind.html
media/track/in-band/track-in-band-kate-ogg-language.html
media/track/in-band/track-in-band-kate-ogg-mode.html
media/track/in-band/track-in-band-kate-ogg-style.html
media/track/in-band/track-in-band-kate-ogg-track-order.html
media/track/in-band/track-in-band-srt-mkv-cues-added-once.html
media/track/in-band/track-in-band-srt-mkv-kind.html
media/track/in-band/track-in-band-srt-mkv-language.html
media/track/in-band/track-in-band-srt-mkv-mode.html
media/track/in-band/track-in-band-srt-mkv-style.html
media/track/in-band/track-in-band-srt-mkv-track-order.html

  • CMakeLists.txt: Add InbandTextTrackPrivateGStreamer, InbandGenericTextTrack, InbandWebVTTTextTrack, and TextCombinerGStreamer files.
  • GNUmakefile.list.am: Same.
  • PlatformEfl.cmake: Same.
  • Target.pri: Same.
  • WebCore.vcxproj/WebCore.vcxproj: Same.
  • WebCore.vcxproj/WebCore.vcxproj.filters: Same.
  • WebCore.xcodeproj/project.pbxproj: Same.
  • html/track/InbandGenericTextTrack.cpp: Split out code for handling generic cues.

(WebCore::GenericTextTrackCueMap::GenericTextTrackCueMap): Move from InbandTextTrack.
(WebCore::GenericTextTrackCueMap::~GenericTextTrackCueMap): Same.
(WebCore::GenericTextTrackCueMap::add): Same.
(WebCore::GenericTextTrackCueMap::find): Same.
(WebCore::GenericTextTrackCueMap::remove): Same.
(WebCore::InbandGenericTextTrack::create): Same.
(WebCore::InbandGenericTextTrack::updateCueFromCueData): Same.
(WebCore::InbandGenericTextTrack::addGenericCue): Same.
(WebCore::InbandGenericTextTrack::updateGenericCue): Same.
(WebCore::InbandGenericTextTrack::removeGenericCue): Same.
(WebCore::InbandGenericTextTrack::removeCue): Same.
(WebCore::InbandGenericTextTrack::InbandGenericTextTrack): Empty.
(WebCore::InbandGenericTextTrack::~InbandGenericTextTrack): Empty.

  • html/track/InbandGenericTextTrack.h: Copied from Source/WebCore/html/track/InbandTextTrack.h.

The only addition is the ASSERT_NOT_REACHED() for WebVTT cues.

  • html/track/InbandTextTrack.cpp: Add label and language changed callbacks.

(WebCore::InbandTextTrack::create): Return a generic or WebVTT text track based on the private CueFormat.
(WebCore::InbandTextTrack::labelChanged): Added.
(WebCore::InbandTextTrack::languageChanged): Added.

  • html/track/InbandTextTrack.h: Add label and language changed callbacks.
  • html/track/InbandWebVTTTextTrack.cpp: Added, based on InbandTextTrack.

(WebCore::InbandWebVTTTextTrack::create): Same.
(WebCore::InbandWebVTTTextTrack::InbandWebVTTTextTrack): Empty.
(WebCore::InbandWebVTTTextTrack::~InbandWebVTTTextTrack): Empty.
(WebCore::InbandWebVTTTextTrack::parseWebVTTCueData): Sends data to a WebVTTParser.
(WebCore::InbandWebVTTTextTrack::newCuesParsed): Adds cues when WebVTTParser parses them.
(WebCore::InbandWebVTTTextTrack::fileFailedToParse): Prints a warning when WebVTTParser has a problem.

  • html/track/InbandWebVTTTextTrack.h: Added.
  • platform/graphics/InbandTextTrackPrivate.h:

(WebCore::InbandTextTrackPrivate::cueFormat): For determining if the track will have generic or WebVTT cues.
(WebCore::InbandTextTrackPrivate::InbandTextTrackPrivate): Pass CueFormat in the constructor.

  • platform/graphics/InbandTextTrackPrivateClient.h: Same.
  • platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp:

(WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF): Pass CueFormat (Generic) to InbandTextTrackPrivate.

  • platform/graphics/gstreamer/GRefPtrGStreamer.cpp: Add GRefPtr specializations for GstSample and GstEvent.
  • platform/graphics/gstreamer/GRefPtrGStreamer.h: Same.
  • platform/graphics/gstreamer/GStreamerUtilities.h: Add WARN_MEDIA_MESSAGE.
  • platform/graphics/gstreamer/GStreamerVersioning.h: Add a function to check GStreamer version at runtime.
  • platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp: Added.

(WebCore::textTrackPrivateEventCallback): Watches for tag and stream start events.
(WebCore::textTrackPrivateSampleTimeoutCallback): See notifyTrackOfSample();
(WebCore::textTrackPrivateStreamTimeoutCallback): See notifyTrackOfStreamChanged();
(WebCore::textTrackPrivateTagsChangeTimeoutCallback): See notifyTrackOfTagsChanged();
(WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer): Initializes tags and stream and sets up event callback.
(WebCore::InbandTextTrackPrivateGStreamer::~InbandTextTrackPrivateGStreamer): Calls disconnect:
(WebCore::InbandTextTrackPrivateGStreamer::disconnect): Removes signal handlers and frees some memory.
(WebCore::InbandTextTrackPrivateGStreamer::handleSample): Adds samples to a list and sets up callback.
(WebCore::InbandTextTrackPrivateGStreamer::streamChanged): Sets up callback.
(WebCore::InbandTextTrackPrivateGStreamer::tagsChanged): Same.
(WebCore::InbandTextTrackPrivateGStreamer::notifyTrackOfSample): Parses all queued samples with WebVTTParser.
(WebCore::InbandTextTrackPrivateGStreamer::notifyTrackOfStreamChanged): Keeps track of current stream.
(WebCore::InbandTextTrackPrivateGStreamer::notifyTrackOfTagsChanged): Sets label and language from tags.

  • platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h: Added.

(WebCore::InbandTextTrackPrivateGStreamer::create): Basic RefPtr create function.
(WebCore::InbandTextTrackPrivateGStreamer::pad): Returns the pad this track is associated with (used
to determine if a playbin text stream has already been associated with a text track).
(WebCore::InbandTextTrackPrivateGStreamer::setIndex): Sets the track index (used for sorting).
(WebCore::InbandTextTrackPrivateGStreamer::streamId): Returns the stream ID (used to handle new samples).

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:

(WebCore::mediaPlayerPrivateTextChangedCallback): Called for playbin "text-changed" event. See textChanged().
(WebCore::mediaPlayerPrivateTextChangeTimeoutCallback): See notifyPlayerOfText().
(WebCore::mediaPlayerPrivateNewTextSampleCallback): See newTextSample().
(WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): Initialize m_textTimerHandler.
(WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): Disconnect text tracks (they don't necessarily
get freed here, since a script could hold a reference).
(WebCore::MediaPlayerPrivateGStreamer::textChanged): Setup callback for notifyPlayerOfText.
(WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfText): Create text tracks.
(WebCore::MediaPlayerPrivateGStreamer::newTextSample): Handle new samples by giving them to a text track
with a matching stream. This method is syncryonous because we need to get the stream start sticky event
immediately.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
  • platform/graphics/gstreamer/TextCombinerGStreamer.cpp: Added. This element forwards buffers from all

of its input pads, but also converts plain text to WebVTT as needed.
(webkit_text_combiner_init): Setup internal funnel.
(webkitTextCombinerPadEvent): If the caps are plain text make sure we have a webvttenv, otherwise connect
directly to the funnel.
(webkitTextCombinerRequestNewPad): Setup ghostpad and event callback.
(webkitTextCombinerReleasePad): Release pad and optional associated webvttenc.
(webkit_text_combiner_class_init): Setup pad templates and request/release pad functions.
(webkitTextCombinerNew): Returns a new WebKitTextCombiner.

  • platform/graphics/gstreamer/TextCombinerGStreamer.h: Added.
  • platform/graphics/gstreamer/TextSinkGStreamer.cpp: Added.

(webkit_text_sink_init): Set sync=false.
(webkitTextSinkGetProperty): Ignore sync property.
(webkitTextSinkSetProperty): Same.
(webkitTextSinkQuery): Ignore position and duration queries, forward everything else to appsink.
(webkit_text_sink_class_init): Setup property and query functions.
(webkitTextSinkNew): Return a new WebKitTextSink.

  • platform/graphics/gstreamer/TextSinkGStreamer.h: Added.

LayoutTests: <https://webkit.org/b/103771> [GStreamer] support in-band text tracks

Patch by Brendan Long <b.long@cablelabs.com> on 2013-08-30
Reviewed by Eric Carlson.

  • media/content/counting-subtitled-kate.ogv: Added.
  • media/content/counting-subtitled-srt.mkv: Added.
  • media/in-band-cues.js: Added.
  • media/track/in-band/track-in-band-kate-ogg-cues-added-once-expected.txt: Added.
  • media/track/in-band/track-in-band-kate-ogg-cues-added-once.html: Added.
  • media/track/in-band/track-in-band-kate-ogg-kind-expected.txt: Added.
  • media/track/in-band/track-in-band-kate-ogg-kind.html: Added.
  • media/track/in-band/track-in-band-kate-ogg-language-expected.txt: Added.
  • media/track/in-band/track-in-band-kate-ogg-language.html: Added.
  • media/track/in-band/track-in-band-kate-ogg-mode-expected.txt: Added.
  • media/track/in-band/track-in-band-kate-ogg-mode.html: Added.
  • media/track/in-band/track-in-band-kate-ogg-style-expected.txt: Added.
  • media/track/in-band/track-in-band-kate-ogg-style.html: Added.
  • media/track/in-band/track-in-band-kate-ogg-track-order-expected.txt: Added.
  • media/track/in-band/track-in-band-kate-ogg-track-order.html: Added.
  • media/track/in-band/track-in-band-srt-mkv-cues-added-once-expected.txt: Added.
  • media/track/in-band/track-in-band-srt-mkv-cues-added-once.html: Added.
  • media/track/in-band/track-in-band-srt-mkv-kind-expected.txt: Added.
  • media/track/in-band/track-in-band-srt-mkv-kind.html: Added.
  • media/track/in-band/track-in-band-srt-mkv-language-expected.txt: Added.
  • media/track/in-band/track-in-band-srt-mkv-language.html: Added.
  • media/track/in-band/track-in-band-srt-mkv-mode-expected.txt: Added.
  • media/track/in-band/track-in-band-srt-mkv-mode.html: Added.
  • media/track/in-band/track-in-band-srt-mkv-style-expected.txt: Added.
  • media/track/in-band/track-in-band-srt-mkv-style.html: Added.
  • media/track/in-band/track-in-band-srt-mkv-track-order-expected.txt: Added.
  • media/track/in-band/track-in-band-srt-mkv-track-order.html: Added.
  • platform/mac/TestExpectations: Skip MKV and OGG tests.
Location:
trunk
Files:
37 added
22 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r154907 r154908  
     12013-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
    1362013-08-30  Joseph Pecoraro  <pecoraro@apple.com>
    237
  • trunk/LayoutTests/platform/mac/TestExpectations

    r154860 r154908  
    13011301
    13021302webkit.org/b/120387 svg/animations/svglengthlist-animation-3.html [ Pass Failure ]
     1303
     1304# Don't run ogv and mkv tests on mac
     1305media/track/in-band [ WontFix ]
  • trunk/Source/WebCore/CMakeLists.txt

    r154904 r154908  
    27112711        html/track/AudioTrack.cpp
    27122712        html/track/AudioTrackList.cpp
     2713        html/track/InbandGenericTextTrack.cpp
    27132714        html/track/InbandTextTrack.cpp
     2715        html/track/InbandWebVTTTextTrack.cpp
    27142716        html/track/LoadableTextTrack.cpp
    27152717        html/track/TextTrack.cpp
  • trunk/Source/WebCore/ChangeLog

    r154906 r154908  
     12013-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
    11202013-08-30  Dirk Schulze  <krit@webkit.org>
    2121
  • trunk/Source/WebCore/GNUmakefile.list.am

    r154904 r154908  
    37263726        Source/WebCore/html/track/AudioTrackList.cpp \
    37273727        Source/WebCore/html/track/AudioTrackList.h \
     3728        Source/WebCore/html/track/InbandGenericTextTrack.cpp \
     3729        Source/WebCore/html/track/InbandGenericTextTrack.h \
    37283730        Source/WebCore/html/track/InbandTextTrack.cpp \
    37293731        Source/WebCore/html/track/InbandTextTrack.h \
     3732        Source/WebCore/html/track/InbandWebVTTTextTrack.cpp \
     3733        Source/WebCore/html/track/InbandWebVTTTextTrack.h \
    37303734        Source/WebCore/html/track/LoadableTextTrack.cpp \
    37313735        Source/WebCore/html/track/LoadableTextTrack.h \
     
    63286332        Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h \
    63296333        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
     6339webcore_platform_sources += \
     6340        Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp \
     6341        Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h
    63316342endif
    63326343
  • trunk/Source/WebCore/PlatformEfl.cmake

    r154262 r154908  
    124124    platform/graphics/gstreamer/GStreamerVersioning.cpp
    125125    platform/graphics/gstreamer/ImageGStreamerCairo.cpp
     126    platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp
    126127    platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp
    127128    platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
    128129    platform/graphics/gstreamer/PlatformVideoWindowEfl.cpp
     130    platform/graphics/gstreamer/TextCombinerGStreamer.cpp
     131    platform/graphics/gstreamer/TextSinkGStreamer.cpp
    129132    platform/graphics/gstreamer/VideoSinkGStreamer.cpp
    130133    platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
  • trunk/Source/WebCore/Target.pri

    r154904 r154908  
    33343334            platform/graphics/gstreamer/PlatformVideoWindowQt.cpp \
    33353335            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        }
    33363346
    33373347    } else:use?(QT_MULTIMEDIA) {
     
    39033913        html/track/AudioTrack.h \
    39043914        html/track/AudioTrackList.h \
     3915        html/track/InbandGenericTextTrack.h \
    39053916        html/track/InbandTextTrack.h \
     3917        html/track/InbandWebVTTTextTrack.h \
    39063918        html/track/LoadableTextTrack.h \
    39073919        html/track/TextTrack.h \
     
    39373949        html/track/AudioTrack.cpp \
    39383950        html/track/AudioTrackList.cpp \
     3951        html/track/InbandGenericTextTrack.cpp \
    39393952        html/track/InbandTextTrack.cpp \
     3953        html/track/InbandWebVTTTextTrack.cpp \
    39403954        html/track/LoadableTextTrack.cpp \
    39413955        html/track/TextTrack.cpp \
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r154904 r154908  
    1563115631    <ClCompile Include="..\html\shadow\SpinButtonElement.cpp" />
    1563215632    <ClCompile Include="..\html\shadow\TextControlInnerElements.cpp" />
     15633    <ClCompile Include="..\html\track\InbandGenericTextTrack.cpp" />
    1563315634    <ClCompile Include="..\html\track\InbandTextTrack.cpp" />
     15635    <ClCompile Include="..\html\track\InbandWebVTTTextTrack.cpp" />
    1563415636    <ClCompile Include="..\html\track\LoadableTextTrack.cpp" />
    1563515637    <ClCompile Include="..\html\track\TextTrack.cpp" />
     
    2066120663    <ClInclude Include="..\html\shadow\SpinButtonElement.h" />
    2066220664    <ClInclude Include="..\html\shadow\TextControlInnerElements.h" />
     20665    <ClInclude Include="..\html\track\InbandGenericTextTrack.h" />
    2066320666    <ClInclude Include="..\html\track\InbandTextTrack.h" />
     20667    <ClInclude Include="..\html\track\InbandWebVTTTextTrack.h" />
    2066420668    <ClInclude Include="..\html\track\LoadableTextTrack.h" />
    2066520669    <ClInclude Include="..\html\track\TextTrack.h" />
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters

    r154904 r154908  
    43274327      <Filter>html\shadow</Filter>
    43284328    </ClCompile>
     4329    <ClCompile Include="..\html\track\InbandGenericTextTrack.cpp">
     4330      <Filter>html\track</Filter>
     4331    </ClCompile>
    43294332    <ClCompile Include="..\html\track\InbandTextTrack.cpp">
     4333      <Filter>html\track</Filter>
     4334    </ClCompile>
     4335    <ClCompile Include="..\html\track\InbandWebVTTTextTrack.cpp">
    43304336      <Filter>html\track</Filter>
    43314337    </ClCompile>
     
    1148111487      <Filter>html\shadow</Filter>
    1148211488    </ClInclude>
     11489    <ClInclude Include="..\html\track\InbandGenericTextTrack.h">
     11490      <Filter>html\track</Filter>
     11491    </ClInclude>
    1148311492    <ClInclude Include="..\html\track\InbandTextTrack.h">
     11493      <Filter>html\track</Filter>
     11494    </ClInclude>
     11495    <ClInclude Include="..\html\track\InbandWebVTTTextTrack.h">
    1148411496      <Filter>html\track</Filter>
    1148511497    </ClInclude>
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r154904 r154908  
    50425042                BCFF64910EAD15C200C1D6F7 /* LengthBox.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFF648F0EAD15C200C1D6F7 /* LengthBox.h */; settings = {ATTRIBUTES = (Private, ); }; };
    50435043                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 */; };
    50445048                BE6DF70B171CA2C500DD52B8 /* JSVideoTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE6DF708171CA2C500DD52B8 /* JSVideoTrackCustom.cpp */; };
    50455049                BE6DF70D171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BE6DF70A171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp */; };
     
    1172411728                BCFF648F0EAD15C200C1D6F7 /* LengthBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LengthBox.h; sourceTree = "<group>"; };
    1172511729                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>"; };
    1172611734                BE6DF708171CA2C500DD52B8 /* JSVideoTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSVideoTrackCustom.cpp; sourceTree = "<group>"; };
    1172711735                BE6DF70A171CA2C500DD52B8 /* JSVideoTrackListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSVideoTrackListCustom.cpp; sourceTree = "<group>"; };
     
    1759017598                                BE88E0D01715D2A200658D98 /* AudioTrackList.h */,
    1759117599                                BE88E0D11715D2A200658D98 /* AudioTrackList.idl */,
     17600                                BE16C58E17CFE17200852C04 /* InbandGenericTextTrack.cpp */,
     17601                                BE16C58F17CFE17200852C04 /* InbandGenericTextTrack.h */,
    1759217602                                0794178F166E855F009416C2 /* InbandTextTrack.cpp */,
    1759317603                                07941790166E855F009416C2 /* InbandTextTrack.h */,
     17604                                BE16C59017CFE17200852C04 /* InbandWebVTTTextTrack.cpp */,
     17605                                BE16C59117CFE17200852C04 /* InbandWebVTTTextTrack.h */,
    1759417606                                9759E93414EF1CF80026A2DD /* LoadableTextTrack.cpp */,
    1759517607                                9759E94814EF1D490026A2DD /* LoadableTextTrack.h */,
     
    2396223974                                FD1762E4176686EA00D836A8 /* DownSampler.h in Headers */,
    2396323975                                FBB0C5B817BBD629003D3677 /* CSSFilterImageValue.h in Headers */,
     23976                                BE16C59317CFE17200852C04 /* InbandGenericTextTrack.h in Headers */,
     23977                                BE16C59517CFE17200852C04 /* InbandWebVTTTextTrack.h in Headers */,
    2396423978                        );
    2396523979                        runOnlyForDeploymentPostprocessing = 0;
     
    2692626940                                6E84E9E017668BEE00815B68 /* RasterShape.cpp in Sources */,
    2692726941                                FBB0C5B717BBD626003D3677 /* CSSFilterImageValue.cpp in Sources */,
     26942                                BE16C59217CFE17200852C04 /* InbandGenericTextTrack.cpp in Sources */,
     26943                                BE16C59417CFE17200852C04 /* InbandWebVTTTextTrack.cpp in Sources */,
    2692826944                        );
    2692926945                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r154877 r154908  
    101101#include "CaptionUserPreferences.h"
    102102#include "HTMLTrackElement.h"
     103#include "InbandGenericTextTrack.h"
    103104#include "InbandTextTrack.h"
    104105#include "InbandTextTrackPrivate.h"
     106#include "InbandWebVTTTextTrack.h"
    105107#include "RuntimeEnabledFeatures.h"
    106108#include "TextTrackCueList.h"
  • trunk/Source/WebCore/html/track/InbandGenericTextTrack.h

    r154907 r154908  
    2424 */
    2525
    26 #ifndef InbandTextTrack_h
    27 #define InbandTextTrack_h
     26#ifndef InbandGenericTextTrack_h
     27#define InbandGenericTextTrack_h
    2828
    2929#if ENABLE(VIDEO_TRACK)
    3030
    31 #include "InbandTextTrackPrivateClient.h"
    32 #include "TextTrack.h"
     31#include "InbandTextTrack.h"
    3332#include "TextTrackCueGeneric.h"
    3433#include <wtf/RefPtr.h>
     
    3938class InbandTextTrackPrivate;
    4039class TextTrackCue;
    41 class WebVTTCueData;
    4240
    43 class TextTrackCueMap {
     41class GenericTextTrackCueMap {
    4442public:
    45     TextTrackCueMap();
    46     virtual ~TextTrackCueMap();
     43    GenericTextTrackCueMap();
     44    virtual ~GenericTextTrackCueMap();
    4745
    4846    void add(GenericCueData*, TextTrackCueGeneric*);
    49     void add(WebVTTCueData*, TextTrackCue*);
    5047
    5148    void remove(TextTrackCue*);
    5249    void remove(GenericCueData*);
    53     void remove(WebVTTCueData*);
    5450
    55     PassRefPtr<GenericCueData> findGenericData(TextTrackCue*);
    56     PassRefPtr<WebVTTCueData> findWebVTTData(TextTrackCue*);
     51    PassRefPtr<GenericCueData> find(TextTrackCue*);
    5752    PassRefPtr<TextTrackCueGeneric> find(GenericCueData*);
    58     PassRefPtr<TextTrackCue> find(WebVTTCueData*);
    59    
     53
    6054private:
    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;
    6557
    66     GenericCueToDataMap* m_genericCueToDataMap;
    67     GenericCueDataToCueMap* m_genericDataToCueMap;
    68     WebVTTCueToDataMap* m_webVTTCueToDataMap;
    69     WebVTTCueDataToCueMap* m_webVTTDataToCueMap;
     58    CueToDataMap m_cueToDataMap;
     59    CueDataToCueMap m_dataToCueMap;
    7060};
    7161
    72 class InbandTextTrack : public TextTrack, public InbandTextTrackPrivateClient {
     62class InbandGenericTextTrack : public InbandTextTrack {
    7363public:
    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();
    8466
    8567private:
    86     InbandTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
     68    InbandGenericTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
    8769
    8870    virtual void addGenericCue(InbandTextTrackPrivate*, PassRefPtr<GenericCueData>) OVERRIDE;
    8971    virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE;
    9072    virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) OVERRIDE;
    91     virtual void addWebVTTCue(InbandTextTrackPrivate*, PassRefPtr<WebVTTCueData>) OVERRIDE;
    92     virtual void removeWebVTTCue(InbandTextTrackPrivate*, WebVTTCueData*) OVERRIDE;
    9373    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(); }
    9576
    9677    PassRefPtr<TextTrackCueGeneric> createCue(PassRefPtr<GenericCueData>);
    9778    void updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*);
    9879
    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;
    10581};
    10682
  • trunk/Source/WebCore/html/track/InbandTextTrack.cpp

    r152741 r154908  
    3434#include "ExceptionCodePlaceholder.h"
    3535#include "HTMLMediaElement.h"
     36#include "InbandGenericTextTrack.h"
    3637#include "InbandTextTrackPrivate.h"
     38#include "InbandWebVTTTextTrack.h"
    3739#include "Logging.h"
    3840#include "TextTrackCueGeneric.h"
     
    4446namespace WebCore {
    4547
    46 TextTrackCueMap::TextTrackCueMap()
    47     : m_genericCueToDataMap(0)
    48     , m_genericDataToCueMap(0)
    49     , m_webVTTCueToDataMap(0)
    50     , m_webVTTDataToCueMap(0)
     48PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context,
     49    TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate)
    5150{
    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();
    10058        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         }
    16659    }
    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));
    19360}
    19461
     
    290157}
    291158
    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)
     159void InbandTextTrack::labelChanged(InbandTextTrackPrivate* trackPrivate, const String& label)
    332160{
    333161    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);
    350163}
    351164
    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)
     165void InbandTextTrack::languageChanged(InbandTextTrackPrivate* trackPrivate, const String& language)
    375166{
    376167    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);
    404169}
    405170
  • trunk/Source/WebCore/html/track/InbandTextTrack.h

    r152741 r154908  
    3636namespace WebCore {
    3737
    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 
    7238class InbandTextTrack : public TextTrack, public InbandTextTrackPrivateClient {
    7339public:
     
    8349    size_t inbandTrackIndex();
    8450
    85 private:
     51protected:
    8652    InbandTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
    8753
    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
     56private:
     57
    9458    virtual void willRemoveTextTrackPrivate(InbandTextTrackPrivate*) OVERRIDE;
    9559
    96     PassRefPtr<TextTrackCueGeneric> createCue(PassRefPtr<GenericCueData>);
    97     void updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*);
     60    virtual void labelChanged(InbandTextTrackPrivate*, const String& label) OVERRIDE;
     61    virtual void languageChanged(InbandTextTrackPrivate*, const String& language) OVERRIDE;
    9862
    9963#if USE(PLATFORM_TEXT_TRACK_MENU)
    10064    virtual InbandTextTrackPrivate* privateTrack() OVERRIDE { return m_private.get(); }
    10165#endif
    102 
    103     TextTrackCueMap m_cueMap;
    104     RefPtr<InbandTextTrackPrivate> m_private;
    10566};
    10667
  • trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivate.h

    r151697 r154908  
    4040    WTF_MAKE_NONCOPYABLE(InbandTextTrackPrivate); WTF_MAKE_FAST_ALLOCATED;
    4141public:
    42     static PassRefPtr<InbandTextTrackPrivate> create()
    43     {
    44         return adoptRef(new InbandTextTrackPrivate());
    45     }
    4642    virtual ~InbandTextTrackPrivate() { }
    4743
     
    7975    virtual int textTrackIndex() const { return 0; }
    8076
     77    enum CueFormat {
     78        Generic,
     79        WebVTT
     80    };
     81    CueFormat cueFormat() const { return m_format; }
     82
    8183    void willBeRemoved()
    8284    {
     
    8688
    8789protected:
    88     InbandTextTrackPrivate()
    89         : m_client(0)
     90    InbandTextTrackPrivate(CueFormat format)
     91        : m_format(format)
     92        , m_client(0)
    9093        , m_mode(Disabled)
    9194    {
     
    9396
    9497private:
     98    CueFormat m_format;
    9599    InbandTextTrackPrivateClient* m_client;
    96100    Mode m_mode;
  • trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h

    r152741 r154908  
    140140    virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0;
    141141
    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;
    144146
    145147    virtual void willRemoveTextTrackPrivate(InbandTextTrackPrivate*) = 0;
  • trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp

    r153758 r154908  
    9898
    9999InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF(AVFInbandTrackParent* owner)
    100     : m_owner(owner)
     100    : InbandTextTrackPrivate(Generic)
     101    , m_owner(owner)
    101102    , m_pendingCueStatus(None)
    102103    , m_index(0)
  • trunk/Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.cpp

    r139896 r154908  
    184184        gst_buffer_unref(ptr);
    185185}
     186
     187#ifdef GST_API_VERSION_1
     188template<> GRefPtr<GstSample> adoptGRef(GstSample* ptr)
     189{
     190    return GRefPtr<GstSample>(ptr, GRefPtrAdopt);
     191}
     192
     193template<> GstSample* refGPtr<GstSample>(GstSample* ptr)
     194{
     195    if (ptr)
     196        gst_sample_ref(ptr);
     197
     198    return ptr;
     199}
     200
     201template<> void derefGPtr<GstSample>(GstSample* ptr)
     202{
     203    if (ptr)
     204        gst_sample_unref(ptr);
     205}
     206#endif
     207
     208template<> GRefPtr<GstEvent> adoptGRef(GstEvent* ptr)
     209{
     210    return GRefPtr<GstEvent>(ptr, GRefPtrAdopt);
     211}
     212
     213template<> GstEvent* refGPtr<GstEvent>(GstEvent* ptr)
     214{
     215    if (ptr)
     216        gst_event_ref(ptr);
     217
     218    return ptr;
     219}
     220
     221template<> void derefGPtr<GstEvent>(GstEvent* ptr)
     222{
     223    if (ptr)
     224        gst_event_unref(ptr);
     225}
    186226}
    187227#endif // USE(GSTREAMER)
  • trunk/Source/WebCore/platform/graphics/gstreamer/GRefPtrGStreamer.h

    r139896 r154908  
    3232typedef struct _GstElementFactory GstElementFactory;
    3333typedef struct _GstBuffer GstBuffer;
     34#ifdef GST_API_VERSION_1
     35typedef struct _GstSample GstSample;
     36#endif
     37typedef struct _GstEvent GstEvent;
    3438
    3539namespace WTF {
     
    6670template<> GstBuffer* refGPtr<GstBuffer>(GstBuffer* ptr);
    6771template<> void derefGPtr<GstBuffer>(GstBuffer* ptr);
     72
     73#ifdef GST_API_VERSION_1
     74template<> GRefPtr<GstSample> adoptGRef(GstSample* ptr);
     75template<> GstSample* refGPtr<GstSample>(GstSample* ptr);
     76template<> void derefGPtr<GstSample>(GstSample* ptr);
     77#endif
     78
     79template<> GRefPtr<GstEvent> adoptGRef(GstEvent* ptr);
     80template<> GstEvent* refGPtr<GstEvent>(GstEvent* ptr);
     81template<> void derefGPtr<GstEvent>(GstEvent* ptr);
    6882}
    6983
  • trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerUtilities.h

    r150524 r154908  
    2929    LOG_VERBOSE(Media, __VA_ARGS__); } while (0)
    3030
     31#define WARN_MEDIA_MESSAGE(...) do { \
     32    GST_WARNING(__VA_ARGS__); \
     33    LOG_VERBOSE(Media, __VA_ARGS__); } while (0)
     34
    3135namespace WebCore {
    3236bool initializeGStreamer();
  • trunk/Source/WebCore/platform/graphics/gstreamer/GStreamerVersioning.h

    r141821 r154908  
    3030};
    3131
     32inline bool webkitGstCheckVersion(guint major, guint minor, guint micro)
     33{
     34    guint currentMajor, currentMinor, currentMicro, currentNano;
     35    gst_version(&currentMajor, &currentMinor, &currentMicro, &currentNano);
     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
    3253void webkitGstObjectRefSink(GstObject*);
    3354GstPad* webkitGstGhostPadFromStaticTemplate(GstStaticPadTemplate*, const gchar* name, GstPad* target);
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r152893 r154908  
    4343#include <wtf/text/CString.h>
    4444
     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
    4551#ifdef GST_API_VERSION_1
    4652#include <gst/audio/streamvolume.h>
     
    132138    return FALSE;
    133139}
     140
     141#if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1)
     142static void mediaPlayerPrivateTextChangedCallback(GObject*, MediaPlayerPrivateGStreamer* player)
     143{
     144    player->textChanged();
     145}
     146
     147static 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
     154static GstFlowReturn mediaPlayerPrivateNewTextSampleCallback(GObject*, MediaPlayerPrivateGStreamer* player)
     155{
     156    player->newTextSample();
     157    return GST_FLOW_OK;
     158}
     159#endif
    134160
    135161static void mediaPlayerPrivatePluginInstallerResultFunction(GstInstallPluginsReturn result, gpointer userData)
     
    230256    , m_hasAudio(false)
    231257    , m_audioTimerHandler(0)
     258    , m_textTimerHandler(0)
    232259    , m_videoTimerHandler(0)
    233260    , m_webkitAudioSink(0)
     
    241268MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer()
    242269{
     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
    243274    if (m_fillTimer.isActive())
    244275        m_fillTimer.stop();
     
    262293        g_signal_handlers_disconnect_by_func(m_playBin.get(), reinterpret_cast<gpointer>(mediaPlayerPrivateVideoChangedCallback), this);
    263294        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
    264299
    265300        gst_element_set_state(m_playBin.get(), GST_STATE_NULL);
     
    275310    if (m_audioTimerHandler)
    276311        g_source_remove(m_audioTimerHandler);
     312
     313    if (m_textTimerHandler)
     314        g_source_remove(m_textTimerHandler);
    277315}
    278316
     
    594632    m_player->mediaPlayerClient()->mediaPlayerEngineUpdated(m_player);
    595633}
     634
     635#if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1)
     636void 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
     643void 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
     678void 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
    596709
    597710void MediaPlayerPrivateGStreamer::setRate(float rate)
     
    16101723    g_signal_connect(m_playBin.get(), "video-changed", G_CALLBACK(mediaPlayerPrivateVideoChangedCallback), this);
    16111724    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
    16121745
    16131746    GstElement* videoElement = createVideoSink(m_playBin.get());
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r151797 r154908  
    3939
    4040namespace WebCore {
     41
     42class InbandTextTrackPrivateGStreamer;
    4143
    4244class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateGStreamerBase {
     
    9193    void notifyPlayerOfAudio();
    9294
     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
    93103    void sourceChanged();
    94104    GstElement* audioSink() const;
     
    132142    GRefPtr<GstElement> m_playBin;
    133143    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
    134148    float m_seekTime;
    135149    bool m_changingRate;
     
    161175    bool m_hasAudio;
    162176    guint m_audioTimerHandler;
     177    guint m_textTimerHandler;
    163178    guint m_videoTimerHandler;
    164179    GRefPtr<GstElement> m_webkitAudioSink;
     
    169184    GRefPtr<GstElement> m_autoAudioSink;
    170185    bool m_missingPlugins;
     186#if ENABLE(VIDEO_TRACK) && defined(GST_API_VERSION_1)
     187    Vector<RefPtr<InbandTextTrackPrivateGStreamer> > m_textTracks;
     188#endif
    171189};
    172190}
Note: See TracChangeset for help on using the changeset viewer.