1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/**********************************************************************
Audacity: A Digital Audio Editor
FFmpegAPIResolver.h
Dmitry Vedenko
**********************************************************************/
#pragma once
#include <memory>
#include <vector>
#include <map>
#include "FFmpegTypes.h"
#include "AVCodecID.h"
struct FFmpegFunctions;
class FFmpegLog;
class AVCodecContextWrapper;
class AVCodecWrapper;
class AVPacketWrapper;
struct AVCodecIDResolver final
{
AVCodecIDFwd (*GetAVCodecID)(AudacityAVCodecID);
AudacityAVCodecID (*GetAudacityCodecID)(AVCodecIDFwd);
};
struct AVCodecFactories final
{
std::unique_ptr<AVCodecContextWrapper> (*CreateAVCodecContextWrapper)(const FFmpegFunctions&, AVCodecContext*) = nullptr;
std::unique_ptr<AVCodecContextWrapper> (*CreateAVCodecContextWrapperFromCodec)(const FFmpegFunctions&, std::unique_ptr<AVCodecWrapper>) = nullptr;
std::unique_ptr<AVCodecWrapper> (*CreateAVCodecWrapper) (const AVCodec*) = nullptr;
//! @post return value is not null
std::unique_ptr<AVPacketWrapper> (*CreateAVPacketWrapper) (const FFmpegFunctions&) = nullptr;
};
class AVFormatContextWrapper;
class AVInputFormatWrapper;
class AVIOContextWrapper;
class AVOutputFormatWrapper;
class AVStreamWrapper;
struct AVFormatFactories final
{
std::unique_ptr<AVFormatContextWrapper> (*CreateAVFormatContextWrapper) (const FFmpegFunctions&) = nullptr;
std::unique_ptr<AVInputFormatWrapper> (*CreateAVInputFormatWrapper) (AVInputFormat*) = nullptr;
std::unique_ptr<AVIOContextWrapper> (*CreateAVIOContextWrapper) (const FFmpegFunctions&) = nullptr;
std::unique_ptr<AVOutputFormatWrapper> (*CreateAVOutputFormatWrapper) (const AVOutputFormat*) = nullptr;
std::unique_ptr<AVStreamWrapper> (*CreateAVStreamWrapper) (const FFmpegFunctions&, AVStream*, bool) = nullptr;
};
class AVFrameWrapper;
struct AVUtilFactories final
{
//! @post return value is not null
std::unique_ptr<AVFrameWrapper> (*CreateAVFrameWrapper)(const FFmpegFunctions&) = nullptr;
std::unique_ptr<FFmpegLog> (*CreateLogCallbackSetter)(const FFmpegFunctions&) = nullptr;
};
class FFmpegAPIResolver final
{
FFmpegAPIResolver() = default;
public:
static FFmpegAPIResolver& Get();
bool GetAVCodecIDResolver(int avCodecVersion, AVCodecIDResolver& resolver) const;
bool GetAVCodecFactories(int avCodecVersion, AVCodecFactories& factories) const;
bool GetAVFormatFactories(int avFormatVersion, AVFormatFactories& factories) const;
bool GetAVUtilFactories(int avUtilVersion, AVUtilFactories& factories) const;
void AddAVCodecIDResolver(int avCodecVersion, const AVCodecIDResolver& resolver);
void AddAVCodecFactories(int avCodecVersion, const AVCodecFactories& factories);
void AddAVFormatFactories(int avFormatVersion, const AVFormatFactories& factories);
void AddAVUtilFactories(int avUtilVersion, const AVUtilFactories& factories);
//! Compatible library versions to be sought at load time, ordered by
//! decreasing preference (that is, newest version first)
std::vector<int> GetSuportedAVFormatVersions() const;
private:
std::map<int, AVCodecIDResolver> mAVCodecIDResolvers;
std::map<int, AVCodecFactories> mAVCodecFactories;
std::map<int, AVFormatFactories> mAVFormatFactories;
std::map<int, AVUtilFactories> mAVUtilFactories;
};
|