Source/WebCore/ChangeLog

112013-09-27 Jer Noble <jer.noble@apple.com>
22
 3 [Mac] Add AudioTrack support to MediaPlayerPrivateAVFObC.
 4 https://bugs.webkit.org/show_bug.cgi?id=122043
 5
 6 Reviewed by NOBODY (OOPS!).
 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 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
 38 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
 39 (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Determine which tracks
 40 have been added or removed and notify the clients accordingly.
 41
 422013-09-27 Jer Noble <jer.noble@apple.com>
 43
344 REGRESSION(r156546): media/video-rtl.html is failing.
445 https://bugs.webkit.org/show_bug.cgi?id=122022
546

Source/WebCore/WebCore.xcodeproj/project.pbxproj

53845384 CDC69DDA16371FD4007C38DF /* WebCoreFullScreenPlaceholderView.h in Headers */ = {isa = PBXBuildFile; fileRef = CDC69DD816371FD3007C38DF /* WebCoreFullScreenPlaceholderView.h */; settings = {ATTRIBUTES = (Private, ); }; };
53855385 CDC69DDB16371FD4007C38DF /* WebCoreFullScreenPlaceholderView.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDC69DD916371FD3007C38DF /* WebCoreFullScreenPlaceholderView.mm */; };
53865386 CDD525D7145B6DD0008D204D /* JSHTMLMediaElementCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDF65CCC145B6AFE00C4C7AA /* JSHTMLMediaElementCustom.cpp */; };
 5387 CDE3A85417F5FCE600C5BE20 /* AudioTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE3A85217F5FCE600C5BE20 /* AudioTrackPrivateAVF.h */; };
 5388 CDE3A85717F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDE3A85517F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm */; };
 5389 CDE3A85817F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE3A85617F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h */; };
53875390 CDEA763014608A53008B31F1 /* PlatformClockCA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA762E146084DE008B31F1 /* PlatformClockCA.cpp */; };
53885391 CDEA76341460B56F008B31F1 /* ClockGeneric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA76321460AE29008B31F1 /* ClockGeneric.cpp */; };
53895392 CDEA76351460B71A008B31F1 /* Clock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA76331460B462008B31F1 /* Clock.cpp */; };

1234412347 CDC69DD916371FD3007C38DF /* WebCoreFullScreenPlaceholderView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebCoreFullScreenPlaceholderView.mm; sourceTree = "<group>"; };
1234512348 CDCE5CD014633BC900D47CCA /* EventTargetFactory.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventTargetFactory.in; sourceTree = "<group>"; };
1234612349 CDD1E525167BA56400CE820B /* TextTrackRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackRepresentation.h; sourceTree = "<group>"; };
 12350 CDE3A85217F5FCE600C5BE20 /* AudioTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateAVF.h; sourceTree = "<group>"; };
 12351 CDE3A85517F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AudioTrackPrivateAVFObjC.mm; path = objc/AudioTrackPrivateAVFObjC.mm; sourceTree = "<group>"; };
 12352 CDE3A85617F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioTrackPrivateAVFObjC.h; path = objc/AudioTrackPrivateAVFObjC.h; sourceTree = "<group>"; };
1234712353 CDE6560E17CA6E7600526BA7 /* mediaControlsApple.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = mediaControlsApple.js; sourceTree = "<group>"; };
1234812354 CDEA762C14608224008B31F1 /* Clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clock.h; sourceTree = "<group>"; };
1234912355 CDEA762E146084DE008B31F1 /* PlatformClockCA.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlatformClockCA.cpp; sourceTree = "<group>"; };

1348913495 07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */,
1349013496 076F0D0912B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.cpp */,
1349113497 076F0D0A12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h */,
 13498 CDE3A85217F5FCE600C5BE20 /* AudioTrackPrivateAVF.h */,
1349213499 );
1349313500 path = avfoundation;
1349413501 sourceTree = "<group>";

2010120108 DF9AFD7113FC31D80015FEB7 /* MediaPlayerPrivateAVFoundationObjC.mm */,
2010220109 CD7E05201651A84100C1201F /* WebCoreAVFResourceLoader.h */,
2010320110 CD7E05211651A84100C1201F /* WebCoreAVFResourceLoader.mm */,
 20111 CDE3A85517F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm */,
 20112 CDE3A85617F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h */,
2010420113 );
2010520114 name = objc;
2010620115 sourceTree = "<group>";

2158621595 CE08C3D2152B599A0021B8C2 /* AlternativeTextController.h in Headers */,
2158721596 CE7B2DB31586ABAD0098B3FA /* AlternativeTextUIController.h in Headers */,
2158821597 FD31603E12B0267600C1A359 /* AnalyserNode.h in Headers */,
 21598 CDE3A85817F6020400C5BE20 /* AudioTrackPrivateAVFObjC.h in Headers */,
2158921599 490707E71219C04300D90E51 /* ANGLEWebKitBridge.h in Headers */,
2159021600 49E912AB0EFAC906009D0CAF /* Animation.h in Headers */,
2159121601 316FE1120E6E1DA700BF6088 /* AnimationBase.h in Headers */,

2425024260 656581FE09D1508D000E61D7 /* SVGElementFactory.h in Headers */,
2425124261 B22279BA0D00BF220071B782 /* SVGElementInstance.h in Headers */,
2425224262 B22279BD0D00BF220071B782 /* SVGElementInstanceList.h in Headers */,
 24263 CDE3A85417F5FCE600C5BE20 /* AudioTrackPrivateAVF.h in Headers */,
2425324264 081AA8DA1111237E002AB06E /* SVGElementRareData.h in Headers */,
2425424265 B22279C00D00BF220071B782 /* SVGEllipseElement.h in Headers */,
2425524266 B22279C20D00BF220071B782 /* SVGException.h in Headers */,

2740627417 B22279A70D00BF220071B782 /* SVGCursorElement.cpp in Sources */,
2740727418 B22279AD0D00BF220071B782 /* SVGDefsElement.cpp in Sources */,
2740827419 B22279B00D00BF220071B782 /* SVGDescElement.cpp in Sources */,
 27420 CDE3A85717F6020400C5BE20 /* AudioTrackPrivateAVFObjC.mm in Sources */,
2740927421 B22279B30D00BF220071B782 /* SVGDocument.cpp in Sources */,
2741027422 B28C6A270D00C44800334AA4 /* SVGDocumentExtensions.cpp in Sources */,
2741127423 B22279B60D00BF220071B782 /* SVGElement.cpp in Sources */,

Source/WebCore/html/track/AudioTrack.cpp

@@void AudioTrack::setEnabled(const bool enabled)
146146
147147 m_enabled = enabled;
148148
 149 m_private->setEnabled(enabled);
 150
149151 if (m_client)
150152 m_client->audioTrackEnabledChanged(this);
151153}

Source/WebCore/platform/graphics/avfoundation/AudioTrackPrivateAVF.h

 1/*
 2 * Copyright (C) 2013 Apple Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 23 * THE POSSIBILITY OF SUCH DAMAGE.
 24 */
 25
 26#ifndef AudioTrackPrivateAVF_h
 27#define AudioTrackPrivateAVF_h
 28
 29#if ENABLE(VIDEO_TRACK)
 30
 31#include "AudioTrackPrivate.h"
 32
 33namespace WebCore {
 34
 35class AudioTrackPrivateAVF : public AudioTrackPrivate {
 36 WTF_MAKE_NONCOPYABLE(AudioTrackPrivateAVF)
 37public:
 38
 39 virtual Kind kind() const { return m_kind; }
 40 virtual AtomicString id() const { return m_id; }
 41 virtual AtomicString label() const { return m_label; }
 42 virtual AtomicString language() const { return m_language; }
 43
 44protected:
 45 void setKind(Kind kind) { m_kind = kind; }
 46 void setId(AtomicString newId) { m_id = newId; }
 47 void setLabel(AtomicString label) { m_label = label; }
 48 void setLanguage(AtomicString language) { m_language = language; }
 49
 50 Kind m_kind;
 51 AtomicString m_id;
 52 AtomicString m_label;
 53 AtomicString m_language;
 54
 55 AudioTrackPrivateAVF()
 56 : m_kind(None)
 57 {
 58 }
 59};
 60
 61}
 62
 63#endif // ENABLE(VIDEO_TRACK)
 64
 65#endif // AudioTrackPrivateAVF_h

Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h

 1/*
 2 * Copyright (C) 2013 Apple Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 23 * THE POSSIBILITY OF SUCH DAMAGE.
 24 */
 25
 26#ifndef AudioTrackPrivateAVFObjC_h
 27#define AudioTrackPrivateAVFObjC_h
 28
 29#if ENABLE(VIDEO_TRACK)
 30
 31#include "AudioTrackPrivateAVF.h"
 32#include <wtf/RetainPtr.h>
 33
 34OBJC_CLASS AVPlayerItemTrack;
 35
 36namespace WebCore {
 37
 38class AudioTrackPrivateAVFObjC : public AudioTrackPrivateAVF {
 39 WTF_MAKE_NONCOPYABLE(AudioTrackPrivateAVFObjC)
 40public:
 41 static RefPtr<AudioTrackPrivateAVFObjC> create(AVPlayerItemTrack* track)
 42 {
 43 return adoptRef(new AudioTrackPrivateAVFObjC(track));
 44 }
 45
 46 virtual void setEnabled(bool);
 47
 48 void setPlayerItemTrack(AVPlayerItemTrack*);
 49 AVPlayerItemTrack* playerItemTrack() { return m_playerItemTrack.get(); }
 50
 51private:
 52 AudioTrackPrivateAVFObjC(AVPlayerItemTrack*);
 53
 54 void resetPropertiesFromTrack();
 55
 56 RetainPtr<AVPlayerItemTrack> m_playerItemTrack;
 57};
 58
 59}
 60
 61#endif // ENABLE(VIDEO_TRACK)
 62
 63
 64#endif // AudioTrackPrivateAVFObjC_h

Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm

 1/*
 2 * Copyright (C) 2013 Apple Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 23 * THE POSSIBILITY OF SUCH DAMAGE.
 24 */
 25
 26#import "config.h"
 27#import "AudioTrackPrivateAVFObjC.h"
 28
 29#if ENABLE(VIDEO_TRACK)
 30
 31#import "SoftLinking.h"
 32#import <objc/runtime.h>
 33#import <AVFoundation/AVAssetTrack.h>
 34#import <AVFoundation/AVPlayerItemTrack.h>
 35#import <AVFoundation/AVMetadataItem.h>
 36
 37SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)
 38
 39SOFT_LINK_CLASS(AVFoundation, AVAssetTrack)
 40SOFT_LINK_CLASS(AVFoundation, AVPlayerItemTrack)
 41
 42SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicIsMainProgramContent, NSString *)
 43SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicDescribesVideoForAccessibility, NSString *)
 44SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicIsAuxiliaryContent, NSString *)
 45SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicTranscribesSpokenDialogForAccessibility, NSString *)
 46SOFT_LINK_POINTER(AVFoundation, AVMetadataCommonKeyTitle, NSString *)
 47
 48#define AVMediaCharacteristicIsMainProgramContent getAVMediaCharacteristicIsMainProgramContent()
 49#define AVMediaCharacteristicDescribesVideoForAccessibility getAVMediaCharacteristicDescribesVideoForAccessibility()
 50#define AVMediaCharacteristicIsAuxiliaryContent getAVMediaCharacteristicIsAuxiliaryContent()
 51#define AVMediaCharacteristicTranscribesSpokenDialogForAccessibility getAVMediaCharacteristicTranscribesSpokenDialogForAccessibility()
 52#define AVMetadataCommonKeyTitle getAVMetadataCommonKeyTitle()
 53
 54namespace WebCore {
 55
 56AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(AVPlayerItemTrack* track)
 57 : m_playerItemTrack(track)
 58{
 59 resetPropertiesFromTrack();
 60}
 61
 62void AudioTrackPrivateAVFObjC::resetPropertiesFromTrack()
 63{
 64 AVAssetTrack* assetTrack = [m_playerItemTrack.get() assetTrack];
 65 if (!assetTrack) {
 66 setEnabled(false);
 67 setKind(None);
 68 setId(emptyAtom);
 69 setLabel(emptyAtom);
 70 setLanguage(emptyAtom);
 71 return;
 72 }
 73
 74 setEnabled([m_playerItemTrack.get() isEnabled]);
 75 setId(String::format("%d", [assetTrack trackID]));
 76
 77 if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicDescribesVideoForAccessibility])
 78 setKind(Description);
 79 else if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicTranscribesSpokenDialogForAccessibility])
 80 setKind(Translation);
 81 else if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicIsAuxiliaryContent])
 82 setKind(Alternative);
 83 else if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicIsMainProgramContent])
 84 setKind(Main);
 85 else
 86 setKind(None);
 87
 88 for (AVMetadataItem* item in [assetTrack commonMetadata]) {
 89 if ([item.key isEqual:AVMetadataCommonKeyTitle]) {
 90 setLabel((NSString*)item.value);
 91 break;
 92 }
 93 }
 94
 95 setLanguage([assetTrack extendedLanguageTag]);
 96}
 97
 98void AudioTrackPrivateAVFObjC::setPlayerItemTrack(AVPlayerItemTrack *track)
 99{
 100 m_playerItemTrack = track;
 101 resetPropertiesFromTrack();
 102}
 103
 104void AudioTrackPrivateAVFObjC::setEnabled(bool enabled)
 105{
 106 AudioTrackPrivateAVF::setEnabled(enabled);
 107 [m_playerItemTrack.get() setEnabled:enabled];
 108}
 109
 110}
 111
 112#endif
 113

Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h

@@namespace WebCore {
5959
6060class WebCoreAVFResourceLoader;
6161class InbandTextTrackPrivateAVFObjC;
 62class AudioTrackPrivateAVFObjC;
6263
6364class MediaPlayerPrivateAVFoundationObjC : public MediaPlayerPrivateAVFoundation {
6465public:

@@private:
214215#if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
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};
220225

Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

2929
3030#import "MediaPlayerPrivateAVFoundationObjC.h"
3131
 32#import "AudioTrackPrivateAVFObjC.h"
3233#import "BlockExceptions.h"
3334#import "ExceptionCodePlaceholder.h"
3435#import "FloatConversion.h"

@@void MediaPlayerPrivateAVFoundationObjC::tracksChanged()
10481049 }
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> removedAudioTracks = adoptNS([oldAudioTracks.get() mutableCopy]);
 1065 [removedAudioTracks.get() minusSet:audioTracks.get()];
 1066
 1067 RetainPtr<NSMutableSet> addedAudioTracks = adoptNS([audioTracks.get() mutableCopy]);
 1068 [addedAudioTracks.get() minusSet:oldAudioTracks.get()];
 1069
 1070 AudioTrackVector newAudioTracks;
 1071 for (AudioTrackVector::iterator i = m_audioTracks.begin(); i != m_audioTracks.end(); ++i) {
 1072 if ([removedAudioTracks containsObject:(*i)->playerItemTrack()])
 1073 player()->removeAudioTrack(i->get());
 1074 else
 1075 newAudioTracks.append(*i);
 1076 }
 1077
 1078 for (AVPlayerItemTrack* playerItemTrack in addedAudioTracks.get()) {
 1079 RefPtr<AudioTrackPrivateAVFObjC> newTrack = AudioTrackPrivateAVFObjC::create(playerItemTrack);
 1080 newAudioTracks.append(newTrack);
 1081 player()->addAudioTrack(newTrack.get());
 1082 }
 1083 m_audioTracks.swap(newAudioTracks);
 1084#endif
10511085 }
10521086
10531087#if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)

LayoutTests/ChangeLog

112013-09-27 Jer Noble <jer.noble@apple.com>
22
 3 [Mac] Add AudioTrack support to MediaPlayerPrivateAVFObC.
 4 https://bugs.webkit.org/show_bug.cgi?id=122043
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * media/track/audio-track-expected.txt: Added.
 9 * media/track/audio-track.html: Added.
 10
 112013-09-27 Jer Noble <jer.noble@apple.com>
 12
313 REGRESSION(r156546): 17 media tests broken
414 https://bugs.webkit.org/show_bug.cgi?id=122021
515

LayoutTests/media/track/audio-track-expected.txt

 1In-band audio tracks.
 2
 3EVENT(addtrack)
 4EXPECTED (event.track == 'video.audioTracks[0]') OK
 5
 6EVENT(canplaythrough)
 7
 8** Check initial in-band track states
 9EXPECTED (video.audioTracks.length == '1') OK
 10
 11** Unload video file, check track count
 12RUN(video.src = '')
 13EXPECTED (video.audioTracks.length == '0') OK
 14
 15END OF TEST
 16

LayoutTests/media/track/audio-track.html

 1<!DOCTYPE html>
 2<html>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5
 6 <script src=../media-file.js></script>
 7 <script src=../video-test.js></script>
 8 <script>
 9
 10 var addtrackEventCount = 0;
 11
 12 function trackAdded(event)
 13 {
 14 consoleWrite("EVENT(" + event.type + ")");
 15 compareTracks("event.track", "video.audioTracks[" + addtrackEventCount + "]");
 16 ++addtrackEventCount;
 17 consoleWrite("");
 18 }
 19
 20 function compareTracks(track1, track2)
 21 {
 22 var equal = (eval(track1) == eval(track2));
 23 reportExpected(equal, track1, "==", track2, track1);
 24 }
 25
 26 function canplaythrough()
 27 {
 28 consoleWrite("<br><i>** Check initial in-band track states<" + "/i>");
 29 testExpected("video.audioTracks.length", 1);
 30
 31 consoleWrite("<br><i>** Unload video file, check track count<" + "/i>");
 32 run("video.src = ''");
 33 testExpected("video.audioTracks.length", 0);
 34
 35 consoleWrite("");
 36 endTest();
 37 }
 38
 39 function setup()
 40 {
 41 findMediaElement();
 42 video.audioTracks.addEventListener("addtrack", trackAdded);
 43 video.src = findMediaFile('audio', '../content/silence');
 44 waitForEvent('canplaythrough', canplaythrough);
 45 }
 46
 47 </script>
 48 </head>
 49 <body onload="setup()">
 50 <video controls></video>
 51 <p>In-band audio tracks.</p>
 52 </body>
 53</html>