Changeset 156652 in webkit


Ignore:
Timestamp:
Sep 30, 2013 8:17:28 AM (11 years ago)
Author:
jer.noble@apple.com
Message:

[Mac] Add AudioTrack support to MediaPlayerPrivateAVFObC.
https://bugs.webkit.org/show_bug.cgi?id=122043

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/track/audio-track.html

Add a new class AudioTrackPrivateAVF and subclass AudioTrackPrivateAVFObjC
which are backed by a AVPlayerItemTrack. Create one of these tracks when
we are notified that the list of available tracks has changed.

  • WebCore.xcodeproj/project.pbxproj:
  • html/track/AudioTrack.cpp:

(WebCore::AudioTrack::setEnabled): Pass through to the AudioTrackPrivate

so that the underlying media track can be (dis|en)abled.

  • platform/graphics/avfoundation/AudioTrackPrivateAVF.h: Added.

(WebCore::AudioTrackPrivateAVF::kind): Simple getter.
(WebCore::AudioTrackPrivateAVF::id): Ditto.
(WebCore::AudioTrackPrivateAVF::label): Ditto.
(WebCore::AudioTrackPrivateAVF::language): Ditto.
(WebCore::AudioTrackPrivateAVF::setKind): Simple Setter.
(WebCore::AudioTrackPrivateAVF::setId): Ditto.
(WebCore::AudioTrackPrivateAVF::setLabel): Ditto.
(WebCore::AudioTrackPrivateAVF::setLanguage): Ditto.
(WebCore::AudioTrackPrivateAVF::AudioTrackPrivateAVF): Simple constructor.

  • platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h: Added.

(WebCore::AudioTrackPrivateAVFObjC::create): Simple factory.
(WebCore::AudioTrackPrivateAVFObjC::playerItemTrack): Simple getter.

  • platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: Added.

(WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): Call resetPropertiesFromTrack.
(WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): Fill out the values from

the associated AVPlayerItemTrack and its AVAssetTrack.

(WebCore::AudioTrackPrivateAVFObjC::setPlayerItemTrack): Call resetPropertiesFromTrack.
(WebCore::AudioTrackPrivateAVFObjC::setEnabled): (En|Dis)able the AVPlayerItemTrack.
(WebCore::AudioTrackPrivateAVFObjC::languageForAVAssetTrack): Refactored from

MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack.

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

(WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Determine which tracks

have been added or removed and notify the clients accordingly.

(WebCore::MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack): Refactor into

AudioTrackPrivateAVFObjC::languageForAVAssetTrack.

LayoutTests:

  • media/track/audio-track-expected.txt: Added.
  • media/track/audio-track.html: Added.
Location:
trunk
Files:
5 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r156651 r156652  
     12013-09-27  Jer Noble  <jer.noble@apple.com>
     2
     3        [Mac] Add AudioTrack support to MediaPlayerPrivateAVFObC.
     4        https://bugs.webkit.org/show_bug.cgi?id=122043
     5
     6        Reviewed by Eric Carlson.
     7
     8        * media/track/audio-track-expected.txt: Added.
     9        * media/track/audio-track.html: Added.
     10
    1112013-09-30  Robert Plociennik  <r.plociennik@samsung.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r156642 r156652  
     12013-09-27  Jer Noble  <jer.noble@apple.com>
     2
     3        [Mac] Add AudioTrack support to MediaPlayerPrivateAVFObC.
     4        https://bugs.webkit.org/show_bug.cgi?id=122043
     5
     6        Reviewed by Eric Carlson.
     7
     8        Test: media/track/audio-track.html
     9
     10        Add a new class AudioTrackPrivateAVF and subclass AudioTrackPrivateAVFObjC
     11        which are backed by a AVPlayerItemTrack. Create one of these tracks when
     12        we are notified that the list of available tracks has changed.
     13
     14        * WebCore.xcodeproj/project.pbxproj:
     15        * html/track/AudioTrack.cpp:
     16        (WebCore::AudioTrack::setEnabled): Pass through to the AudioTrackPrivate
     17            so that the underlying media track can be (dis|en)abled.
     18        * platform/graphics/avfoundation/AudioTrackPrivateAVF.h: Added.
     19        (WebCore::AudioTrackPrivateAVF::kind): Simple getter.
     20        (WebCore::AudioTrackPrivateAVF::id): Ditto.
     21        (WebCore::AudioTrackPrivateAVF::label): Ditto.
     22        (WebCore::AudioTrackPrivateAVF::language): Ditto.
     23        (WebCore::AudioTrackPrivateAVF::setKind): Simple Setter.
     24        (WebCore::AudioTrackPrivateAVF::setId): Ditto.
     25        (WebCore::AudioTrackPrivateAVF::setLabel): Ditto.
     26        (WebCore::AudioTrackPrivateAVF::setLanguage): Ditto.
     27        (WebCore::AudioTrackPrivateAVF::AudioTrackPrivateAVF): Simple constructor.
     28        * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h: Added.
     29        (WebCore::AudioTrackPrivateAVFObjC::create): Simple factory.
     30        (WebCore::AudioTrackPrivateAVFObjC::playerItemTrack): Simple getter.
     31        * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: Added.
     32        (WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): Call resetPropertiesFromTrack.
     33        (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): Fill out the values from
     34            the associated AVPlayerItemTrack and its AVAssetTrack.
     35        (WebCore::AudioTrackPrivateAVFObjC::setPlayerItemTrack): Call resetPropertiesFromTrack.
     36        (WebCore::AudioTrackPrivateAVFObjC::setEnabled): (En|Dis)able the AVPlayerItemTrack.
     37        (WebCore::AudioTrackPrivateAVFObjC::languageForAVAssetTrack): Refactored from
     38            MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack.
     39        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
     40        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     41        (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Determine which tracks
     42            have been added or removed and notify the clients accordingly.
     43        (WebCore::MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack): Refactor into
     44            AudioTrackPrivateAVFObjC::languageForAVAssetTrack.
     45
    1462013-09-30  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
    247
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r156615 r156652  
    53845384                CDC69DDB16371FD4007C38DF /* WebCoreFullScreenPlaceholderView.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDC69DD916371FD3007C38DF /* WebCoreFullScreenPlaceholderView.mm */; };
    53855385                CDD525D7145B6DD0008D204D /* JSHTMLMediaElementCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDF65CCC145B6AFE00C4C7AA /* JSHTMLMediaElementCustom.cpp */; };
     5386                CDE3A85417F5FCE600C5BE20 /* AudioTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE3A85217F5FCE600C5BE20 /* AudioTrackPrivateAVF.h */; };
     5387                CDE3A85717F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDE3A85517F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm */; };
     5388                CDE3A85817F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE3A85617F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h */; };
    53865389                CDEA763014608A53008B31F1 /* PlatformClockCA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA762E146084DE008B31F1 /* PlatformClockCA.cpp */; };
    53875390                CDEA76341460B56F008B31F1 /* ClockGeneric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA76321460AE29008B31F1 /* ClockGeneric.cpp */; };
     
    1234212345                CDCE5CD014633BC900D47CCA /* EventTargetFactory.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventTargetFactory.in; sourceTree = "<group>"; };
    1234312346                CDD1E525167BA56400CE820B /* TextTrackRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackRepresentation.h; sourceTree = "<group>"; };
     12347                CDE3A85217F5FCE600C5BE20 /* AudioTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateAVF.h; sourceTree = "<group>"; };
     12348                CDE3A85517F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AudioTrackPrivateAVFObjC.mm; path = objc/AudioTrackPrivateAVFObjC.mm; sourceTree = "<group>"; };
     12349                CDE3A85617F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioTrackPrivateAVFObjC.h; path = objc/AudioTrackPrivateAVFObjC.h; sourceTree = "<group>"; };
    1234412350                CDE6560E17CA6E7600526BA7 /* mediaControlsApple.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = mediaControlsApple.js; sourceTree = "<group>"; };
    1234512351                CDEA762C14608224008B31F1 /* Clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clock.h; sourceTree = "<group>"; };
     
    1348213488                        children = (
    1348313489                                DF9AFD6F13FC31B00015FEB7 /* objc */,
     13490                                CDE3A85217F5FCE600C5BE20 /* AudioTrackPrivateAVF.h */,
    1348413491                                07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */,
    1348513492                                07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */,
     
    2008820095                        isa = PBXGroup;
    2008920096                        children = (
     20097                                CDE3A85517F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm */,
     20098                                CDE3A85617F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h */,
    2009020099                                07AA6B69166D019500D45671 /* InbandTextTrackPrivateAVFObjC.h */,
    2009120100                                07AA6B6A166D019500D45671 /* InbandTextTrackPrivateAVFObjC.mm */,
     
    2158121590                                CE7B2DB31586ABAD0098B3FA /* AlternativeTextUIController.h in Headers */,
    2158221591                                FD31603E12B0267600C1A359 /* AnalyserNode.h in Headers */,
     21592                                CDE3A85817F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h in Headers */,
    2158321593                                490707E71219C04300D90E51 /* ANGLEWebKitBridge.h in Headers */,
    2158421594                                49E912AB0EFAC906009D0CAF /* Animation.h in Headers */,
     
    2424424254                                B22279BA0D00BF220071B782 /* SVGElementInstance.h in Headers */,
    2424524255                                B22279BD0D00BF220071B782 /* SVGElementInstanceList.h in Headers */,
     24256                                CDE3A85417F5FCE600C5BE20 /* AudioTrackPrivateAVF.h in Headers */,
    2424624257                                081AA8DA1111237E002AB06E /* SVGElementRareData.h in Headers */,
    2424724258                                B22279C00D00BF220071B782 /* SVGEllipseElement.h in Headers */,
     
    2739927410                                B22279AD0D00BF220071B782 /* SVGDefsElement.cpp in Sources */,
    2740027411                                B22279B00D00BF220071B782 /* SVGDescElement.cpp in Sources */,
     27412                                CDE3A85717F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm in Sources */,
    2740127413                                B22279B30D00BF220071B782 /* SVGDocument.cpp in Sources */,
    2740227414                                B28C6A270D00C44800334AA4 /* SVGDocumentExtensions.cpp in Sources */,
  • trunk/Source/WebCore/html/track/AudioTrack.cpp

    r148785 r156652  
    147147    m_enabled = enabled;
    148148
     149    m_private->setEnabled(enabled);
     150
    149151    if (m_client)
    150152        m_client->audioTrackEnabledChanged(this);
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h

    r156550 r156652  
    6060class WebCoreAVFResourceLoader;
    6161class InbandTextTrackPrivateAVFObjC;
     62class AudioTrackPrivateAVFObjC;
    6263
    6364class MediaPlayerPrivateAVFoundationObjC : public MediaPlayerPrivateAVFoundation {
     
    215216    RetainPtr<AVPlayerItemLegibleOutput> m_legibleOutput;
    216217#endif
    217    
     218
     219#if ENABLE(VIDEO_TRACK)
     220    Vector<RefPtr<AudioTrackPrivateAVFObjC>> m_audioTracks;
     221#endif
     222
    218223    InbandTextTrackPrivateAVF* m_currentTrack;
    219224};
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r156550 r156652  
    3030#import "MediaPlayerPrivateAVFoundationObjC.h"
    3131
     32#import "AudioTrackPrivateAVFObjC.h"
    3233#import "BlockExceptions.h"
    3334#import "ExceptionCodePlaceholder.h"
     
    10491050        setHasVideo(hasVideo);
    10501051        setHasAudio(hasAudio);
     1052
     1053
     1054#if ENABLE(VIDEO_TRACK)
     1055        RetainPtr<NSSet> audioTracks = adoptNS([[NSSet alloc] initWithArray:[tracks objectsAtIndexes:[tracks indexesOfObjectsPassingTest:^(id track, NSUInteger, BOOL*){
     1056            return [[[track assetTrack] mediaType] isEqualToString:AVMediaTypeAudio];
     1057        }]]]);
     1058        RetainPtr<NSMutableSet> oldAudioTracks = adoptNS([[NSMutableSet alloc] initWithCapacity:m_audioTracks.size()]);
     1059
     1060        typedef Vector<RefPtr<AudioTrackPrivateAVFObjC> > AudioTrackVector;
     1061        for (AudioTrackVector::iterator i = m_audioTracks.begin(); i != m_audioTracks.end(); ++i)
     1062            [oldAudioTracks.get() addObject:(*i)->playerItemTrack()];
     1063
     1064        RetainPtr<NSMutableSet> removedAVAudioTracks = adoptNS([oldAudioTracks.get() mutableCopy]);
     1065        [removedAVAudioTracks.get() minusSet:audioTracks.get()];
     1066
     1067        RetainPtr<NSMutableSet> addedAVAudioTracks = adoptNS([audioTracks.get() mutableCopy]);
     1068        [addedAVAudioTracks.get() minusSet:oldAudioTracks.get()];
     1069
     1070        AudioTrackVector replacementAudioTracks;
     1071        AudioTrackVector addedAudioTracks;
     1072        AudioTrackVector removedAudioTracks;
     1073        for (AudioTrackVector::iterator i = m_audioTracks.begin(); i != m_audioTracks.end(); ++i) {
     1074            if ([removedAVAudioTracks containsObject:(*i)->playerItemTrack()])
     1075                removedAudioTracks.append(*i);
     1076            else
     1077                replacementAudioTracks.append(*i);
     1078        }
     1079
     1080        for (AVPlayerItemTrack* playerItemTrack in addedAVAudioTracks.get())
     1081            addedAudioTracks.append(AudioTrackPrivateAVFObjC::create(playerItemTrack));
     1082
     1083        replacementAudioTracks.appendVector(addedAudioTracks);
     1084
     1085        m_audioTracks.swap(replacementAudioTracks);
     1086
     1087        for (AudioTrackVector::iterator i = removedAudioTracks.begin(); i != removedAudioTracks.end(); ++i)
     1088            player()->removeAudioTrack(*i);
     1089
     1090        for (AudioTrackVector::iterator i = addedAudioTracks.begin(); i != addedAudioTracks.end(); ++i)
     1091            player()->addAudioTrack(*i);
     1092#endif
    10511093    }
    10521094
     
    15261568
    15271569    AVAssetTrack *track = [tracks objectAtIndex:0];
    1528     NSString *language = [track extendedLanguageTag];
    1529 
    1530     // If the language code is stored as a QuickTime 5-bit packed code there aren't enough bits for a full
    1531     // RFC 4646 language tag so extendedLanguageTag returns NULL. In this case languageCode will return the
    1532     // ISO 639-2/T language code so check it.
    1533     if (!language)
    1534         language = [track languageCode];
    1535 
    1536     // Some legacy tracks have "und" as a language, treat that the same as no language at all.
    1537     if (language && ![language isEqualToString:@"und"]) {
    1538         m_languageOfPrimaryAudioTrack = language;
     1570    m_languageOfPrimaryAudioTrack = AudioTrackPrivateAVFObjC::languageForAVAssetTrack(track);
     1571
     1572#if !LOG_DISABLED
     1573    if (m_languageOfPrimaryAudioTrack == emptyString())
     1574        LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - single audio track has no language, returning emptyString()", this);
     1575    else
    15391576        LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - returning language of single audio track: %s", this, m_languageOfPrimaryAudioTrack.utf8().data());
    1540         return m_languageOfPrimaryAudioTrack;
    1541     }
    1542 
    1543     LOG(Media, "MediaPlayerPrivateAVFoundationObjC::languageOfPrimaryAudioTrack(%p) - single audio track has no language, returning emptyString()", this);
    1544     m_languageOfPrimaryAudioTrack = emptyString();
     1577#endif
     1578
    15451579    return m_languageOfPrimaryAudioTrack;
    15461580}
Note: See TracChangeset for help on using the changeset viewer.