1  /*
2   * Copyright (c) 2024 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #ifndef FFMPEG_API_WRAP_H
17  #define FFMPEG_API_WRAP_H
18  
19  #ifdef __cplusplus
20  extern "C" {
21  #endif
22  #include "libavformat/avformat.h"
23  #include "libavcodec/avcodec.h"
24  #include "libavutil/avutil.h"
25  #include "libswresample/swresample.h"
26  #ifdef __cplusplus
27  }
28  #endif
29  
30  namespace OHOS {
31  namespace Media {
32  namespace MediaMonitor {
33  
34  using CodecFindEncoderFunc = AVCodec *(*)(enum AVCodecID id);
35  using CodecAllocContextFunc = AVCodecContext *(*)(const AVCodec *codec);
36  using CodecOpenFunc = int (*)(AVCodecContext *avctx,
37          const AVCodec *codec, AVDictionary **options);
38  using FormatAllocOutputContextFunc = int (*)(AVFormatContext **ctx,
39          const AVOutputFormat *oformat,
40          const char *formatName,
41          const char *filename);
42  using FormatNewStreamFunc = AVStream *(*)(AVFormatContext *s, const AVCodec *c);
43  using CodecParamFromContextFunc = int (*)(AVCodecParameters *par,
44          const AVCodecContext *codec);
45  using IoOpenFunc = int (*)(AVIOContext **s, const char *url, int flags,
46          const AVIOInterruptCB *intCb, AVDictionary **options);
47  using IoFlushFunc = void (*)(AVIOContext *s);
48  using IoCloseFunc = int (*)(AVIOContext *s);
49  
50  using FormatWriteHeaderFunc = int (*)(AVFormatContext *s, AVDictionary **options);
51  using FormatWriteTrailerFunc = int (*)(AVFormatContext *s);
52  
53  using PacketAllocFunc = AVPacket *(*)(void);
54  using FrameAllocFunc = AVFrame *(*)(void);
55  using FrameGetBufferFunc = int (*)(AVFrame *frame, int align);
56  
57  using CodecSendFrameFunc = int (*)(AVCodecContext *avctx, const AVFrame *frame);
58  using CodecRecvPacketFunc = int (*)(AVCodecContext *avctx, AVPacket *avpkt);
59  using FormatWriteFrameFunc = int (*)(AVFormatContext *s, AVPacket *pkt);
60  using FormatFlushFunc = int (*)(AVFormatContext *s);
61  
62  using FormatFreeContextFunc = void (*)(AVFormatContext *s);
63  using CodecFreeContextFunc = void(*)(AVCodecContext **avctx);
64  
65  using FrameFreeFunc = void (*)(AVFrame **frame);
66  using PacketFreeFunc = void (*)(AVPacket **pkt);
67  using PacketUnrefFunc = void (*)(AVPacket *pkt);
68  
69  using GetChannelLayoutFunc = int64_t (*)(int nbChannels);
70  using GetBytesPerSampleFunc = int (*)(enum AVSampleFormat sampleFmt);
71  using SampleFmtIsPlannarFunc = int (*)(enum AVSampleFormat sampleFmt);
72  
73  using SwrSetOptsFunc = struct SwrContext *(*)(struct SwrContext *s,
74          int64_t outChLayout, enum AVSampleFormat outSampleFmt, int outSampleRate,
75          int64_t inChLayout, enum AVSampleFormat inSampleFmt, int inSampleRate,
76          int logOffset, void *logCtx);
77  using SwrInitFunc = int (*)(struct SwrContext *s);
78  using SwrAllocFunc = struct SwrContext *(*)();
79  using SwrFreeFunc = void (*)(struct SwrContext **s);
80  using SwrConvertFunc = int (*)(struct SwrContext *s,
81      uint8_t **out, int outCount, const uint8_t **in, int inCount);
82  
83  class FFmpegApiWrap {
84  public:
85      FFmpegApiWrap();
86      ~FFmpegApiWrap();
87      bool Open();
88      void Close();
89      AVCodec *CodecFindEncoder(AVCodecID id);
90      AVCodecContext *CodecAllocContext(const AVCodec *codec);
91      int CodecOpen(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
92  
93      int FormatAllocOutputContext(AVFormatContext **ctx,
94          const AVOutputFormat *oformat, const char *formatName, const char *filename);
95      AVStream *FormatNewStream(AVFormatContext *s, const AVCodec *c);
96      int CodecParamFromContext(AVCodecParameters *par, const AVCodecContext *codec);
97      int IoOpen(AVIOContext **s, const char *url, int flags,
98          const AVIOInterruptCB *intCb, AVDictionary **options);
99      void IoFlush(AVIOContext *s);
100      int IoClose(AVIOContext *s);
101      int FormatWriteHeader(AVFormatContext *s, AVDictionary **options);
102      int FormatWriteTrailer(AVFormatContext *s);
103      int CodecSendFrame(AVCodecContext *avctx, const AVFrame *frame);
104      int CodecRecvPacket(AVCodecContext *avctx, AVPacket *avpkt);
105      int FormatWriteFrame(AVFormatContext *s, AVPacket *pkt);
106      int FormatFlush(AVFormatContext *s);
107      void FormatFreeContext(AVFormatContext *s);
108      void CodecFreeContext(AVCodecContext **avctx);
109  
110      AVPacket *PacketAlloc();
111      AVFrame *FrameAlloc();
112      int FrameGetBuffer(AVFrame *frame, int align);
113      void FrameFree(AVFrame **frame);
114      void PacketFree(AVPacket **pkt);
115      void PacketUnref(AVPacket *pkt);
116  
117      int64_t GetChannelLayout(int nbChannels);
118      int GetBytesPerSample(AVSampleFormat sampleFmt);
119      int SampleFmtIsPlannar(AVSampleFormat sampleFmt);
120      struct SwrContext *SwrAlloc();
121      struct SwrContext *SwrSetOpts(struct SwrContext *s,
122          int64_t outChLayout, AVSampleFormat outSampleFmt, int outSampleRate,
123          int64_t inChLayout, AVSampleFormat inSampleFmt, int inSampleRate,
124          int logOffset, void *logCtx);
125      int SwrInit(struct SwrContext *s);
126      void SwrFree(struct SwrContext **s);
127      int SwrConvert(struct SwrContext *s,
128          uint8_t **out, int outCount, const uint8_t **in, int inCount);
129  private:
130      bool LoadFormatApi();
131      bool LoadCodecApi();
132      bool LoadUtilsApi();
133      bool LoadResampleApi();
134      void *handler = nullptr;
135      FormatAllocOutputContextFunc foramtAllocOutputFunc = nullptr;
136      FormatNewStreamFunc formatNewStreamFunc = nullptr;
137      FormatWriteHeaderFunc formatWriteHeaderFunc = nullptr;
138      FormatWriteTrailerFunc formatWriteTrailerFunc = nullptr;
139      FormatWriteFrameFunc writeFrameFunc = nullptr;
140      FormatFlushFunc formatFlushFunc = nullptr;
141      FormatFreeContextFunc formatFreeContextFunc = nullptr;
142      IoOpenFunc ioOpenFunc = nullptr;
143      IoFlushFunc ioFlushFunc = nullptr;
144      IoCloseFunc ioCloseFunc = nullptr;
145  
146      CodecFindEncoderFunc codecFindFunc = nullptr;
147      CodecAllocContextFunc codecAllocFunc = nullptr;
148      CodecOpenFunc codecOpenFunc = nullptr;
149      CodecParamFromContextFunc codecParamFromContextFunc = nullptr;
150      CodecSendFrameFunc sendFrameFunc = nullptr;
151      CodecRecvPacketFunc recvPacketFunc = nullptr;
152      CodecFreeContextFunc codecFreeContextFunc = nullptr;
153  
154      PacketAllocFunc packetAllocFunc = nullptr;
155      PacketFreeFunc packetFreeFunc = nullptr;
156      PacketUnrefFunc packetUnrefFunc = nullptr;
157  
158      FrameAllocFunc frameAllocFunc = nullptr;
159      FrameGetBufferFunc frameGetBufferFunc = nullptr;
160      FrameFreeFunc frameFreeFunc = nullptr;
161      GetChannelLayoutFunc getChannelLayoutFunc = nullptr;
162      GetBytesPerSampleFunc getBytesPerSampleFunc = nullptr;
163      SampleFmtIsPlannarFunc sampleFmtIsPlannarFunc = nullptr;
164  
165      SwrSetOptsFunc swrSetOptsFunc = nullptr;
166      SwrAllocFunc swrAllocFunc = nullptr;
167      SwrFreeFunc swrFreeFunc = nullptr;
168      SwrInitFunc swrInitFunc = nullptr;
169      SwrConvertFunc swrConvertFunc = nullptr;
170  };
171  
172  } // namespace MediaMonitor
173  } // namespace Media
174  } // namespace OHOS
175  #endif // FFMPEG_API_WRAP_H