Changeset 137161 in webkit


Ignore:
Timestamp:
Dec 10, 2012 8:19:56 AM (11 years ago)
Author:
eric.carlson@apple.com
Message:

Add support for in-band text tracks to Mac port
https://bugs.webkit.org/show_bug.cgi?id=103663

Reviewed by Sam Weinig.

Source/WebCore:

Test: media/track/track-in-band.html

  • GNUmakefile.list.am: Move InbandTextTrackPrivate.h to platform/graphics. Add InbandTextTrackPrivateClient.h.
  • Target.pri: Ditto.
  • WebCore.gypi: Ditto.
  • WebCore.xcodeproj/project.pbxproj: Add new files.
  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::setReadyState): No need to call processInbandTextTracks, in-band tracks

are now registered by the media engine as they are discovered.

(WebCore::HTMLMediaElement::mediaPlayerDidAddTrack): New, called by the media player when a new

in-band track is found.

(WebCore::HTMLMediaElement::mediaPlayerDidRemoveTrack): New, called by the media player when an

in-band track goes away.

  • html/HTMLMediaElement.h:
  • html/track/InbandTextTrack.cpp:

(WebCore::InbandTextTrack::InbandTextTrack): Use m_private instead of tracksPrivate because

it is zeroed during assignment.

  • platform/graphics/MediaPlayer.cpp:

(WebCore::MediaPlayer::addTextTrack): New MediaPlayerClient method to allow MediaPlayerPrivate subclasses

to add a new in-band track.

(WebCore::MediaPlayer::removeTextTrack): New MediaPlayerClient method to allow MediaPlayerPrivate subclasses

to remove a new in-band track.

  • platform/graphics/MediaPlayer.h:
  • platform/graphics/MediaPlayerPrivate.h:
  • platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp: Added.

(WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF):
(WebCore::InbandTextTrackPrivateAVF::~InbandTextTrackPrivateAVF):
(WebCore::InbandTextTrackPrivateAVF::processCueAttributes): Convert an attribute string into WebVTT

cue setting and content strings.

(WebCore::InbandTextTrackPrivateAVF::processCue): Process a new cue.
(WebCore::InbandTextTrackPrivateAVF::disconnect): Clear member variables.
(WebCore::InbandTextTrackPrivateAVF::resetCueValues): Reset cue values to defaults.
(WebCore::InbandTextTrackPrivateAVF::setMode): Set track mode and call player's trackModeChanged.

  • platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h: Added.
  • platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: Initialize

m_inbandTrackConfigurationPending.

(WebCore::MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation):
(WebCore::MediaPlayerPrivateAVFoundation::seekCompleted): Flush the currently accumulating

cue so it doesn't get the wrong duration.

(WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification): Handle InbandTracksNeedConfiguration.
(WebCore::MediaPlayerPrivateAVFoundation::flushCurrentCue): New, pass the current cue up to the client.
(WebCore::MediaPlayerPrivateAVFoundation::configureInbandTracks): Configure in-band tracks.
(WebCore::MediaPlayerPrivateAVFoundation::trackModeChanged): Schedule a call to configureInbandTracks.

  • platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
  • platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h: Added.
  • platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm: Added.

(WebCore::InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC):
(WebCore::InbandTextTrackPrivateAVFObjC::disconnect):
(WebCore::InbandTextTrackPrivateAVFObjC::kind): Return track kind.
(WebCore::InbandTextTrackPrivateAVFObjC::label): Return track label.
(WebCore::InbandTextTrackPrivateAVFObjC::language): Return track language.
(WebCore::InbandTextTrackPrivateAVFObjC::isDefault):

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:

(MediaPlayerPrivateAVFoundationObjC):
(WebCore::MediaPlayerPrivateAVFoundationObjC::playerItem):

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::MediaPlayerPrivateAVFoundationObjC::MediaPlayerPrivateAVFoundationObjC): Initialize m_currentTrack.
(WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Clear m_legibleOutput.
(WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Create and initialize m_legibleOutput.
(WebCore::MediaPlayerPrivateAVFoundationObjC::processTextTracks): Called when the player item's

"tracks" changes, add and remove in-band text tracks as necessary.

(WebCore::MediaPlayerPrivateAVFoundationObjC::processCue): Pass an attributed string to the current

track to be processed.

(WebCore::MediaPlayerPrivateAVFoundationObjC::setCurrentTrack): Tell AVFoundation to select an in-band track.
(WebCore::MediaPlayerPrivateAVFoundationObjC::currentTrack): Return the current track.
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]): Legible

output delegate.

Source/WTF:

  • wtf/Platform.h: Define HAVE_AVFOUNDATION_TEXT_TRACK_SUPPORT.

LayoutTests:

Test for initial support for in-band text tracks. New test skipped on all ports that don't
have support in the media engine.

  • media/content/counting-subtitled.m4v: Added.
  • media/track/track-in-band-expected.txt: Added.
  • media/track/track-in-band.html: Added.
  • platform/chromium/TestExpectations:
  • platform/efl/TestExpectations:
  • platform/gtk/TestExpectations:
  • platform/mac/TestExpectations:
  • platform/qt/TestExpectations:
  • platform/win/TestExpectations:
Location:
trunk
Files:
8 added
25 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r137156 r137161  
     12012-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Add support for in-band text tracks to Mac port
     4        https://bugs.webkit.org/show_bug.cgi?id=103663
     5
     6        Reviewed by Sam Weinig.
     7
     8        Test for initial support for in-band text tracks. New test skipped on all ports that don't
     9        have support in the media engine.
     10
     11        * media/content/counting-subtitled.m4v: Added.
     12        * media/track/track-in-band-expected.txt: Added.
     13        * media/track/track-in-band.html: Added.
     14        * platform/chromium/TestExpectations:
     15        * platform/efl/TestExpectations:
     16        * platform/gtk/TestExpectations:
     17        * platform/mac/TestExpectations:
     18        * platform/qt/TestExpectations:
     19        * platform/win/TestExpectations:
     20
    1212012-12-10  Ilya Tikhonovsky  <loislo@chromium.org>
    222
     
    79677987        * platform/chromium-mac/fast/forms/date/date-appearance-pseudo-classes-expected.png: Removed.
    79687988        * platform/chromium-win/fast/forms/date/date-appearance-pseudo-classes-expected.png: Removed.
     7989
    79697990        * platform/efl/TestExpectations:
    79707991        * platform/gtk/TestExpectations:
     
    79727993        * platform/qt/TestExpectations:
    79737994        * platform/win/TestExpectations:
    7974 
    797579952012-11-28  Tommy Widenflycht  <tommyw@google.com>
    79767996
  • trunk/LayoutTests/platform/chromium/TestExpectations

    r137156 r137161  
    42224222webkit.org/b/104473 [ Debug ] inspector/styles/import-pseudoclass-crash.html [ Crash ]
    42234223
     4224# No support for exposing in-band text tracks
     4225webkit.org/b/103767  [ Win Mac Linux ] media/track/track-in-band.html [ Skip ]
     4226
    42244227# Flaky on Win (perhaps due to lighttpd?)
    42254228webkit.org/b/104489 [ Win ] http/tests/w3c/webperf/submission/resource-timing/html/test_resource_attribute_order.html [ Failure Pass ]
  • trunk/LayoutTests/platform/efl/TestExpectations

    r137150 r137161  
    16611661Bug(EFL) editing/spelling/context-menu-suggestions.html [ Failure ]
    16621662
     1663# No support for exposing in-band text tracks
     1664Bug(EFL) media/track/track-in-band.html [ Skip ]
     1665
    16631666# Newly added test in r136225 fails on GTK bot too.
    16641667webkit.org/b/103740 editing/selection/caret-alignment-for-vertical-text.html [ Failure ]
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r137153 r137161  
    14231423webkit.org/b/104493 svg/custom/text-xy-updates-SVGList.xhtml [ Failure ]
    14241424
     1425# No support for exposing in-band text tracks
     1426webkit.org/b/103771 media/track/track-in-band.html [ Skip ]
     1427
    14251428#////////////////////////////////////////////////////////////////////////////////////////
    14261429# End of Tests failing
  • trunk/LayoutTests/platform/mac/TestExpectations

    r136919 r137161  
    12411241webkit.org/b/102579 fast/events/mouse-cursor-image-set.html [ Fail ]
    12421242
     1243# Mountain Lion and prior do not allow access to in-band text tracks
     1244webkit.org/b/103663 [ MountainLion Lion SnowLeopard ] media/track/track-in-band.html
     1245
    12431246webkit.org/b/104104 fast/overflow/scrollbar-click-retains-focus.html [ Failure ]
  • trunk/LayoutTests/platform/qt/TestExpectations

    r136953 r137161  
    24382438webkit.org/b/103424 fast/backgrounds/background-opaque-images-over-color.html
    24392439
     2440# No support for exposing in-band text tracks
     2441webkit.org/b/103769 media/track/track-in-band.html [ Skip ]
     2442
    24402443webkit.org/b/104150 fast/media/implicit-media-all.html [ ImageOnlyFailure ]
    24412444
  • trunk/LayoutTests/platform/win/TestExpectations

    r137113 r137161  
    24882488fast/js/kde/Array.html
    24892489
     2490# No support for exposing in-band text tracks
     2491webkit.org/b/103770 media/track/track-in-band.html [ Skip ]
     2492
    24902493# https://bugs.webkit.org/show_bug.cgi?id=97026
    24912494fast/events/keydown-leftright-keys.html
  • trunk/Source/WTF/ChangeLog

    r137054 r137161  
     12012-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Add support for in-band text tracks to Mac port
     4        https://bugs.webkit.org/show_bug.cgi?id=103663
     5
     6        Reviewed by Sam Weinig.
     7
     8        * wtf/Platform.h: Define HAVE_AVFOUNDATION_TEXT_TRACK_SUPPORT.
     9
    1102012-12-08  Patrick Gansterer  <paroga@webkit.org>
    211
  • trunk/Source/WTF/wtf/Platform.h

    r135854 r137161  
    11661166#endif
    11671167
     1168#if PLATFORM(MAC) && !PLATFORM(IOS) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
     1169#define HAVE_AVFOUNDATION_TEXT_TRACK_SUPPORT 1
     1170#endif
     1171
    11681172#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(EFL) || (PLATFORM(WIN) && !OS(WINCE) && !PLATFORM(WIN_CAIRO)) || PLATFORM(BLACKBERRY)
    11691173#define WTF_USE_REQUEST_ANIMATION_FRAME_TIMER 1
  • trunk/Source/WebCore/ChangeLog

    r137160 r137161  
     12012-12-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Add support for in-band text tracks to Mac port
     4        https://bugs.webkit.org/show_bug.cgi?id=103663
     5
     6        Reviewed by Sam Weinig.
     7
     8        Test: media/track/track-in-band.html
     9
     10        * GNUmakefile.list.am: Move InbandTextTrackPrivate.h to platform/graphics. Add InbandTextTrackPrivateClient.h.
     11        * Target.pri: Ditto.
     12        * WebCore.gypi: Ditto.
     13
     14        * WebCore.xcodeproj/project.pbxproj: Add new files.
     15
     16        * html/HTMLMediaElement.cpp:
     17        (WebCore::HTMLMediaElement::setReadyState): No need to call processInbandTextTracks, in-band tracks
     18            are now registered by the media engine as they are discovered.
     19        (WebCore::HTMLMediaElement::mediaPlayerDidAddTrack): New, called by the media player when a new
     20            in-band track is found.
     21        (WebCore::HTMLMediaElement::mediaPlayerDidRemoveTrack): New, called by the media player when an
     22            in-band track goes away.
     23        * html/HTMLMediaElement.h:
     24
     25        * html/track/InbandTextTrack.cpp:
     26        (WebCore::InbandTextTrack::InbandTextTrack): Use m_private instead of tracksPrivate because
     27            it is zeroed during assignment.
     28
     29        * platform/graphics/MediaPlayer.cpp:
     30        (WebCore::MediaPlayer::addTextTrack): New MediaPlayerClient method to allow MediaPlayerPrivate subclasses
     31            to add a new in-band track.
     32        (WebCore::MediaPlayer::removeTextTrack): New MediaPlayerClient method to allow MediaPlayerPrivate subclasses
     33            to remove a new in-band track.
     34        * platform/graphics/MediaPlayer.h:
     35        * platform/graphics/MediaPlayerPrivate.h:
     36
     37        * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp: Added.
     38        (WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF):
     39        (WebCore::InbandTextTrackPrivateAVF::~InbandTextTrackPrivateAVF):
     40        (WebCore::InbandTextTrackPrivateAVF::processCueAttributes): Convert an attribute string into WebVTT
     41            cue setting and content strings.
     42        (WebCore::InbandTextTrackPrivateAVF::processCue): Process a new cue.
     43        (WebCore::InbandTextTrackPrivateAVF::disconnect): Clear member variables.
     44        (WebCore::InbandTextTrackPrivateAVF::resetCueValues): Reset cue values to defaults.
     45        (WebCore::InbandTextTrackPrivateAVF::setMode): Set track mode and call player's trackModeChanged.
     46        * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h: Added.
     47
     48        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp: Initialize
     49            m_inbandTrackConfigurationPending.
     50        (WebCore::MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation):
     51        (WebCore::MediaPlayerPrivateAVFoundation::seekCompleted): Flush the currently accumulating
     52            cue so it doesn't get the wrong duration.
     53        (WebCore::MediaPlayerPrivateAVFoundation::dispatchNotification): Handle InbandTracksNeedConfiguration.
     54        (WebCore::MediaPlayerPrivateAVFoundation::flushCurrentCue): New, pass the current cue up to the client.
     55        (WebCore::MediaPlayerPrivateAVFoundation::configureInbandTracks): Configure in-band tracks.
     56        (WebCore::MediaPlayerPrivateAVFoundation::trackModeChanged): Schedule a call to configureInbandTracks.
     57        * platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:
     58
     59        * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h: Added.
     60        * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm: Added.
     61        (WebCore::InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC):
     62        (WebCore::InbandTextTrackPrivateAVFObjC::disconnect):
     63        (WebCore::InbandTextTrackPrivateAVFObjC::kind): Return track kind.
     64        (WebCore::InbandTextTrackPrivateAVFObjC::label): Return track label.
     65        (WebCore::InbandTextTrackPrivateAVFObjC::language): Return track language.
     66        (WebCore::InbandTextTrackPrivateAVFObjC::isDefault):
     67        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
     68        (MediaPlayerPrivateAVFoundationObjC):
     69        (WebCore::MediaPlayerPrivateAVFoundationObjC::playerItem):
     70        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     71        (WebCore::MediaPlayerPrivateAVFoundationObjC::MediaPlayerPrivateAVFoundationObjC): Initialize m_currentTrack.
     72        (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Clear m_legibleOutput.
     73        (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Create and initialize m_legibleOutput.
     74        (WebCore::MediaPlayerPrivateAVFoundationObjC::processTextTracks): Called when the player item's
     75            "tracks" changes, add and remove in-band text tracks as necessary.
     76        (WebCore::MediaPlayerPrivateAVFoundationObjC::processCue): Pass an attributed string to the current
     77            track to be processed.
     78        (WebCore::MediaPlayerPrivateAVFoundationObjC::setCurrentTrack): Tell AVFoundation to select an in-band track.
     79        (WebCore::MediaPlayerPrivateAVFoundationObjC::currentTrack): Return the current track.
     80        (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]): Legible
     81            output delegate.
     82
    1832012-12-10  Pavel Feldman  <pfeldman@chromium.org>
    284
  • trunk/Source/WebCore/GNUmakefile.list.am

    r137146 r137161  
    36183618        Source/WebCore/html/track/InbandTextTrack.cpp \
    36193619        Source/WebCore/html/track/InbandTextTrack.h \
    3620         Source/WebCore/html/track/InbandTextTrackPrivate.h \
    36213620        Source/WebCore/html/track/LoadableTextTrack.cpp \
    36223621        Source/WebCore/html/track/LoadableTextTrack.h \
     
    55205519        Source/WebCore/platform/graphics/ImageSource.cpp \
    55215520        Source/WebCore/platform/graphics/ImageSource.h \
     5521        Source/WebCore/platform/graphics/InbandTextTrackPrivate.h \
     5522        Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h \
    55225523        Source/WebCore/platform/graphics/IntPoint.h \
    55235524        Source/WebCore/platform/graphics/IntPointHash.h \
  • trunk/Source/WebCore/Target.pri

    r137045 r137161  
    18851885    html/shadow/DetailsMarkerControl.h \
    18861886    html/track/InbandTextTrack.h \
    1887     html/track/InbandTextTrackPrivate.h \
    18881887    html/track/LoadableTextTrack.h \
    18891888    html/track/TextTrack.h \
     
    21752174    platform/graphics/ImageOrientation.h \
    21762175    platform/graphics/ImageSource.h \
     2176    platform/graphics/InbandTextTrackPrivate.h \
     2177    platform/graphics/InbandTextTrackPrivateClient.h \
    21772178    platform/graphics/IntPoint.h \
    21782179    platform/graphics/IntPointHash.h \
  • trunk/Source/WebCore/WebCore.gypi

    r137045 r137161  
    33973397            'html/track/InbandTextTrack.cpp',
    33983398            'html/track/InbandTextTrack.h',
    3399             'html/track/InbandTextTrackPrivate.h',
    34003399            'html/track/LoadableTextTrack.cpp',
    34013400            'html/track/LoadableTextTrack.h',
     
    37153714            'platform/graphics/ImageOrientation.cpp',
    37163715            'platform/graphics/ImageSource.cpp',
     3716            'platform/graphics/InbandTextTrackPrivate.h',
     3717            'platform/graphics/InbandTextTrackPrivateClient.h',
    37173718            'platform/graphics/Latin1TextIterator.h',
    37183719            'platform/graphics/MediaPlayer.cpp',
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r137067 r137161  
    109109                070756E014239B4E00414161 /* JSTextTrackCueList.h in Headers */ = {isa = PBXBuildFile; fileRef = 070756DA14239B4E00414161 /* JSTextTrackCueList.h */; };
    110110                0709FC4E1025DEE30059CDBA /* AccessibilitySlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 0709FC4D1025DEE30059CDBA /* AccessibilitySlider.h */; };
    111                 0711BF8E1642D9D100419E36 /* InbandTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0711BF8D1642D9D100419E36 /* InbandTextTrack.cpp */; };
    112                 0711BF8F1642D9F400419E36 /* InbandTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0711BF8C1642D81100419E36 /* InbandTextTrack.h */; };
    113                 0711BF9116430C9100419E36 /* InbandTextTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0711BF9016430C9000419E36 /* InbandTextTrackPrivate.h */; };
    114111                0720B0A014D3323500642955 /* GenericEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0720B09E14D3323500642955 /* GenericEventQueue.cpp */; };
    115112                0720B0A014D3323500642956 /* GestureEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0720B09F14D3323500642956 /* GestureEvent.cpp */; };
     
    126123                07846343145B151A00A58DF1 /* JSTrackEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 07846341145B151A00A58DF1 /* JSTrackEvent.h */; };
    127124                07846385145B1B8E00A58DF1 /* JSTrackCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = 07846384145B1B8E00A58DF1 /* JSTrackCustom.h */; };
     125                07941791166E855F009416C2 /* InbandTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0794178F166E855F009416C2 /* InbandTextTrack.cpp */; };
     126                07941792166E855F009416C2 /* InbandTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 07941790166E855F009416C2 /* InbandTextTrack.h */; };
     127                07941794166EA04E009416C2 /* InbandTextTrackPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07941793166EA04E009416C2 /* InbandTextTrackPrivate.h */; };
    128128                079D0868162F20E800DB8658 /* CaptionUserPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 079D0867162F20E800DB8658 /* CaptionUserPreferences.h */; settings = {ATTRIBUTES = (Private, ); }; };
    129129                079D086B162F21F900DB8658 /* CaptionUserPreferencesMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 079D0869162F21F900DB8658 /* CaptionUserPreferencesMac.h */; };
     
    131131                07A6D1EB1491137700051D0C /* MediaFragmentURIParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A6D1E91491137700051D0C /* MediaFragmentURIParser.cpp */; };
    132132                07A6D1EC1491137700051D0C /* MediaFragmentURIParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A6D1EA1491137700051D0C /* MediaFragmentURIParser.h */; };
     133                07AA6B6B166D2C0700D45671 /* InbandTextTrackPrivateAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = 07AA6B6A166D019500D45671 /* InbandTextTrackPrivateAVFObjC.mm */; };
     134                07AA6B6C166D2C1300D45671 /* InbandTextTrackPrivateAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AA6B69166D019500D45671 /* InbandTextTrackPrivateAVFObjC.h */; settings = {ATTRIBUTES = (Private, ); }; };
    133135                07B0113F1032242200FBDC33 /* AccessibilityMediaControls.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */; };
     136                07B442D6166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */; };
     137                07B442D7166C70B000556CAD /* InbandTextTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */; settings = {ATTRIBUTES = (Private, ); }; };
    134138                07B5A2DB1464320A00A81ECE /* JSTextTrackList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A2D91464320A00A81ECE /* JSTextTrackList.cpp */; };
    135139                07B5A2DC1464320A00A81ECE /* JSTextTrackList.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B5A2DA1464320A00A81ECE /* JSTextTrackList.h */; };
    136140                07B5A30D14687D7100A81ECE /* JSTextTrackListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A30C14687D7100A81ECE /* JSTextTrackListCustom.cpp */; };
    137141                07BDD6EC1469B4C2009C9F85 /* JSTrackEventCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A30A14687B8400A81ECE /* JSTrackEventCustom.cpp */; };
     142                07CE77D516712A6A00C55A47 /* InbandTextTrackPrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */; };
    138143                07E116B11489C9A100EC5ACE /* JSTextTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */; };
    139144                07E117071489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */; };
     
    72147219                0709FC4D1025DEE30059CDBA /* AccessibilitySlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilitySlider.h; sourceTree = "<group>"; };
    72157220                070DD8F50F01868000727DEB /* mediaControls.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mediaControls.css; sourceTree = "<group>"; };
    7216                 0711BF8C1642D81100419E36 /* InbandTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrack.h; sourceTree = "<group>"; };
    7217                 0711BF8D1642D9D100419E36 /* InbandTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrack.cpp; sourceTree = "<group>"; };
    7218                 0711BF9016430C9000419E36 /* InbandTextTrackPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivate.h; sourceTree = "<group>"; };
    72197221                0720B09E14D3323500642955 /* GenericEventQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GenericEventQueue.cpp; sourceTree = "<group>"; };
    72207222                0720B09F14D3323500642955 /* GenericEventQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenericEventQueue.h; sourceTree = "<group>"; };
     
    72317233                07846341145B151A00A58DF1 /* JSTrackEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTrackEvent.h; sourceTree = "<group>"; };
    72327234                07846384145B1B8E00A58DF1 /* JSTrackCustom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTrackCustom.h; sourceTree = "<group>"; };
     7235                0794178F166E855F009416C2 /* InbandTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrack.cpp; sourceTree = "<group>"; };
     7236                07941790166E855F009416C2 /* InbandTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrack.h; sourceTree = "<group>"; };
     7237                07941793166EA04E009416C2 /* InbandTextTrackPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivate.h; sourceTree = "<group>"; };
    72337238                079D0867162F20E800DB8658 /* CaptionUserPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaptionUserPreferences.h; sourceTree = "<group>"; };
    72347239                079D0869162F21F900DB8658 /* CaptionUserPreferencesMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CaptionUserPreferencesMac.h; sourceTree = "<group>"; };
     
    72377242                07A6D1E91491137700051D0C /* MediaFragmentURIParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaFragmentURIParser.cpp; sourceTree = "<group>"; };
    72387243                07A6D1EA1491137700051D0C /* MediaFragmentURIParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaFragmentURIParser.h; sourceTree = "<group>"; };
     7244                07AA6B69166D019500D45671 /* InbandTextTrackPrivateAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InbandTextTrackPrivateAVFObjC.h; path = objc/InbandTextTrackPrivateAVFObjC.h; sourceTree = "<group>"; };
     7245                07AA6B6A166D019500D45671 /* InbandTextTrackPrivateAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = InbandTextTrackPrivateAVFObjC.mm; path = objc/InbandTextTrackPrivateAVFObjC.mm; sourceTree = "<group>"; };
    72397246                07AFE5900F1446BD00841617 /* mediaControlsQuickTime.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = mediaControlsQuickTime.css; sourceTree = "<group>"; };
    72407247                07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityMediaControls.h; sourceTree = "<group>"; };
     7248                07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrackPrivateAVF.cpp; sourceTree = "<group>"; };
     7249                07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateAVF.h; sourceTree = "<group>"; };
    72417250                07B5A2D91464320A00A81ECE /* JSTextTrackList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackList.cpp; sourceTree = "<group>"; };
    72427251                07B5A2DA1464320A00A81ECE /* JSTextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTextTrackList.h; sourceTree = "<group>"; };
     
    72447253                07B5A30A14687B8400A81ECE /* JSTrackEventCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTrackEventCustom.cpp; sourceTree = "<group>"; };
    72457254                07B5A30C14687D7100A81ECE /* JSTextTrackListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackListCustom.cpp; sourceTree = "<group>"; };
     7255                07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateClient.h; sourceTree = "<group>"; };
    72467256                07E116B01489C9A100EC5ACE /* JSTextTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCustom.cpp; sourceTree = "<group>"; };
    72477257                07E117061489EBEB00EC5ACE /* JSTextTrackCueCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackCueCustom.cpp; sourceTree = "<group>"; };
     
    1428514295                        isa = PBXGroup;
    1428614296                        children = (
     14297                                07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */,
     14298                                07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */,
    1428714299                                DF9AFD6F13FC31B00015FEB7 /* objc */,
    1428814300                                076F0D0912B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.cpp */,
     
    1945019462                        isa = PBXGroup;
    1945119463                        children = (
    19452                                 0711BF9016430C9000419E36 /* InbandTextTrackPrivate.h */,
    19453                                 0711BF8D1642D9D100419E36 /* InbandTextTrack.cpp */,
    19454                                 0711BF8C1642D81100419E36 /* InbandTextTrack.h */,
     19464                                0794178F166E855F009416C2 /* InbandTextTrack.cpp */,
     19465                                07941790166E855F009416C2 /* InbandTextTrack.h */,
    1945519466                                9759E93414EF1CF80026A2DD /* LoadableTextTrack.cpp */,
    1945619467                                9759E94814EF1D490026A2DD /* LoadableTextTrack.h */,
     
    2018820199                                A8748D6612CC3763001FBA41 /* ImageOrientation.h */,
    2018920200                                49291E4A134172C800E753DE /* ImageRenderingMode.h */,
     20201                                07941793166EA04E009416C2 /* InbandTextTrackPrivate.h */,
     20202                                07CE77D416712A6A00C55A47 /* InbandTextTrackPrivateClient.h */,
    2019020203                                B27535430B053814002CE64F /* ImageSource.h */,
    2019120204                                B27535440B053814002CE64F /* IntPoint.h */,
     
    2119221205                        isa = PBXGroup;
    2119321206                        children = (
     21207                                07AA6B69166D019500D45671 /* InbandTextTrackPrivateAVFObjC.h */,
     21208                                07AA6B6A166D019500D45671 /* InbandTextTrackPrivateAVFObjC.mm */,
    2119421209                                DF9AFD7013FC31D80015FEB7 /* MediaPlayerPrivateAVFoundationObjC.h */,
    2119521210                                DF9AFD7113FC31D80015FEB7 /* MediaPlayerPrivateAVFoundationObjC.mm */,
     
    2403924054                                4B3480940EEF50D400AC1B41 /* ImageSourceCG.h in Headers */,
    2404024055                                316FE1180E6E1DA700BF6088 /* ImplicitAnimation.h in Headers */,
    24041                                 0711BF8F1642D9F400419E36 /* InbandTextTrack.h in Headers */,
    24042                                 0711BF9116430C9100419E36 /* InbandTextTrackPrivate.h in Headers */,
    2404324056                                DB23C2CC0A508D29002489EB /* IndentOutdentCommand.h in Headers */,
    2404424057                                F3644B001119805900E0D537 /* InjectedScript.h in Headers */,
     
    2589025903                                15B8B7C91652C5220036EF55 /* JSWebKitCSSMixFunctionValue.h in Headers */,
    2589125904                                93F72AF31666EDFC002A02BD /* LayerPool.h in Headers */,
     25905                                07B442D7166C70B000556CAD /* InbandTextTrackPrivateAVF.h in Headers */,
     25906                                07AA6B6C166D2C1300D45671 /* InbandTextTrackPrivateAVFObjC.h in Headers */,
     25907                                07CE77D516712A6A00C55A47 /* InbandTextTrackPrivateClient.h in Headers */,
     25908                                07941792166E855F009416C2 /* InbandTextTrack.h in Headers */,
     25909                                07941794166EA04E009416C2 /* InbandTextTrackPrivate.h in Headers */,
    2589225910                                DEBCCDD216646E8200A452E1 /* RenderMediaControlElements.h in Headers */,
    2589325911                                DEBCCDD416646EAF00A452E1 /* MediaControlElementTypes.h in Headers */,
     
    2726027278                                4B3480930EEF50D400AC1B41 /* ImageSourceCGMac.mm in Sources */,
    2726127279                                316FE1170E6E1DA700BF6088 /* ImplicitAnimation.cpp in Sources */,
    27262                                 0711BF8E1642D9D100419E36 /* InbandTextTrack.cpp in Sources */,
    2726327280                                DB23C2CB0A508D29002489EB /* IndentOutdentCommand.cpp in Sources */,
    2726427281                                F3644AFF1119805900E0D537 /* InjectedScript.cpp in Sources */,
     
    2900029017                                93F72AF41666EDFC002A02BD /* LayerPool.mm in Sources */,
    2900129018                                C375D7FD16639519006184AB /* TypeAhead.cpp in Sources */,
     29019                                07B442D6166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp in Sources */,
     29020                                07AA6B6B166D2C0700D45671 /* InbandTextTrackPrivateAVFObjC.mm in Sources */,
     29021                                07941791166E855F009416C2 /* InbandTextTrack.cpp in Sources */,
    2900229022                                D66817FA166FE6D700FA07B4 /* HTMLTemplateElement.cpp in Sources */,
    2900329023                                D6489D25166FFCF1007C031B /* JSHTMLTemplateElement.cpp in Sources */,
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r136978 r137161  
    17451745        scheduleEvent(eventNames().durationchangeEvent);
    17461746        scheduleEvent(eventNames().loadedmetadataEvent);
    1747 #if ENABLE(VIDEO_TRACK)
    1748         if (m_player && m_player->hasClosedCaptions())
    1749             processInbandTextTracks();
    1750 #endif
    17511747        if (hasMediaControls())
    17521748            mediaControls()->loadedMetadata();
     
    27272723
    27282724#if ENABLE(VIDEO_TRACK)
    2729 void HTMLMediaElement::processInbandTextTracks()
     2725
     2726void HTMLMediaElement::mediaPlayerDidAddTrack(PassRefPtr<InbandTextTrackPrivate> prpTrack)
    27302727{
    27312728    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
    27322729        return;
    2733 
    2734     Vector<RefPtr<InbandTextTrackPrivate> > privateTextTracks;
    2735     m_player->getTextTracks(privateTextTracks);
    2736 
    2737     if (!privateTextTracks.size())
    2738         return;
    2739 
    2740     for (size_t i = 0; i < privateTextTracks.size(); ++i) {
    2741         // 4.8.10.12.2 Sourcing in-band text tracks
    2742         // 1. Associate the relevant data with a new text track and its corresponding new TextTrack object.
    2743        
    2744         // 2. Set the new text track's kind, label, and language based on the semantics of the relevant data,
    2745         // as defined by the relevant specification. If there is no label in that data, then the label must
    2746         // be set to the empty string.
    2747         //   - This is done by the media engine when it creates the InbandTextTrackPrivate.
    2748         RefPtr<TextTrack> textTrack = InbandTextTrack::create(ActiveDOMObject::scriptExecutionContext(), this, privateTextTracks[i]);
    2749        
    2750         // 5. Populate the new text track's list of cues with the cues parsed so far, folllowing the guidelines for exposing
    2751         // cues, and begin updating it dynamically as necessary.
    2752         //   - This will happen automatically as the media engine loads the cues
    2753        
    2754         // 6. Set the new text track's readiness state to loaded.
    2755         textTrack->setReadinessState(TextTrack::Loaded);
    2756        
    2757         // 7. Set the new text track's mode to the mode consistent with the user's preferences and the requirements of
    2758         // the relevant specification for the data.
    2759         //  - This will happen in configureTextTracks()
    2760        
    2761         // 8. Add the new text track to the media element's list of text tracks.
    2762         textTracks()->append(textTrack);
    2763        
    2764         // 9. Fire an event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent
    2765         // interface, with the track attribute initialized to the text track's TextTrack object, at the media element's
    2766         // textTracks attribute's TextTrackList object.
    2767         //  - This was done in TextTrackList::append
    2768     }
    2769 
    2770     configureTextTracks();
     2730   
     2731    // 4.8.10.12.2 Sourcing in-band text tracks
     2732    // 1. Associate the relevant data with a new text track and its corresponding new TextTrack object.
     2733    RefPtr<InbandTextTrack> textTrack = InbandTextTrack::create(ActiveDOMObject::scriptExecutionContext(), this, prpTrack);
     2734   
     2735    // 2. Set the new text track's kind, label, and language based on the semantics of the relevant data,
     2736    // as defined by the relevant specification. If there is no label in that data, then the label must
     2737    // be set to the empty string.
     2738    // 3. Associate the text track list of cues with the rules for updating the text track rendering appropriate
     2739    // for the format in question.
     2740    // 4. If the new text track's kind is metadata, then set the text track in-band metadata track dispatch type
     2741    // as follows, based on the type of the media resource:
     2742    // 5. Populate the new text track's list of cues with the cues parsed so far, folllowing the guidelines for exposing
     2743    // cues, and begin updating it dynamically as necessary.
     2744    //   - Thess are all done by the media engine.
     2745   
     2746    // 6. Set the new text track's readiness state to loaded.
     2747    textTrack->setReadinessState(TextTrack::Loaded);
     2748   
     2749    // 7. Set the new text track's mode to the mode consistent with the user's preferences and the requirements of
     2750    // the relevant specification for the data.
     2751    //  - This will happen in configureTextTracks()
     2752    scheduleLoad(TextTrackResource);
     2753   
     2754    // 8. Add the new text track to the media element's list of text tracks.
     2755    // 9. Fire an event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent
     2756    // interface, with the track attribute initialized to the text track's TextTrack object, at the media element's
     2757    // textTracks attribute's TextTrackList object.
     2758    textTracks()->append(textTrack);
     2759}
     2760
     2761void HTMLMediaElement::mediaPlayerDidRemoveTrack(PassRefPtr<InbandTextTrackPrivate> prpTrack)
     2762{
     2763    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     2764        return;
     2765   
     2766    if (!m_textTracks)
     2767        return;
     2768
     2769    // This cast is safe because we created the InbandTextTrack with the InbandTextTrackPrivate
     2770    // passed to mediaPlayerDidAddTrack.
     2771    RefPtr<InbandTextTrack> textTrack = static_cast<InbandTextTrack*>(prpTrack->client());
     2772    if (!textTrack)
     2773        return;
     2774
     2775    m_textTracks->remove(textTrack.get());
     2776    TextTrackCueList* cues = textTrack->cues();
     2777    if (cues) {
     2778        beginIgnoringTrackDisplayUpdateRequests();
     2779        for (size_t i = 0; i < cues->length(); ++i)
     2780            textTrackRemoveCue(cues->item(i)->track(), cues->item(i));
     2781        endIgnoringTrackDisplayUpdateRequests();
     2782    }
    27712783}
    27722784
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r136613 r137161  
    216216    PassRefPtr<TextTrack> addTextTrack(const String& kind, ExceptionCode& ec) { return addTextTrack(kind, emptyString(), emptyString(), ec); }
    217217
    218     void processInbandTextTracks();
    219 
    220218    TextTrackList* textTracks();
    221219    CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
     
    223221    virtual void didAddTrack(HTMLTrackElement*);
    224222    virtual void didRemoveTrack(HTMLTrackElement*);
     223
     224    virtual void mediaPlayerDidAddTrack(PassRefPtr<InbandTextTrackPrivate>) OVERRIDE;
     225    virtual void mediaPlayerDidRemoveTrack(PassRefPtr<InbandTextTrackPrivate>) OVERRIDE;
    225226
    226227    struct TrackGroup {
  • trunk/Source/WebCore/html/track/InbandTextTrack.cpp

    r135413 r137161  
    4040namespace WebCore {
    4141
     42PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate)
     43{
     44    return adoptRef(new InbandTextTrack(context, client, playerPrivate));
     45}
     46
    4247InbandTextTrack::InbandTextTrack(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> tracksPrivate)
    4348    : TextTrack(context, client, emptyString(), tracksPrivate->label(), tracksPrivate->language(), InBand)
     
    4651    m_private->setClient(this);
    4752   
    48     switch (tracksPrivate->kind()) {
    49     case InbandTextTrackPrivate::subtitles:
     53    switch (m_private->kind()) {
     54    case InbandTextTrackPrivate::Subtitles:
    5055        setKind(TextTrack::subtitlesKeyword());
    5156        break;
    52     case InbandTextTrackPrivate::captions:
     57    case InbandTextTrackPrivate::Captions:
    5358        setKind(TextTrack::captionsKeyword());
    5459        break;
    55     case InbandTextTrackPrivate::descriptions:
     60    case InbandTextTrackPrivate::Descriptions:
    5661        setKind(TextTrack::descriptionsKeyword());
    5762        break;
    58     case InbandTextTrackPrivate::chapters:
     63    case InbandTextTrackPrivate::Chapters:
    5964        setKind(TextTrack::chaptersKeyword());
    6065        break;
    61     case InbandTextTrackPrivate::metadata:
     66    case InbandTextTrackPrivate::Metadata:
    6267        setKind(TextTrack::metadataKeyword());
    6368        break;
    64     case InbandTextTrackPrivate::none:
     69    case InbandTextTrackPrivate::None:
    6570    default:
    6671        ASSERT_NOT_REACHED();
     
    7984
    8085    if (mode == TextTrack::disabledKeyword())
    81         m_private->setMode(InbandTextTrackPrivate::disabled);
     86        m_private->setMode(InbandTextTrackPrivate::Disabled);
    8287    else if (mode == TextTrack::hiddenKeyword())
    83         m_private->setMode(InbandTextTrackPrivate::hidden);
     88        m_private->setMode(InbandTextTrackPrivate::Hidden);
    8489    else if (mode == TextTrack::showingKeyword())
    85         m_private->setMode(InbandTextTrackPrivate::showing);
     90        m_private->setMode(InbandTextTrackPrivate::Showing);
    8691    else
    8792        ASSERT_NOT_REACHED();
  • trunk/Source/WebCore/html/track/InbandTextTrack.h

    r135410 r137161  
    2929#if ENABLE(VIDEO_TRACK)
    3030
     31#include "InbandTextTrackPrivate.h"
     32#include "InbandTextTrackPrivateClient.h"
    3133#include "TextTrack.h"
    3234#include <wtf/RefPtr.h>
     
    3941class TextTrackCue;
    4042
    41 class InbandTextTrackClient {
     43class InbandTextTrack : public TextTrack, public InbandTextTrackPrivateClient {
    4244public:
    43     virtual ~InbandTextTrackClient() { }
    44 
    45     virtual void addCue(InbandTextTrackPrivate*, double /*start*/, double /*end*/, const String& /*id*/, const String& /*content*/, const String& /*settings*/) { }
    46 };
    47 
    48 class InbandTextTrack : public TextTrack, public InbandTextTrackClient {
    49 public:
    50     static PassRefPtr<InbandTextTrack> create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> playerPrivate)
    51     {
    52         return adoptRef(new InbandTextTrack(context, client, playerPrivate));
    53     }
     45    static PassRefPtr<InbandTextTrack> create(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
    5446    virtual ~InbandTextTrack();
    5547
     
    6052    InbandTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr<InbandTextTrackPrivate>);
    6153
    62     virtual void addCue(InbandTextTrackPrivate*, double, double, const String&, const String&, const String&);
     54    virtual void addCue(InbandTextTrackPrivate*, double, double, const String&, const String&, const String&) OVERRIDE;
    6355
    6456    RefPtr<InbandTextTrackPrivate> m_private;
  • trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivate.h

    r137152 r137161  
    3636namespace WebCore {
    3737
    38 class InbandTextTrackClient;
     38class InbandTextTrackPrivateClient;
    3939
    4040class InbandTextTrackPrivate : public RefCounted<InbandTextTrackPrivate> {
     
    4646    }
    4747    virtual ~InbandTextTrackPrivate() { }
    48    
    49     void setClient(InbandTextTrackClient* client) { m_client = client; }
    50     InbandTextTrackClient* client() { return m_client; }
    5148
    52     enum Mode { disabled, hidden, showing };
     49    void setClient(InbandTextTrackPrivateClient* client) { m_client = client; }
     50    InbandTextTrackPrivateClient* client() { return m_client; }
     51
     52    enum Mode { Disabled, Hidden, Showing };
    5353    virtual void setMode(Mode mode) { m_mode = mode; };
    5454    virtual InbandTextTrackPrivate::Mode mode() const { return m_mode; }
    5555
    56     enum Kind { subtitles, captions, descriptions, chapters, metadata, none };
    57     virtual Kind kind() const { return subtitles; }
     56    enum Kind { Subtitles, Captions, Descriptions, Chapters, Metadata, None };
     57    virtual Kind kind() const { return Subtitles; }
    5858
    5959    virtual AtomicString label() const { return emptyString(); }
     
    6666    InbandTextTrackPrivate()
    6767        : m_client(0)
    68         , m_mode(disabled)
     68        , m_mode(Disabled)
    6969    {
    7070    }
    7171
    7272private:
    73     InbandTextTrackClient* m_client;
     73    InbandTextTrackPrivateClient* m_client;
    7474    Mode m_mode;
    7575};
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp

    r135410 r137161  
    11151115
    11161116#if ENABLE(VIDEO_TRACK)
    1117 void MediaPlayer::getTextTracks(Vector<RefPtr<InbandTextTrackPrivate> >& tracks)
    1118 {
    1119     m_private->getTextTracks(tracks);
    1120 }
    1121 
    1122 void MediaPlayer::setTextTrackClient(TextTrackClient* client)
    1123 {
    1124     m_private->setTextTrackClient(client);
    1125 }
    1126 #endif
    1127 
    1128 }
    1129 
    1130 #endif
     1117void MediaPlayer::addTextTrack(PassRefPtr<InbandTextTrackPrivate> track)
     1118{
     1119    if (!m_mediaPlayerClient)
     1120        return;
     1121
     1122    m_mediaPlayerClient->mediaPlayerDidAddTrack(track);
     1123}
     1124
     1125void MediaPlayer::removeTextTrack(PassRefPtr<InbandTextTrackPrivate> track)
     1126{
     1127    if (!m_mediaPlayerClient)
     1128        return;
     1129
     1130    m_mediaPlayerClient->mediaPlayerDidRemoveTrack(track);
     1131}
     1132#endif
     1133
     1134}
     1135
     1136#endif
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r135410 r137161  
    6363class MediaPlayerPrivateInterface;
    6464class MediaSource;
    65 class TextTrackClient;
    6665
    6766// Structure that will hold every native
     
    211210    virtual IntRect mediaPlayerWindowClipRect() { return IntRect(); }
    212211    virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() { return 0; }
     212
     213#if ENABLE(VIDEO_TRACK)
     214    virtual void mediaPlayerDidAddTrack(PassRefPtr<InbandTextTrackPrivate>) { }
     215    virtual void mediaPlayerDidRemoveTrack(PassRefPtr<InbandTextTrackPrivate>) { }
     216#endif
    213217};
    214218
     
    431435
    432436#if ENABLE(VIDEO_TRACK)
    433     void getTextTracks(Vector<RefPtr<InbandTextTrackPrivate> >&);
    434     void setTextTrackClient(TextTrackClient*);
     437    void addTextTrack(PassRefPtr<InbandTextTrackPrivate>);
     438    void removeTextTrack(PassRefPtr<InbandTextTrackPrivate>);
    435439#endif
    436440
  • trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h

    r135410 r137161  
    185185#endif
    186186
    187 #if ENABLE(VIDEO_TRACK)
    188     virtual void getTextTracks(Vector<RefPtr<InbandTextTrackPrivate> >&) { }
    189     virtual void setTextTrackClient(TextTrackClient*) { }
    190 #endif
    191187};
    192188
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp

    r131502 r137161  
    11/*
    2  * Copyright (C) 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3434#include "FrameView.h"
    3535#include "GraphicsContext.h"
     36#include "InbandTextTrackPrivateAVF.h"
     37#include "InbandTextTrackPrivateClient.h"
    3638#include "KURL.h"
    3739#include "Logging.h"
     
    7375    , m_haveReportedFirstVideoFrame(false)
    7476    , m_playWhenFramesAvailable(false)
     77    , m_inbandTrackConfigurationPending(false)
    7578{
    7679    LOG(Media, "MediaPlayerPrivateAVFoundation::MediaPlayerPrivateAVFoundation(%p)", this);
     
    569572    LOG(Media, "MediaPlayerPrivateAVFoundation::seekCompleted(%p) - finished = %d", this, finished);
    570573    UNUSED_PARAM(finished);
    571    
     574
     575#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     576    // Forget any partially accumulated cue data as the seek could be to a time outside of the cue's
     577    // range, which will mean that the next cue delivered will result in the current cue getting the
     578    // incorrect duration.
     579    if (currentTrack())
     580        currentTrack()->resetCueValues();
     581#endif
     582
    572583    m_seekTo = MediaPlayer::invalidTime();
    573584    updateStates();
     
    785796        contentsNeedsDisplay();
    786797        break;
     798    case Notification::InbandTracksNeedConfiguration:
     799#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     800        m_inbandTrackConfigurationPending = false;
     801        configureInbandTracks();
     802#endif
     803        break;
    787804
    788805    case Notification::None:
     
    792809}
    793810
     811#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     812void MediaPlayerPrivateAVFoundation::flushCurrentCue(InbandTextTrackPrivateAVF* track)
     813{
     814    if (!track->client())
     815        return;
     816
     817    track->client()->addCue(track, track->start(), track->end(), track->id(), track->content(), track->settings());
     818}
     819
     820void MediaPlayerPrivateAVFoundation::configureInbandTracks()
     821{
     822    RefPtr<InbandTextTrackPrivateAVF> trackToEnable;
     823
     824    // AVFoundation can only emit cues for one track at a time, so enable the first track that is showing, or the first that
     825    // is hidden if none are showing. Otherwise disable all tracks.
     826    for (unsigned i = 0; i < m_textTracks.size(); ++i) {
     827        RefPtr<InbandTextTrackPrivateAVF> track = m_textTracks[i];
     828        if (track->mode() == InbandTextTrackPrivate::Showing) {
     829            trackToEnable = track;
     830            break;
     831        }
     832        if (track->mode() == InbandTextTrackPrivate::Hidden)
     833            trackToEnable = track;
     834    }
     835
     836    setCurrentTrack(trackToEnable.get());
     837}
     838
     839void MediaPlayerPrivateAVFoundation::trackModeChanged()
     840{
     841    if (m_inbandTrackConfigurationPending)
     842        return;
     843    m_inbandTrackConfigurationPending = true;
     844    scheduleMainThreadNotification(Notification::InbandTracksNeedConfiguration);
     845}
     846#endif
     847
    794848} // namespace WebCore
    795849
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h

    r123747 r137161  
    11/*
    2  * Copyright (C) 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3636namespace WebCore {
    3737
     38class InbandTextTrackPrivateAVF;
     39
    3840class MediaPlayerPrivateAVFoundation : public MediaPlayerPrivateInterface {
    3941public:
     
    4951    virtual void didEnd();
    5052    virtual void contentsNeedsDisplay() { }
     53#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     54    virtual void configureInbandTracks();
     55    virtual void setCurrentTrack(InbandTextTrackPrivateAVF*) { }
     56    virtual InbandTextTrackPrivateAVF* currentTrack() { return 0; }
     57#endif
    5158
    5259    class Notification {
     
    7077            DurationChanged,
    7178            ContentsNeedsDisplay,
     79            InbandTracksNeedConfiguration
    7280        };
    7381       
     
    8795       
    8896        Notification(Type type, bool finished)
    89         : m_type(type)
    90         , m_time(0)
    91         , m_finished(finished)
     97            : m_type(type)
     98            , m_time(0)
     99            , m_finished(finished)
    92100        {
    93101        }
     
    109117    void dispatchNotification();
    110118    void clearMainThreadPendingFlag();
     119
     120#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     121    void flushCurrentCue(InbandTextTrackPrivateAVF*);
     122    void trackModeChanged();
     123#endif
    111124
    112125protected:
     
    235248    virtual void tearDownVideoRendering();
    236249    bool hasSetUpVideoRendering() const;
    237 
     250   
    238251    static void mainThreadCallback(void*);
    239252   
     
    246259    virtual String engineDescription() const { return "AVFoundation"; }
    247260
     261#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     262    Vector<RefPtr<InbandTextTrackPrivateAVF> > m_textTracks;
     263#endif
     264   
    248265private:
    249266    MediaPlayer* m_player;
     
    280297    bool m_haveReportedFirstVideoFrame;
    281298    bool m_playWhenFramesAvailable;
     299    bool m_inbandTrackConfigurationPending;
    282300};
    283301
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h

    r134802 r137161  
    11/*
    2  * Copyright (C) 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3636OBJC_CLASS AVPlayer;
    3737OBJC_CLASS AVPlayerItem;
     38OBJC_CLASS AVPlayerItemLegibleOutput;
    3839OBJC_CLASS AVPlayerItemVideoOutput;
    3940OBJC_CLASS AVPlayerLayer;
     
    4647#endif
    4748
    48 #ifndef __OBJC__
    49 typedef struct objc_object *id;
    50 #endif
    51 
    5249typedef struct CGImage *CGImageRef;
    5350typedef struct __CVBuffer *CVPixelBufferRef;
     
    5653
    5754class WebCoreAVFResourceLoader;
     55class InbandTextTrackPrivateAVFObjC;
    5856
    5957class MediaPlayerPrivateAVFoundationObjC : public MediaPlayerPrivateAVFoundation {
     
    6664    virtual void tracksChanged();
    6765
     66#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     67    RetainPtr<AVPlayerItem> playerItem() const { return m_avPlayerItem; }
     68    void processCue(NSArray *, double);
     69#endif
     70   
    6871#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
    6972    bool shouldWaitForLoadingOfResource(AVAssetResourceLoadingRequest*);
     
    130133
    131134    virtual bool hasSingleSecurityOrigin() const;
    132 
     135   
    133136#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1080
    134137    void createImageGenerator();
     
    147150    virtual MediaPlayer::MediaKeyException generateKeyRequest(const String&, const unsigned char*, unsigned);
    148151    virtual MediaPlayer::MediaKeyException cancelKeyRequest(const String&, const String&);
     152#endif
     153
     154#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     155    virtual void setCurrentTrack(InbandTextTrackPrivateAVF*) OVERRIDE;
     156    virtual InbandTextTrackPrivateAVF* currentTrack() OVERRIDE;
     157    void processTextTracks();
    149158#endif
    150159
     
    175184    OwnPtr<WebCoreAVFResourceLoader> m_resourceLoader;
    176185#endif
     186
     187#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     188    RetainPtr<AVPlayerItemLegibleOutput> m_legibleOutput;
     189    InbandTextTrackPrivateAVFObjC* m_currentTrack;
     190#endif
    177191};
    178192
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r135882 r137161  
    11/*
    2  * Copyright (C) 2011 Apple Inc. All rights reserved.
     2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3636#import "FloatConversion.h"
    3737#import "GraphicsContext.h"
     38#import "InbandTextTrackPrivateAVFObjC.h"
    3839#import "KURL.h"
    3940#import "Logging.h"
     
    9596#define AVURLAssetReferenceRestrictionsKey getAVURLAssetReferenceRestrictionsKey()
    9697
     98#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     99typedef AVMediaSelectionGroup AVMediaSelectionGroupType;
     100typedef AVMediaSelectionOption AVMediaSelectionOptionType;
     101
     102SOFT_LINK_CLASS(AVFoundation, AVPlayerItemLegibleOutput)
     103SOFT_LINK_CLASS(AVFoundation, AVMediaSelectionGroup)
     104SOFT_LINK_CLASS(AVFoundation, AVMediaSelectionOption)
     105
     106SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicLegible, NSString *)
     107SOFT_LINK_POINTER(AVFoundation, AVMediaTypeSubtitle, NSString *)
     108SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicContainsOnlyForcedSubtitles, NSString *)
     109
     110#define AVPlayerItemLegibleOutput getAVPlayerItemLegibleOutputClass()
     111#define AVMediaSelectionGroup getAVMediaSelectionGroupClass()
     112#define AVMediaSelectionOption getAVMediaSelectionOptionClass()
     113#define AVMediaCharacteristicLegible getAVMediaCharacteristicLegible()
     114#define AVMediaTypeSubtitle getAVMediaTypeSubtitle()
     115#define AVMediaCharacteristicContainsOnlyForcedSubtitles getAVMediaCharacteristicContainsOnlyForcedSubtitles()
     116#endif
     117
    97118#define kCMTimeZero getkCMTimeZero()
    98119
     
    105126};
    106127
     128#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     129@interface WebCoreAVFMovieObserver : NSObject <AVPlayerItemLegibleOutputPushDelegate>
     130#else
    107131@interface WebCoreAVFMovieObserver : NSObject
     132#endif
    108133{
    109134    MediaPlayerPrivateAVFoundationObjC* m_callback;
     
    117142-(void)didEnd:(NSNotification *)notification;
    118143-(void)observeValueForKeyPath:keyPath ofObject:(id)object change:(NSDictionary *)change context:(MediaPlayerAVFoundationObservationContext)context;
     144#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     145- (void)legibleOutput:(id)output didOutputAttributedStrings:(NSArray *)strings nativeSampleBuffers:(NSArray *)nativeSamples forItemTime:(CMTime)itemTime;
     146#endif
    119147@end
    120148
     
    163191    , m_loaderDelegate(AdoptNS, [[WebCoreAVFLoaderDelegate alloc] initWithCallback:this])
    164192#endif
     193#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     194    , m_currentTrack(0)
     195#endif
    165196{
    166197}
     
    185216        m_avAsset = nil;
    186217    }
     218
     219#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     220    if (m_legibleOutput) {
     221        if (m_avPlayerItem)
     222            [m_avPlayerItem.get() removeOutput:m_legibleOutput.get()];
     223        m_legibleOutput = nil;
     224    }
     225#endif
    187226    if (m_avPlayerItem) {
    188227        for (NSString *keyName in itemKVOProperties())
     
    347386    m_avPlayer.adoptNS([[AVPlayer alloc] init]);
    348387    [m_avPlayer.get() addObserver:m_objcObserver.get() forKeyPath:@"rate" options:nil context:(void *)MediaPlayerAVFoundationObservationContextPlayer];
     388
     389#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     390    [m_avPlayer.get() setAppliesMediaSelectionCriteriaAutomatically:YES];
     391#endif
    349392   
     393
    350394    if (m_avPlayerItem)
    351395        [m_avPlayer.get() replaceCurrentItemWithPlayerItem:m_avPlayerItem.get()];
     
    841885        return;
    842886
     887#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     888    if (m_avPlayerItem && !m_legibleOutput) {
     889        m_legibleOutput = adoptNS([[AVPlayerItemLegibleOutput alloc] initWithMediaSubtypesForNativeRepresentation:nil]);
     890        [m_legibleOutput.get() setSuppressesPlayerRendering:YES];
     891
     892        // We enabled automatic media selection because we want alternate audio tracks to be enabled/disabled automatically,
     893        // but set the selected legible track to nil so text tracks will not be automatically configured.
     894        [m_avPlayerItem.get() selectMediaOption:nil inMediaSelectionGroup:[m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible]];
     895
     896        [m_legibleOutput.get() setDelegate:m_objcObserver.get() queue:dispatch_get_main_queue()];
     897        [m_legibleOutput.get() setAdvanceIntervalForDelegateInvocation:NSTimeIntervalSince1970];
     898        [m_avPlayerItem.get() addOutput:m_legibleOutput.get()];
     899    }
     900#endif
     901
     902    bool hasCaptions = false;
     903
    843904    // This is called whenever the tracks collection changes so cache hasVideo and hasAudio since we are
    844905    // asked about those fairly fequently.
     
    848909        setHasVideo([[m_avAsset.get() tracksWithMediaCharacteristic:AVMediaCharacteristicVisual] count]);
    849910        setHasAudio([[m_avAsset.get() tracksWithMediaCharacteristic:AVMediaCharacteristicAudible] count]);
    850         setHasClosedCaptions([[m_avAsset.get() tracksWithMediaType:AVMediaTypeClosedCaption] count]);
     911        hasCaptions = [[m_avAsset.get() tracksWithMediaType:AVMediaTypeClosedCaption] count];
    851912    } else {
    852913        bool hasVideo = false;
    853914        bool hasAudio = false;
    854         bool hasCaptions = false;
    855915        NSArray *tracks = [m_avPlayerItem.get() tracks];
    856916        for (AVPlayerItemTrack *track in tracks) {
     
    867927        setHasVideo(hasVideo);
    868928        setHasAudio(hasAudio);
    869         setHasClosedCaptions(hasCaptions);
    870     }
    871 
    872     LOG(Media, "WebCoreAVFMovieObserver:tracksChanged(%p) - hasVideo = %s, hasAudio = %s, hasCaptions = %s",
     929    }
     930
     931#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     932    if (!hasCaptions) {
     933        AVMediaSelectionGroupType *legibleGroup = [m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
     934        hasCaptions = [[AVMediaSelectionGroup playableMediaSelectionOptionsFromArray:[legibleGroup options]] count];
     935    }
     936    if (hasCaptions)
     937        processTextTracks();
     938#endif
     939
     940    setHasClosedCaptions(hasCaptions);
     941
     942    LOG(Media, "WebCoreAVFMovieObserver:tracksChanged(%p) - hasVideo = %s, hasAudio = %s, hasCaptions = %s",
    873943        this, boolString(hasVideo()), boolString(hasAudio()), boolString(hasClosedCaptions()));
    874944
     
    11211191}
    11221192#endif
     1193
     1194#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     1195   
     1196void MediaPlayerPrivateAVFoundationObjC::processTextTracks()
     1197{
     1198    AVMediaSelectionGroupType *legibleGroup = [m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
     1199    if (!legibleGroup) {
     1200        LOG(Media, "MediaPlayerPrivateAVFoundationObjC::processTextTracks(%p) - nil mediaSelectionGroup", this);
     1201        return;
     1202    }
     1203
     1204    Vector<RefPtr<InbandTextTrackPrivateAVF> > removedTextTracks = m_textTracks;
     1205    NSArray *legibleOptions = [AVMediaSelectionGroup playableMediaSelectionOptionsFromArray:[legibleGroup options]];
     1206    for (AVMediaSelectionOptionType *option in legibleOptions) {
     1207        bool newTrack = true;
     1208        for (unsigned i = removedTextTracks.size(); i > 0; --i) {
     1209            RefPtr<InbandTextTrackPrivateAVFObjC> track = static_cast<InbandTextTrackPrivateAVFObjC*>(removedTextTracks[i - 1].get());
     1210            if ([track->mediaSelectionOption() isEqual:option]) {
     1211                removedTextTracks.remove(i - 1);
     1212                newTrack = false;
     1213                break;
     1214            }
     1215        }
     1216        if (!newTrack)
     1217            continue;
     1218
     1219        if ([[option mediaType] isEqualToString:AVMediaTypeSubtitle]) {
     1220            if (![option hasMediaCharacteristic:AVMediaCharacteristicContainsOnlyForcedSubtitles]) {
     1221                AVMediaSelectionOptionType *forcedOnlyOption = [option associatedMediaSelectionOptionInMediaSelectionGroup:legibleGroup];
     1222                if (forcedOnlyOption)
     1223                    continue;
     1224            }
     1225        }
     1226
     1227        m_textTracks.append(InbandTextTrackPrivateAVFObjC::create(this, option));
     1228    }
     1229
     1230    if (removedTextTracks.size()) {
     1231        for (unsigned i = 0; i < m_textTracks.size(); ++i) {
     1232            RefPtr<InbandTextTrackPrivateAVF> track = static_cast<InbandTextTrackPrivateAVF*>(m_textTracks[i].get());
     1233           
     1234            if (!removedTextTracks.contains(track))
     1235                continue;
     1236   
     1237            player()->removeTextTrack(removedTextTracks[i].get());
     1238            m_textTracks.remove(i);
     1239        }
     1240    }
     1241
     1242    for (unsigned i = 0; i < m_textTracks.size(); ++i) {
     1243        RefPtr<InbandTextTrackPrivateAVF> track = static_cast<InbandTextTrackPrivateAVF*>(m_textTracks[i].get());
     1244
     1245        track->setTextTrackIndex(i);
     1246        if (track->hasBeenReported())
     1247            continue;
     1248
     1249        track->setHasBeenReported(true);
     1250        player()->addTextTrack(track.get());
     1251    }
     1252    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::processTextTracks(%p) - found %i media selection options", this, m_textTracks.size());
     1253}
     1254
     1255void MediaPlayerPrivateAVFoundationObjC::processCue(NSArray *attributedStrings, double time)
     1256{
     1257    if (!m_currentTrack)
     1258        return;
     1259
     1260    m_currentTrack->processCue(reinterpret_cast<CFArrayRef>(attributedStrings), time);
     1261}
     1262
     1263void MediaPlayerPrivateAVFoundationObjC::setCurrentTrack(InbandTextTrackPrivateAVF *track)
     1264{
     1265    InbandTextTrackPrivateAVFObjC* trackPrivate = static_cast<InbandTextTrackPrivateAVFObjC*>(track);
     1266    AVMediaSelectionOptionType *mediaSelectionOption = trackPrivate ? trackPrivate->mediaSelectionOption() : 0;
     1267
     1268    LOG(Media, "MediaPlayerPrivateAVFoundationObjC::setCurrentTrack(%p) - selecting media option %p", this, mediaSelectionOption);
     1269
     1270    [m_avPlayerItem.get() selectMediaOption:mediaSelectionOption inMediaSelectionGroup:[m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible]];
     1271    m_currentTrack = trackPrivate;
     1272}
     1273
     1274InbandTextTrackPrivateAVF* MediaPlayerPrivateAVFoundationObjC::currentTrack()
     1275{
     1276    return m_currentTrack;
     1277}
     1278#endif // HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
    11231279
    11241280NSArray* assetMetadataKeyNames()
     
    12471403}
    12481404
     1405#if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
     1406- (void)legibleOutput:(id)output didOutputAttributedStrings:(NSArray *)strings nativeSampleBuffers:(NSArray *)nativeSamples forItemTime:(CMTime)itemTime
     1407{
     1408    UNUSED_PARAM(output);
     1409    UNUSED_PARAM(nativeSamples);
     1410
     1411    if (!m_callback)
     1412        return;
     1413
     1414    dispatch_async(dispatch_get_main_queue(), ^{
     1415        m_callback->processCue(strings, CMTimeGetSeconds(itemTime));
     1416    });
     1417}
     1418#endif
     1419
    12491420@end
    12501421
Note: See TracChangeset for help on using the changeset viewer.