Changeset 148285 in webkit
- Timestamp:
- Apr 12, 2013, 10:23:42 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r148282 r148285 1 2013-04-12 Eric Carlson <eric.carlson@apple.com> 2 3 Support "forced" subtitles 4 https://bugs.webkit.org/show_bug.cgi?id=114460 5 6 Reviewed by Jer Noble. 7 8 * media/content/CC+Subtitles.m4v: Added. 9 * media/track/track-forced-subtitles-in-band-expected.txt: Added. 10 * media/track/track-forced-subtitles-in-band.html: Added. 11 * media/trackmenu-test.js: 12 13 * platform/efl/TestExpectations: Skip new test. 14 * platform/gtk/TestExpectations: Ditto. 15 * platform/mac/TestExpectations: Ditto. 16 * platform/qt/TestExpectations: Ditto. 17 * platform/win/TestExpectations: Ditto. 18 1 19 2013-04-12 Ryosuke Niwa <rniwa@webkit.org> 2 20 -
trunk/LayoutTests/media/trackmenu-test.js
r147675 r148285 1 var captionsButtonCoordinates ;1 var captionsButtonCoordinates = null; 2 2 3 3 function clickCCButton() 4 4 { 5 if (!captionsButtonCoordinates) { 6 try { 7 captionsButtonCoordinates = mediaControlsButtonCoordinates(video, "toggle-closed-captions-button"); 8 } catch (exception) { 9 failTest(exception.description); 10 return; 11 } 12 } 13 5 14 eventSender.mouseMoveTo(captionsButtonCoordinates[0], captionsButtonCoordinates[1]); 6 15 eventSender.mouseDown(); … … 14 23 run("internals.setUserPreferredLanguages(['en'])"); 15 24 16 try {17 captionsButtonCoordinates = mediaControlsButtonCoordinates(video, "toggle-closed-captions-button");18 } catch (exception) {19 failTest(exception.description);20 return;21 }22 25 clickCCButton(); 23 26 window.setTimeout(testFunction, 100); -
trunk/LayoutTests/platform/efl/TestExpectations
r148282 r148285 1638 1638 Bug(EFL) media/track/track-in-band-style.html [ Skip ] 1639 1639 Bug(EFL) media/track/track-in-band-legacy-api.html [ Skip ] 1640 Bug(EFL) media/track/track-forced-subtitles-in-band.html [ Skip ] 1640 1641 1641 1642 # All debug bots timeout (crash) on this one -
trunk/LayoutTests/platform/gtk/TestExpectations
r148282 r148285 404 404 webkit.org/b/103771 media/track/track-in-band-style.html [ Timeout ] 405 405 webkit.org/b/103771 media/track/track-in-band-legacy-api.html [ Failure ] 406 webkit.org/b/103771 media/track/track-forced-subtitles-in-band.html [ Failure ] 406 407 407 408 #Incorrect rebaseline -
trunk/LayoutTests/platform/mac/TestExpectations
r148282 r148285 1367 1367 webkit.org/b/103663 [ MountainLion Lion SnowLeopard ] media/track/track-in-band-style.html 1368 1368 webkit.org/b/103663 [ MountainLion Lion SnowLeopard ] media/track/track-in-band-legacy-api.html 1369 webkit.org/b/103663 [ MountainLion Lion SnowLeopard ] media/track/track-forced-subtitles-in-band.html 1369 1370 1370 1371 # These two tests sometimes timeout -
trunk/LayoutTests/platform/qt/TestExpectations
r148282 r148285 2624 2624 webkit.org/b/103769 media/track/track-in-band-style.html [ Skip ] 2625 2625 webkit.org/b/103769 media/track/track-in-band-legacy-api.html [ Skip ] 2626 webkit.org/b/103769 media/track/track-forced-subtitles-in-band.html [ Skip ] 2626 2627 2627 2628 webkit.org/b/104150 fast/media/implicit-media-all.html [ ImageOnlyFailure ] -
trunk/LayoutTests/platform/win/TestExpectations
r148282 r148285 2540 2540 webkit.org/b/103770 media/track/track-in-band-style.html [ Skip ] 2541 2541 webkit.org/b/103770 media/track/track-in-band-legacy-api.html [ Skip ] 2542 webkit.org/b/103770 media/track/track-forced-subtitles-in-band.html [ Skip ] 2542 2543 2543 2544 # https://bugs.webkit.org/show_bug.cgi?id=97026 -
trunk/Source/WebCore/ChangeLog
r148283 r148285 1 2013-04-12 Eric Carlson <eric.carlson@apple.com> 2 3 Support "forced" subtitles 4 https://bugs.webkit.org/show_bug.cgi?id=114460 5 6 Reviewed by Jer Noble. 7 8 Test: media/track/track-forced-subtitles.html 9 10 * html/HTMLMediaElement.cpp: 11 (WebCore::HTMLMediaElement::configureTextTrackGroup): Enable a forced track if nothing else is enabled. 12 (WebCore::HTMLMediaElement::configureTextTracks): Include forced tracks with captions+subtitles. 13 14 * html/track/InbandTextTrack.cpp: 15 (WebCore::InbandTextTrack::InbandTextTrack): Deal with kind=forced. 16 17 * html/track/TextTrack.cpp: 18 (WebCore::TextTrack::forcedKeyword): New keyword. 19 (WebCore::TextTrack::isValidKindKeyword): Include forced. 20 (WebCore::TextTrack::platformTextTrack): Ditto. 21 * html/track/TextTrack.h: 22 23 * page/CaptionUserPreferences.cpp: 24 (WebCore::CaptionUserPreferences::primaryAudioTrackLanguageOverride): New override to support testing. 25 * page/CaptionUserPreferences.h: 26 27 * page/CaptionUserPreferencesMac.mm: 28 (WebCore::CaptionUserPreferencesMac::textTrackSelectionScore): Support forced tracks. 29 * platform/graphics/InbandTextTrackPrivate.h: 30 31 * platform/graphics/PlatformTextTrack.h: Add Forced, minor cleanup. 32 33 * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp: 34 (WebCore::InbandTextTrackPrivateAVF::processCue): Drive-by enhancement: log cue position. 35 36 * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm: 37 (WebCore::InbandTextTrackPrivateAVFObjC::kind): Support forced. 38 (WebCore::InbandTextTrackPrivateAVFObjC::label): Drive-by cleanup. 39 40 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: 41 (WebCore::MediaPlayerPrivateAVFoundationObjC::processTextTracks): Don't filter out forced tracks. 42 (WebCore::MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack): Log the language returned. 43 44 * testing/Internals.cpp: 45 (WebCore::Internals::setPrimaryAudioTrackLanguageOverride): New. 46 (WebCore::Internals::setCaptionDisplayMode): New. 47 * testing/Internals.h: 48 * testing/Internals.idl: 49 1 50 2013-04-12 Ryosuke Niwa <rniwa@webkit.org> 2 51 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r148099 r148285 3075 3075 RefPtr<TextTrack> defaultTrack; 3076 3076 RefPtr<TextTrack> fallbackTrack; 3077 RefPtr<TextTrack> forcedSubitleTrack; 3077 3078 int highestTrackScore = 0; 3079 int highestForcedScore = 0; 3078 3080 for (size_t i = 0; i < group.tracks.size(); ++i) { 3079 3081 RefPtr<TextTrack> textTrack = group.tracks[i]; … … 3102 3104 if (!defaultTrack && !fallbackTrack) 3103 3105 fallbackTrack = textTrack; 3106 if (textTrack->containsOnlyForcedSubtitles() && trackScore > highestForcedScore) { 3107 forcedSubitleTrack = textTrack; 3108 highestForcedScore = trackScore; 3109 } 3104 3110 } else if (!group.visibleTrack && !defaultTrack && textTrack->isDefault()) { 3105 3111 // * If the track element has a default attribute specified, and there is no other text track in the media … … 3112 3118 if (!trackToEnable && defaultTrack) 3113 3119 trackToEnable = defaultTrack; 3120 3121 // If no track matches the user's preferred language, none was marked as 'default', and there is a forced subtitle track 3122 // in the same language as the language of the primary audio track, enable it. 3123 if (!trackToEnable && forcedSubitleTrack) 3124 trackToEnable = forcedSubitleTrack; 3114 3125 3115 3126 // If no track matches the user's preferred language and non was marked 'default', enable the first track … … 3190 3201 String kind = textTrack->kind(); 3191 3202 TrackGroup* currentGroup; 3192 if (kind == TextTrack::subtitlesKeyword() || kind == TextTrack::captionsKeyword() )3203 if (kind == TextTrack::subtitlesKeyword() || kind == TextTrack::captionsKeyword() || kind == TextTrack::forcedKeyword()) 3193 3204 currentGroup = &captionAndSubtitleTracks; 3194 3205 else if (kind == TextTrack::descriptionsKeyword()) -
trunk/Source/WebCore/html/track/InbandTextTrack.cpp
r146380 r148285 69 69 case InbandTextTrackPrivate::Metadata: 70 70 setKind(TextTrack::metadataKeyword()); 71 break; 72 case InbandTextTrackPrivate::Forced: 73 setKind(TextTrack::forcedKeyword()); 71 74 break; 72 75 case InbandTextTrackPrivate::None: -
trunk/Source/WebCore/html/track/TextTrack.cpp
r147675 r148285 77 77 return metadata; 78 78 } 79 80 const AtomicString& TextTrack::forcedKeyword() 81 { 82 DEFINE_STATIC_LOCAL(const AtomicString, forced, ("forced", AtomicString::ConstructFromLiteral)); 83 return forced; 84 } 79 85 80 86 const AtomicString& TextTrack::disabledKeyword() … … 156 162 if (value == metadataKeyword()) 157 163 return true; 164 if (value == forcedKeyword()) 165 return true; 158 166 159 167 return false; … … 514 522 else if (m_kind == metadataKeyword()) 515 523 kind = PlatformTextTrack::MetaData; 524 else if (m_kind == forcedKeyword()) 525 kind = PlatformTextTrack::Forced; 516 526 517 527 PlatformTextTrack::TrackType type = PlatformTextTrack::OutOfBand; -
trunk/Source/WebCore/html/track/TextTrack.h
r147675 r148285 88 88 static const AtomicString& chaptersKeyword(); 89 89 static const AtomicString& metadataKeyword(); 90 static const AtomicString& forcedKeyword(); 90 91 static bool isValidKindKeyword(const AtomicString&); 91 92 -
trunk/Source/WebCore/page/CaptionUserPreferences.cpp
r148050 r148285 245 245 } 246 246 247 String CaptionUserPreferences::primaryAudioTrackLanguageOverride() const 248 { 249 if (!m_primaryAudioTrackLanguageOverride.isEmpty()) 250 return m_primaryAudioTrackLanguageOverride; 251 return defaultLanguage(); 252 } 247 253 248 254 } -
trunk/Source/WebCore/page/CaptionUserPreferences.h
r148050 r148285 82 82 virtual Vector<RefPtr<TextTrack> > sortedTrackListForMenu(TextTrackList*); 83 83 84 void setPrimaryAudioTrackLanguageOverride(const String& language) { m_primaryAudioTrackLanguageOverride = language; } 85 String primaryAudioTrackLanguageOverride() const; 86 84 87 virtual bool testingMode() const { return m_testingMode; } 85 88 virtual void setTestingMode(bool override) { m_testingMode = override; } … … 100 103 String m_userPreferredLanguage; 101 104 String m_captionsStyleSheetOverride; 105 String m_primaryAudioTrackLanguageOverride; 102 106 bool m_testingMode; 103 107 bool m_havePreferences; -
trunk/Source/WebCore/page/CaptionUserPreferencesMac.mm
r148050 r148285 620 620 { 621 621 CaptionDisplayMode displayMode = captionDisplayMode(); 622 if (displayMode == ForcedOnly)623 return 0;624 622 if (displayMode == AlwaysOn && (!userPrefersSubtitles() && !userPrefersCaptions())) 625 623 return 0; 626 if (track->kind() != TextTrack::captionsKeyword() && track->kind() != TextTrack::subtitlesKeyword()) 627 return 0; 628 if (track->containsOnlyForcedSubtitles()) 624 if (track->kind() != TextTrack::captionsKeyword() && track->kind() != TextTrack::subtitlesKeyword() && track->kind() != TextTrack::forcedKeyword()) 629 625 return 0; 630 626 if (!track->isMainProgramContent()) 631 627 return 0; 628 if (displayMode == ForcedOnly && !track->containsOnlyForcedSubtitles()) 629 return 0; 632 630 633 631 Vector<String> userPreferredCaptionLanguages = preferredLanguages(); 634 632 635 if (displayMode == Automatic) { 636 637 // Only enable a text track if the current audio track is not in the user's preferred language. 633 if (displayMode == Automatic || track->containsOnlyForcedSubtitles()) { 634 638 635 if (!mediaElement || !mediaElement->player()) 639 636 return 0; 640 637 641 String audioTrackLanguage = mediaElement->player()->languageOfPrimaryAudioTrack(); 638 String audioTrackLanguage; 639 640 Vector<String> languageList; 641 languageList.reserveCapacity(1); 642 643 if (testingMode()) 644 audioTrackLanguage = primaryAudioTrackLanguageOverride(); 645 else 646 audioTrackLanguage = mediaElement->player()->languageOfPrimaryAudioTrack(); 642 647 643 648 if (audioTrackLanguage.isEmpty()) 644 649 return 0; 645 650 646 Vector<String> languages; 647 languages.append(defaultLanguage()); 648 size_t offset = indexOfBestMatchingLanguageInList(audioTrackLanguage, languages); 649 if (!offset) 650 return 0; 651 652 userPreferredCaptionLanguages = languages; 651 if (displayMode == Automatic) { 652 // Only enable a text track if the current audio track is not in the user's preferred language. 653 languageList.append(defaultLanguage()); 654 size_t offset = indexOfBestMatchingLanguageInList(audioTrackLanguage, languageList); 655 if (offset) 656 return 0; 657 } else { 658 // Only consider a forced-only track if it is in the same language as the primary audio track. 659 String trackLanguage = track->language(); 660 if (trackLanguage.isEmpty()) 661 return 0; 662 663 languageList.append(audioTrackLanguage); 664 size_t offset = indexOfBestMatchingLanguageInList(trackLanguage, languageList); 665 if (offset) 666 return 0; 667 } 668 669 userPreferredCaptionLanguages = languageList; 653 670 } 654 671 -
trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivate.h
r146380 r148285 50 50 InbandTextTrackPrivateClient* client() { return m_client; } 51 51 52 enum Mode { Disabled, Hidden, Showing }; 52 enum Mode { 53 Disabled, 54 Hidden, 55 Showing 56 }; 53 57 virtual void setMode(Mode mode) { m_mode = mode; }; 54 58 virtual InbandTextTrackPrivate::Mode mode() const { return m_mode; } 55 59 56 enum Kind { Subtitles, Captions, Descriptions, Chapters, Metadata, None }; 60 enum Kind { 61 Subtitles, 62 Captions, 63 Descriptions, 64 Chapters, 65 Metadata, 66 Forced, 67 None 68 }; 57 69 virtual Kind kind() const { return Subtitles; } 58 70 virtual bool isClosedCaptions() const { return false; } -
trunk/Source/WebCore/platform/graphics/PlatformTextTrack.h
r145322 r148285 47 47 class PlatformTextTrack : public RefCounted<PlatformTextTrack> { 48 48 public: 49 enum TrackKind { Subtitle = 0, Caption = 1, Description = 2, Chapter = 3, MetaData = 4 }; 50 enum TrackType { InBand = 0, OutOfBand = 1, Script = 2 }; 49 enum TrackKind { 50 Subtitle = 0, 51 Caption = 1, 52 Description = 2, 53 Chapter = 3, 54 MetaData = 4, 55 Forced = 5, 56 }; 57 enum TrackType { 58 InBand = 0, 59 OutOfBand = 1, 60 Script = 2 61 }; 51 62 52 63 static PassRefPtr<PlatformTextTrack> create(PlatformTextTrackClient* client, const String& label, const String& language, TrackKind kind, TrackType type) -
trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp
r145326 r148285 357 357 cueData->setPosition(cueData->position() - cueData->size() / 2); 358 358 359 LOG(Media, "InbandTextTrackPrivateAVF::processCue(%p) - adding cue for time %.2f", this, cueData->startTime());359 LOG(Media, "InbandTextTrackPrivateAVF::processCue(%p) - adding cue for time = %.2f, position = %.2f, line = %.2f", this, cueData->startTime(), cueData->position(), cueData->line()); 360 360 client()->addGenericCue(this, cueData); 361 361 } -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm
r146380 r148285 100 100 101 101 NSString *mediaType = [m_mediaSelectionOption mediaType]; 102 102 103 if ([mediaType isEqualToString:AVMediaTypeClosedCaption]) 103 104 return Captions; 104 105 if ([mediaType isEqualToString:AVMediaTypeSubtitle]) { 106 107 if ([m_mediaSelectionOption hasMediaCharacteristic:AVMediaCharacteristicContainsOnlyForcedSubtitles]) 108 return Forced; 105 109 106 110 // An "SDH" track is a subtitle track created for the deaf or hard-of-hearing. "captions" in WebVTT are … … 154 158 return emptyAtom; 155 159 160 NSString *title = 0; 161 156 162 NSArray *titles = [AVMetadataItem metadataItemsFromArray:[m_mediaSelectionOption.get() commonMetadata] withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon]; 157 163 if ([titles count]) { … … 159 165 NSArray *titlesForPreferredLanguages = [AVMetadataItem metadataItemsFromArray:titles filteredAndSortedAccordingToPreferredLanguages:[NSLocale preferredLanguages]]; 160 166 if ([titlesForPreferredLanguages count]) 161 return[[titlesForPreferredLanguages objectAtIndex:0] stringValue];167 title = [[titlesForPreferredLanguages objectAtIndex:0] stringValue]; 162 168 163 return [[titles objectAtIndex:0] stringValue]; 169 if (!title) 170 title = [[titles objectAtIndex:0] stringValue]; 164 171 } 165 172 166 return emptyAtom;173 return title ? AtomicString(title) : emptyAtom; 167 174 } 168 175 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
r148140 r148285 1332 1332 continue; 1333 1333 1334 if ([[option mediaType] isEqualToString:AVMediaTypeSubtitle] && [option hasMediaCharacteristic:AVMediaCharacteristicContainsOnlyForcedSubtitles])1335 continue;1336 1337 1334 m_textTracks.append(InbandTextTrackPrivateAVFObjC::create(this, option)); 1338 1335 } … … 1405 1402 if (currentlySelectedAudibleOption) { 1406 1403 m_languageOfPrimaryAudioTrack = [[currentlySelectedAudibleOption locale] localeIdentifier]; 1404 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - returning language of selected audible option: %s", this, m_languageOfPrimaryAudioTrack.utf8().data()); 1405 1407 1406 return m_languageOfPrimaryAudioTrack; 1408 1407 } … … 1414 1413 if (!tracks || [tracks count] != 1) { 1415 1414 m_languageOfPrimaryAudioTrack = emptyString(); 1415 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - %i audio tracks, returning emptyString()", this, (tracks ? [tracks count] : 0)); 1416 1416 return m_languageOfPrimaryAudioTrack; 1417 1417 } … … 1423 1423 if (language && ![language isEqualToString:@"und"]) { 1424 1424 m_languageOfPrimaryAudioTrack = language; 1425 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - returning language of single audio track: %s", this, m_languageOfPrimaryAudioTrack.utf8().data()); 1425 1426 return m_languageOfPrimaryAudioTrack; 1426 1427 } 1427 1428 1429 LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - single audio track has no language, returning emptyString()", this); 1428 1430 m_languageOfPrimaryAudioTrack = emptyString(); 1429 1431 return m_languageOfPrimaryAudioTrack; -
trunk/Source/WebCore/testing/Internals.cpp
r148282 r148285 2203 2203 } 2204 2204 2205 } 2205 void Internals::setPrimaryAudioTrackLanguageOverride(const String& language, ExceptionCode& ec) 2206 { 2207 Document* document = contextDocument(); 2208 if (!document || !document->page()) { 2209 ec = INVALID_ACCESS_ERR; 2210 return; 2211 } 2212 2213 #if ENABLE(VIDEO_TRACK) && !PLATFORM(WIN) 2214 document->page()->group().captionPreferences()->setPrimaryAudioTrackLanguageOverride(language); 2215 #else 2216 UNUSED_PARAM(language); 2217 #endif 2218 } 2219 2220 void Internals::setCaptionDisplayMode(const String& mode, ExceptionCode& ec) 2221 { 2222 Document* document = contextDocument(); 2223 if (!document || !document->page()) { 2224 ec = INVALID_ACCESS_ERR; 2225 return; 2226 } 2227 2228 #if ENABLE(VIDEO_TRACK) && !PLATFORM(WIN) 2229 CaptionUserPreferences* captionPreferences = document->page()->group().captionPreferences(); 2230 2231 if (equalIgnoringCase(mode, "Automatic")) 2232 captionPreferences->setCaptionDisplayMode(CaptionUserPreferences::Automatic); 2233 else if (equalIgnoringCase(mode, "ForcedOnly")) 2234 captionPreferences->setCaptionDisplayMode(CaptionUserPreferences::ForcedOnly); 2235 else if (equalIgnoringCase(mode, "AlwaysOn")) 2236 captionPreferences->setCaptionDisplayMode(CaptionUserPreferences::AlwaysOn); 2237 else 2238 ec = SYNTAX_ERR; 2239 #else 2240 UNUSED_PARAM(mode); 2241 #endif 2242 } 2243 2244 } -
trunk/Source/WebCore/testing/Internals.h
r148282 r148285 319 319 String captionsStyleSheetOverride(ExceptionCode&); 320 320 void setCaptionsStyleSheetOverride(const String&, ExceptionCode&); 321 void setPrimaryAudioTrackLanguageOverride(const String&, ExceptionCode&); 322 void setCaptionDisplayMode(const String&, ExceptionCode&); 321 323 322 324 private: -
trunk/Source/WebCore/testing/Internals.idl
r148282 r148285 280 280 [Conditional=VIDEO_TRACK] DOMString captionsStyleSheetOverride() raises (DOMException); 281 281 [Conditional=VIDEO_TRACK] void setCaptionsStyleSheetOverride(in DOMString override) raises (DOMException); 282 [Conditional=VIDEO_TRACK] void setPrimaryAudioTrackLanguageOverride(in DOMString language) raises(DOMException); 283 [Conditional=VIDEO_TRACK] void setCaptionDisplayMode(in DOMString mode) raises (DOMException); 282 284 283 285 boolean isSelectPopupVisible(in Node node);
Note:
See TracChangeset
for help on using the changeset viewer.