this repo has no description
1#ifndef AUDIOCONVERTERINTERNAL_H
2#define AUDIOCONVERTERINTERNAL_H
3#include "AudioConverter.h"
4#include "ConsumableBuffer.h"
5#include <stdint.h>
6#include <fstream>
7
8extern "C" {
9#include <libswresample/swresample.h>
10#include <libavcodec/avcodec.h>
11}
12
13class __attribute__((visibility("hidden"))) AudioConverter
14{
15 AudioConverter(const AudioStreamBasicDescription* inSourceFormat, const AudioStreamBasicDescription* inDestinationFormat);
16public:
17 static OSStatus create(const AudioStreamBasicDescription* inSourceFormat, const AudioStreamBasicDescription* inDestinationFormat, AudioConverter** out);
18 ~AudioConverter();
19
20 void flush();
21 UInt32 frameSize() const { return m_sourceFormat.mBytesPerFrame; }
22
23 OSStatus fillComplex(AudioConverterComplexInputDataProc dataProc, void* opaque, UInt32* ioOutputDataPacketSize, AudioBufferList *outOutputData, AudioStreamPacketDescription* outPacketDescription);
24
25 OSStatus setProperty(AudioConverterPropertyID inPropertyID, UInt32 inPropertyDataSize, const void *inPropertyData);
26 OSStatus getProperty(AudioConverterPropertyID inPropertyID, UInt32 *ioPropertyDataSize, void *outPropertyData);
27 OSStatus getPropertyInfo(AudioConverterPropertyID inPropertyID, UInt32 *outSize, Boolean *outWritable);
28private:
29 static enum AVCodecID CACodecToAV(const AudioStreamBasicDescription* desc);
30 static enum AVSampleFormat CACodecSampleFormat(const AudioStreamBasicDescription* desc);
31 static uint32_t CAChannelCountToLayout(UInt32 numChannels);
32
33 // Requests more data from the input callback
34 OSStatus feedInput(AudioConverterComplexInputDataProc dataProc, void* opaque, UInt32& numDataPackets);
35
36 // Setups the resampler context based on the PCM format in the frame
37 void setupResampler(const AVFrame* frame);
38
39 void allocateBuffers();
40 void initEncoder();
41
42 bool feedDecoder(AudioConverterComplexInputDataProc dataProc, void* opaque, AVFrame* srcaudio);
43 bool feedEncoder();
44private:
45 AudioStreamBasicDescription m_sourceFormat, m_destinationFormat;
46 UInt32 m_inputChannelLayout, m_outputChannelLayout;
47 AVSampleFormat m_targetFormat;
48 AVCodecContext* m_decoder;
49 AVCodecContext* m_encoder;
50 AVPacket m_avpkt, m_avpktOut;
51 UInt32 m_avpktOutUsed = 0;
52
53 AVFrame* m_audioFrame = nullptr;
54 ConsumableBuffer m_audioFramePrebuf;
55
56 SwrContext* m_resampler = nullptr;
57 UInt32 m_outBitRate = 128000;
58 bool m_encoderInitialized = false;
59 const AVCodec* m_codecIn = nullptr;
60 const AVCodec* m_codecOut = nullptr;
61
62#ifdef DEBUG_AUDIOCONVERTER
63 std::ofstream m_resamplerInput, m_resamplerOutput, m_encoderOutput;
64#endif
65};
66
67#endif
68
69