Changeset 182555 in webkit
- Timestamp:
- Apr 8, 2015 11:12:56 AM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r182551 r182555 1 2015-04-08 Jer Noble <jer.noble@apple.com> 2 3 [Mac][WebAudio] Update the AVAudioMix in the AudioSourceProviderAVFObjC when the list of enabled audio tracks change. 4 https://bugs.webkit.org/show_bug.cgi?id=143332 5 6 Reviewed by Eric Carlson. 7 8 Some media assets (notably, mp3s) will not have an enabled audio track when the AVAsset is 9 first loaded, so the AVAudioMix will have no trackID in it's parameters. Whenever the list 10 of enabled tracks change, recreate the AVAudioMix with the new first enabled audio trackID. 11 12 To facilitate this, add a new setter to AudioSourceProviderAVFObjC taking an AVAssetTrack to 13 use with the AVAudioMix. Whenever this parameter changes, the AVAudioMix is destroyed and 14 recreated. 15 16 * html/HTMLMediaElement.cpp: 17 (WebCore::HTMLMediaElement::mediaPlayerEngineUpdated): Drive-by fix: when the media 18 player switches engines, re-associate the audio source node with its provider. 19 * platform/graphics/avfoundation/AudioSourceProviderAVFObjC.h: 20 * platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm: 21 (WebCore::AudioSourceProviderAVFObjC::setPlayerItem): Only create the mix if there is a valid AVPlayerItem and AVAssetTrack 22 (WebCore::AudioSourceProviderAVFObjC::setAudioTrack): Ditto. 23 (WebCore::AudioSourceProviderAVFObjC::createMix): Don't iterate over the AVPlayerItem's tracks, 24 just use the one passed in through setAudioTrack(). 25 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: 26 (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Clear the provider's track. 27 (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerItem): Set the provider's track. 28 (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Ditto. 29 (WebCore::MediaPlayerPrivateAVFoundationObjC::audioSourceProvider): Ditto. 30 1 31 2015-04-08 Anders Carlsson <andersca@apple.com> 2 32 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r182544 r182555 4274 4274 m_mediaSession->applyMediaPlayerRestrictions(*this); 4275 4275 4276 #if ENABLE(WEB_AUDIO) 4277 if (m_audioSourceNode && audioSourceProvider()) { 4278 m_audioSourceNode->lock(); 4279 audioSourceProvider()->setClient(m_audioSourceNode); 4280 m_audioSourceNode->unlock(); 4281 } 4282 #endif 4283 4276 4284 #if PLATFORM(IOS) 4277 4285 if (!m_player) -
trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.h
r177733 r182555 35 35 #include <wtf/RetainPtr.h> 36 36 37 OBJC_CLASS AVAssetTrack; 37 38 OBJC_CLASS AVPlayerItem; 38 39 OBJC_CLASS AVMutableAudioMix; … … 55 56 56 57 void setPlayerItem(AVPlayerItem *); 58 void setAudioTrack(AVAssetTrack *); 57 59 58 60 private: … … 79 81 80 82 RetainPtr<AVPlayerItem> m_avPlayerItem; 83 RetainPtr<AVAssetTrack> m_avAssetTrack; 81 84 RetainPtr<AVMutableAudioMix> m_avAudioMix; 82 85 RetainPtr<MTAudioProcessingTapRef> m_tap; -
trunk/Source/WebCore/platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm
r181368 r182555 39 39 #import <AVFoundation/AVMediaFormat.h> 40 40 #import <AVFoundation/AVPlayerItem.h> 41 #import <AVFoundation/AVPlayerItemTrack.h>42 41 #import <objc/runtime.h> 43 42 #import <wtf/MainThread.h> … … 152 151 m_avPlayerItem = avPlayerItem; 153 152 154 if (m_client && m_avPlayerItem) 153 if (m_client && m_avPlayerItem && m_avAssetTrack) 154 createMix(); 155 } 156 157 void AudioSourceProviderAVFObjC::setAudioTrack(AVAssetTrack *avAssetTrack) 158 { 159 if (m_avAssetTrack == avAssetTrack) 160 return; 161 162 if (m_avAudioMix) 163 destroyMix(); 164 165 m_avAssetTrack = avAssetTrack; 166 167 if (m_client && m_avPlayerItem && m_avAssetTrack) 155 168 createMix(); 156 169 } … … 191 204 [parameters setAudioTapProcessor:m_tap.get()]; 192 205 193 CMPersistentTrackID firstEnabledAudioTrackID = kCMPersistentTrackID_Invalid; 194 NSArray* tracks = [m_avPlayerItem tracks]; 195 for (AVPlayerItemTrack* track in tracks) { 196 if ([track.assetTrack hasMediaCharacteristic:AVMediaCharacteristicAudible] && track.enabled) { 197 firstEnabledAudioTrackID = track.assetTrack.trackID; 198 break; 199 } 200 } 201 [parameters setTrackID:firstEnabledAudioTrackID]; 206 CMPersistentTrackID trackID = m_avAssetTrack.get().trackID; 207 [parameters setTrackID:trackID]; 202 208 203 209 [m_avAudioMix setInputParameters:@[parameters.get()]]; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
r182486 r182555 350 350 static NSArray *assetTrackMetadataKeyNames(); 351 351 static NSArray *playerKVOProperties(); 352 static AVAssetTrack* firstEnabledTrack(NSArray* tracks); 352 353 353 354 #if !LOG_DISABLED … … 567 568 568 569 #if ENABLE(WEB_AUDIO) && USE(MEDIATOOLBOX) 569 if (m_provider) 570 if (m_provider) { 570 571 m_provider->setPlayerItem(nullptr); 572 m_provider->setAudioTrack(nullptr); 573 } 571 574 #endif 572 575 … … 999 1002 1000 1003 #if ENABLE(WEB_AUDIO) && USE(MEDIATOOLBOX) 1001 if (m_provider) 1004 if (m_provider) { 1002 1005 m_provider->setPlayerItem(m_avPlayerItem.get()); 1006 m_provider->setAudioTrack(firstEnabledTrack([m_avAsset tracksWithMediaCharacteristic:AVMediaCharacteristicAudible])); 1007 } 1003 1008 #endif 1004 1009 … … 1918 1923 characteristicsChanged(); 1919 1924 1925 #if ENABLE(WEB_AUDIO) && USE(MEDIATOOLBOX) 1926 if (m_provider) 1927 m_provider->setAudioTrack(firstEnabledTrack([m_avAsset tracksWithMediaCharacteristic:AVMediaCharacteristicAudible])); 1928 #endif 1929 1920 1930 setDelayCharacteristicsChangedNotification(false); 1921 1931 } … … 2128 2138 AudioSourceProvider* MediaPlayerPrivateAVFoundationObjC::audioSourceProvider() 2129 2139 { 2130 if (!m_provider) 2140 if (!m_provider) { 2131 2141 m_provider = AudioSourceProviderAVFObjC::create(m_avPlayerItem.get()); 2142 m_provider->setAudioTrack(firstEnabledTrack([m_avAsset tracksWithMediaCharacteristic:AVMediaCharacteristicAudible])); 2143 } 2144 2132 2145 return m_provider.get(); 2133 2146 }
Note: See TracChangeset
for help on using the changeset viewer.