this repo has no description
at fixPythonPipStalling 69 lines 2.6 kB view raw
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