[MSE][Mac] Destroy the AVStreamDataParser when the SourceBuffer is removed from its...
[WebKit-https.git] / Source / WebCore / platform / graphics / avfoundation / objc / SourceBufferPrivateAVFObjC.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. ``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 #ifndef SourceBufferPrivateAVFObjC_h
27 #define SourceBufferPrivateAVFObjC_h
28
29 #if ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
30
31 #include "SourceBufferPrivate.h"
32 #include <map>
33 #include <wtf/Deque.h>
34 #include <wtf/HashMap.h>
35 #include <wtf/MediaTime.h>
36 #include <wtf/RefPtr.h>
37 #include <wtf/RetainPtr.h>
38 #include <wtf/Vector.h>
39 #include <wtf/text/AtomicString.h>
40
41 OBJC_CLASS AVAsset;
42 OBJC_CLASS AVStreamDataParser;
43 OBJC_CLASS AVSampleBufferAudioRenderer;
44 OBJC_CLASS AVSampleBufferDisplayLayer;
45 OBJC_CLASS NSData;
46 OBJC_CLASS NSError;
47 OBJC_CLASS NSObject;
48 OBJC_CLASS WebAVStreamDataParserListener;
49 typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
50 typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
51
52 namespace WebCore {
53
54 class MediaSourcePrivateAVFObjC;
55 class TimeRanges;
56 class AudioTrackPrivate;
57 class VideoTrackPrivate;
58 class AudioTrackPrivateMediaSourceAVFObjC;
59 class VideoTrackPrivateMediaSourceAVFObjC;
60
61 class SourceBufferPrivateAVFObjC final : public SourceBufferPrivate {
62 public:
63     static RefPtr<SourceBufferPrivateAVFObjC> create(MediaSourcePrivateAVFObjC*);
64     virtual ~SourceBufferPrivateAVFObjC();
65
66     void clearMediaSource() { m_mediaSource = nullptr; }
67
68     // AVStreamDataParser delegate methods
69     void didParseStreamDataAsAsset(AVAsset*);
70     void didFailToParseStreamDataWithError(NSError*);
71     void didProvideMediaDataForTrackID(int trackID, CMSampleBufferRef, const String& mediaType, unsigned flags);
72     void didReachEndOfTrackWithTrackID(int trackID, const String& mediaType);
73     void didProvideContentKeyRequestInitializationDataForTrackID(NSData*, int trackID);
74
75     bool processCodedFrame(int trackID, CMSampleBufferRef, const String& mediaType);
76
77     bool hasVideo() const;
78     bool hasAudio() const;
79
80     void trackDidChangeEnabled(VideoTrackPrivateMediaSourceAVFObjC*);
81     void trackDidChangeEnabled(AudioTrackPrivateMediaSourceAVFObjC*);
82
83     void seekToTime(MediaTime);
84     MediaTime fastSeekTimeForMediaTime(MediaTime, MediaTime negativeThreshold, MediaTime positiveThreshold);
85     IntSize naturalSize();
86
87     int protectedTrackID() const { return m_protectedTrackID; }
88     AVStreamDataParser* parser() const { return m_parser.get(); }
89
90 private:
91     explicit SourceBufferPrivateAVFObjC(MediaSourcePrivateAVFObjC*);
92
93     // SourceBufferPrivate overrides
94     virtual void setClient(SourceBufferPrivateClient*) override;
95     virtual void append(const unsigned char* data, unsigned length) override;
96     virtual void abort() override;
97     virtual void removedFromMediaSource() override;
98     virtual MediaPlayer::ReadyState readyState() const override;
99     virtual void setReadyState(MediaPlayer::ReadyState) override;
100     virtual void evictCodedFrames() override;
101     virtual bool isFull() override;
102     virtual void flushAndEnqueueNonDisplayingSamples(Vector<RefPtr<MediaSample>>, AtomicString trackID) override;
103     virtual void enqueueSample(PassRefPtr<MediaSample>, AtomicString trackID) override;
104     virtual bool isReadyForMoreSamples(AtomicString trackID) override;
105     virtual void setActive(bool) override;
106     virtual void notifyClientWhenReadyForMoreSamples(AtomicString trackID) override;
107
108     void flushAndEnqueueNonDisplayingSamples(Vector<RefPtr<MediaSample>>, AVSampleBufferAudioRenderer*);
109     void flushAndEnqueueNonDisplayingSamples(Vector<RefPtr<MediaSample>>, AVSampleBufferDisplayLayer*);
110
111     void didBecomeReadyForMoreSamples(int trackID);
112     void appendCompleted();
113     void destroyParser();
114     void destroyRenderers();
115
116     Vector<RefPtr<VideoTrackPrivateMediaSourceAVFObjC>> m_videoTracks;
117     Vector<RefPtr<AudioTrackPrivateMediaSourceAVFObjC>> m_audioTracks;
118
119     RetainPtr<AVStreamDataParser> m_parser;
120     RetainPtr<AVAsset> m_asset;
121     RetainPtr<AVSampleBufferDisplayLayer> m_displayLayer;
122     std::map<int, RetainPtr<AVSampleBufferAudioRenderer>> m_audioRenderers;
123     RetainPtr<WebAVStreamDataParserListener> m_delegate;
124
125     MediaSourcePrivateAVFObjC* m_mediaSource;
126     SourceBufferPrivateClient* m_client;
127
128     FloatSize m_cachedSize;
129     bool m_parsingSucceeded;
130     int m_enabledVideoTrackID;
131     int m_protectedTrackID;
132 };
133
134 }
135
136 #endif // ENABLE(MEDIA_SOURCE) && USE(AVFOUNDATION)
137
138 #endif