File: FFmpegAPIResolver.h

package info (click to toggle)
audacity 3.2.4%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 106,704 kB
  • sloc: cpp: 277,038; ansic: 73,623; lisp: 7,761; python: 3,305; sh: 2,715; perl: 821; xml: 275; makefile: 119
file content (92 lines) | stat: -rw-r--r-- 3,337 bytes parent folder | download
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;
};