035cca32c550aa2575625e499214579a3db1d736
[WebKit-https.git] / Source / WebCore / platform / mediarecorder / cocoa / AudioSampleBufferCompressor.h
1 /*
2  * Copyright (C) 2020 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'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #pragma once
26
27 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
28
29 #import <CoreMedia/CoreMedia.h>
30
31 typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
32 typedef struct OpaqueAudioConverter* AudioConverterRef;
33
34 namespace WebCore {
35
36 class AudioSampleBufferCompressor {
37     WTF_MAKE_FAST_ALLOCATED;
38 public:
39     static std::unique_ptr<AudioSampleBufferCompressor> create(CMBufferQueueTriggerCallback, void* callbackObject);
40     ~AudioSampleBufferCompressor();
41
42     void finish();
43     void addSampleBuffer(CMSampleBufferRef);
44     CMSampleBufferRef getOutputSampleBuffer();
45     RetainPtr<CMSampleBufferRef> takeOutputSampleBuffer();
46
47 private:
48     AudioSampleBufferCompressor();
49     bool initialize(CMBufferQueueTriggerCallback, void* callbackObject);
50
51     static OSStatus audioConverterComplexInputDataProc(AudioConverterRef, UInt32*, AudioBufferList*, AudioStreamPacketDescription**, void*);
52
53     void processSampleBuffer(CMSampleBufferRef);
54     bool initAudioConverterForSourceFormatDescription(CMFormatDescriptionRef, AudioFormatID);
55     size_t computeBufferSizeForAudioFormat(AudioStreamBasicDescription, UInt32, Float32);
56     void attachPrimingTrimsIfNeeded(CMSampleBufferRef);
57     RetainPtr<NSNumber> gradualDecoderRefreshCount();
58     CMSampleBufferRef sampleBufferWithNumPackets(UInt32 numPackets, AudioBufferList);
59     void processSampleBuffersUntilLowWaterTime(CMTime);
60     OSStatus provideSourceDataNumOutputPackets(UInt32*, AudioBufferList*, AudioStreamPacketDescription**);
61
62     dispatch_queue_t m_serialDispatchQueue;
63     CMTime m_lowWaterTime;
64
65     RetainPtr<CMBufferQueueRef> m_outputBufferQueue;
66     RetainPtr<CMBufferQueueRef> m_inputBufferQueue;
67     bool m_isEncoding { false };
68
69     RetainPtr<AudioConverterRef> m_converter;
70     AudioStreamBasicDescription m_sourceFormat;
71     AudioStreamBasicDescription m_destinationFormat;
72     RetainPtr<CMFormatDescriptionRef> m_destinationFormatDescription;
73     RetainPtr<NSNumber> m_gdrCountNum;
74     UInt32 m_maxOutputPacketSize { 0 };
75     Vector<AudioStreamPacketDescription> m_destinationPacketDescriptions;
76
77     CMTime m_currentNativePresentationTimeStamp;
78     CMTime m_currentOutputPresentationTimeStamp;
79     CMTime m_remainingPrimeDuration;
80
81     Vector<char> m_sourceBuffer;
82     Vector<char> m_destinationBuffer;
83
84     RetainPtr<CMBlockBufferRef> m_sampleBlockBuffer;
85     size_t m_sampleBlockBufferSize { 0 };
86     size_t m_currentOffsetInSampleBlockBuffer { 0 };
87     AudioFormatID m_outputCodecType { kAudioFormatMPEG4AAC };
88 };
89
90 }
91
92 #endif // ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)