Unreviewed, rolling out r245857.
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / objc / SourceBufferPrivateAVFObjC.h
1 /*
2  * Copyright (C) 2013-2017 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #if ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
29
30 #include "SourceBufferPrivate.h"
31 #include <dispatch/group.h>
32 #include <wtf/Box.h>
33 #include <wtf/Deque.h>
34 #include <wtf/HashMap.h>
35 #include <wtf/LoggerHelper.h>
36 #include <wtf/MediaTime.h>
37 #include <wtf/OSObjectPtr.h>
38 #include <wtf/RefPtr.h>
39 #include <wtf/RetainPtr.h>
40 #include <wtf/Vector.h>
41 #include <wtf/WeakPtr.h>
42 #include <wtf/text/AtomicString.h>
43 #include <wtf/threads/BinarySemaphore.h>
44
45 OBJC_CLASS AVAsset;
46 OBJC_CLASS AVStreamDataParser;
47 OBJC_CLASS AVSampleBufferAudioRenderer;
48 OBJC_CLASS AVSampleBufferDisplayLayer;
49 OBJC_CLASS NSData;
50 OBJC_CLASS NSError;
51 OBJC_CLASS NSObject;
52 OBJC_CLASS WebAVStreamDataParserListener;
53 OBJC_CLASS WebAVSampleBufferErrorListener;
54
55 typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
56 typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
57
58 namespace WebCore {
59
60 class CDMInstance;
61 class CDMInstanceFairPlayStreamingAVFObjC;
62 class CDMSessionMediaSourceAVFObjC;
63 class MediaSourcePrivateAVFObjC;
64 class TimeRanges;
65 class AudioTrackPrivate;
66 class VideoTrackPrivate;
67 class AudioTrackPrivateMediaSourceAVFObjC;
68 class VideoTrackPrivateMediaSourceAVFObjC;
69 class WebCoreDecompressionSession;
70 class SharedBuffer;
71
72 class SourceBufferPrivateAVFObjCErrorClient {
73 public:
74     virtual ~SourceBufferPrivateAVFObjCErrorClient() = default;
75     virtual void layerDidReceiveError(AVSampleBufferDisplayLayer *, NSError *, bool& shouldIgnore) = 0;
76     ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN
77     virtual void rendererDidReceiveError(AVSampleBufferAudioRenderer *, NSError *, bool& shouldIgnore) = 0;
78     ALLOW_NEW_API_WITHOUT_GUARDS_END
79 };
80
81 class SourceBufferPrivateAVFObjC final
82     : public SourceBufferPrivate
83     , public CanMakeWeakPtr<SourceBufferPrivateAVFObjC>
84 #if !RELEASE_LOG_DISABLED
85     , private LoggerHelper
86 #endif
87 {
88 public:
89     static Ref<SourceBufferPrivateAVFObjC> create(MediaSourcePrivateAVFObjC*);
90     virtual ~SourceBufferPrivateAVFObjC();
91
92     void clearMediaSource() { m_mediaSource = nullptr; }
93
94     // AVStreamDataParser delegate methods
95     void didParseStreamDataAsAsset(AVAsset*);
96     void didFailToParseStreamDataWithError(NSError*);
97     void didProvideMediaDataForTrackID(int trackID, CMSampleBufferRef, const String& mediaType, unsigned flags);
98     void didReachEndOfTrackWithTrackID(int trackID, const String& mediaType);
99     void willProvideContentKeyRequestInitializationDataForTrackID(int trackID);
100     void didProvideContentKeyRequestInitializationDataForTrackID(NSData*, int trackID, Box<BinarySemaphore>);
101
102     bool processCodedFrame(int trackID, CMSampleBufferRef, const String& mediaType);
103
104     bool hasVideo() const;
105     bool hasSelectedVideo() const;
106     bool hasAudio() const;
107
108     void trackDidChangeEnabled(VideoTrackPrivateMediaSourceAVFObjC*);
109     void trackDidChangeEnabled(AudioTrackPrivateMediaSourceAVFObjC*);
110
111     void willSeek();
112     MediaTime fastSeekTimeForMediaTime(const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold);
113     FloatSize naturalSize();
114
115     int protectedTrackID() const { return m_protectedTrackID; }
116     AVStreamDataParser* parser() const { return m_parser.get(); }
117     void setCDMSession(CDMSessionMediaSourceAVFObjC*);
118     void setCDMInstance(CDMInstance*);
119     void attemptToDecrypt();
120     bool waitingForKey() const { return m_waitingForKey; }
121
122     void flush();
123
124     void registerForErrorNotifications(SourceBufferPrivateAVFObjCErrorClient*);
125     void unregisterForErrorNotifications(SourceBufferPrivateAVFObjCErrorClient*);
126     void layerDidReceiveError(AVSampleBufferDisplayLayer *, NSError *);
127     void outputObscuredDueToInsufficientExternalProtectionChanged(bool);
128     ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN
129     void rendererDidReceiveError(AVSampleBufferAudioRenderer *, NSError *);
130     ALLOW_NEW_API_WITHOUT_GUARDS_END
131
132     void setVideoLayer(AVSampleBufferDisplayLayer*);
133     void setDecompressionSession(WebCoreDecompressionSession*);
134
135     void bufferWasConsumed();
136     
137 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
138     Uint8Array* initData() { return m_initData.get(); }
139 #endif
140
141 #if !RELEASE_LOG_DISABLED
142     const Logger& logger() const final { return m_logger.get(); }
143     const char* logClassName() const override { return "SourceBufferPrivateAVFObjC"; }
144     const void* logIdentifier() const final { return m_logIdentifier; }
145     WTFLogChannel& logChannel() const final;
146     const Logger& sourceBufferLogger() const final { return m_logger.get(); }
147     const void* sourceBufferLogIdentifier() final { return logIdentifier(); }
148 #endif
149
150 private:
151     explicit SourceBufferPrivateAVFObjC(MediaSourcePrivateAVFObjC*);
152
153     // SourceBufferPrivate overrides
154     void setClient(SourceBufferPrivateClient*) final;
155     void append(Vector<unsigned char>&&) final;
156     void abort() final;
157     void resetParserState() final;
158     void removedFromMediaSource() final;
159     MediaPlayer::ReadyState readyState() const final;
160     void setReadyState(MediaPlayer::ReadyState) final;
161     void flush(const AtomicString& trackID) final;
162     void enqueueSample(Ref<MediaSample>&&, const AtomicString& trackID) final;
163     bool isReadyForMoreSamples(const AtomicString& trackID) final;
164     void setActive(bool) final;
165     void notifyClientWhenReadyForMoreSamples(const AtomicString& trackID) final;
166     bool canSwitchToType(const ContentType&) final;
167
168     void didBecomeReadyForMoreSamples(int trackID);
169     void appendCompleted();
170     void destroyParser();
171     void destroyRenderers();
172
173     void flushVideo();
174     ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN
175     void flush(AVSampleBufferAudioRenderer *);
176     ALLOW_NEW_API_WITHOUT_GUARDS_END
177
178     WeakPtr<SourceBufferPrivateAVFObjC> createWeakPtr() { return m_weakFactory.createWeakPtr(*this); }
179
180     Vector<RefPtr<VideoTrackPrivateMediaSourceAVFObjC>> m_videoTracks;
181     Vector<RefPtr<AudioTrackPrivateMediaSourceAVFObjC>> m_audioTracks;
182     Vector<SourceBufferPrivateAVFObjCErrorClient*> m_errorClients;
183
184     WeakPtrFactory<SourceBufferPrivateAVFObjC> m_weakFactory;
185     WeakPtrFactory<SourceBufferPrivateAVFObjC> m_appendWeakFactory;
186
187     RetainPtr<AVStreamDataParser> m_parser;
188     RetainPtr<AVAsset> m_asset;
189     RetainPtr<AVSampleBufferDisplayLayer> m_displayLayer;
190     ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN
191     HashMap<int, RetainPtr<AVSampleBufferAudioRenderer>> m_audioRenderers;
192     ALLOW_NEW_API_WITHOUT_GUARDS_END
193     RetainPtr<WebAVStreamDataParserListener> m_delegate;
194     RetainPtr<WebAVSampleBufferErrorListener> m_errorListener;
195     RetainPtr<NSError> m_hdcpError;
196     Box<BinarySemaphore> m_hasSessionSemaphore;
197     OSObjectPtr<dispatch_group_t> m_isAppendingGroup;
198     RefPtr<WebCoreDecompressionSession> m_decompressionSession;
199
200     MediaSourcePrivateAVFObjC* m_mediaSource;
201     SourceBufferPrivateClient* m_client { nullptr };
202 #if ENABLE(LEGACY_ENCRYPTED_MEDIA)
203     RefPtr<Uint8Array> m_initData;
204     WeakPtr<CDMSessionMediaSourceAVFObjC> m_session { nullptr };
205 #endif
206 #if ENABLE(ENCRYPTED_MEDIA) && HAVE(AVCONTENTKEYSESSION)
207     RefPtr<CDMInstanceFairPlayStreamingAVFObjC> m_cdmInstance;
208     Vector<Ref<SharedBuffer>> m_keyIDs;
209 #endif
210
211     Optional<FloatSize> m_cachedSize;
212     FloatSize m_currentSize;
213     bool m_parsingSucceeded { true };
214     bool m_parserStateWasReset { false };
215     bool m_discardSamplesUntilNextInitializationSegment { false };
216     bool m_waitingForKey { true };
217     int m_enabledVideoTrackID { -1 };
218     int m_protectedTrackID { -1 };
219     uint64_t m_mapID;
220
221 #if !RELEASE_LOG_DISABLED
222     Ref<const Logger> m_logger;
223     const void* m_logIdentifier;
224 #endif
225 };
226
227 }
228
229 #endif // ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)