1 /* 2 * Copyright (C) 2023 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 CODECBASE_MOCK_H 17 #define CODECBASE_MOCK_H 18 19 #include <gmock/gmock.h> 20 #include <map> 21 #include <string> 22 #include "avcodec_common.h" 23 #include "avcodec_errors.h" 24 #include "avcodec_info.h" 25 #include "buffer/avbuffer.h" 26 #include "buffer/avbuffer_queue.h" 27 #include "buffer/avbuffer_queue_consumer.h" 28 #include "buffer/avbuffer_queue_define.h" 29 #include "buffer/avbuffer_queue_producer.h" 30 #include "buffer/avsharedmemorybase.h" 31 #include "foundation/multimedia/drm_framework/services/drm_service/ipc/i_keysession_service.h" 32 #include "surface.h" 33 34 namespace OHOS { 35 namespace MediaAVCodec { 36 enum class CallbackFlag : uint8_t { 37 MEMORY_CALLBACK = 1, 38 BUFFER_CALLBACK, 39 INVALID_CALLBACK, 40 }; 41 const OHOS::MediaAVCodec::Range DEFAULT_RANGE = {96, 4096}; 42 const OHOS::MediaAVCodec::Range HEVC_DECODER_RANGE = {2, 1920}; 43 const OHOS::MediaAVCodec::Range DEFALUT_BITRATE_RANGE = {1, 40000000}; 44 const OHOS::MediaAVCodec::Range DEFALUT_FRAMERATE_RANGE = {1, 60}; 45 const OHOS::MediaAVCodec::Range DEFALUT_CHANNELS_RANGE = {1, 30}; 46 const std::vector<int32_t> DEFALUT_PIXFORMAT = {1, 2, 3}; 47 const std::vector<int32_t> HEVC_DECODER_PIXFORMAT = {2, 3}; 48 const std::vector<int32_t> DEFALUT_SAMPLE_RATE = {1, 2, 3, 4, 5}; 49 50 const std::string DEFAULT_LOCK_FREE_QUEUE_NAME = "decodedBufferInfoQueue"; 51 const std::string DEFAULT_TASK_NAME = "PostProcessing"; 52 const std::string CODEC_MIME_MOCK_00 = "video/codec_mime_00"; 53 const std::string CODEC_MIME_MOCK_01 = "video/codec_mime_01"; 54 const std::vector<CapabilityData> FCODEC_CAPS = {{.codecName = "video.F.Decoder.Name.00", 55 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 56 .mimeType = CODEC_MIME_MOCK_00, 57 .isVendor = false, 58 .width = DEFAULT_RANGE, 59 .height = DEFAULT_RANGE, 60 .pixFormat = DEFALUT_PIXFORMAT}, 61 {.codecName = "video.F.Decoder.Name.00", 62 .codecType = AVCODEC_TYPE_VIDEO_ENCODER, 63 .mimeType = CODEC_MIME_MOCK_00, 64 .isVendor = false, 65 .width = DEFAULT_RANGE, 66 .height = DEFAULT_RANGE, 67 .pixFormat = DEFALUT_PIXFORMAT}, 68 {.codecName = "video.F.Decoder.Name.01", 69 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 70 .mimeType = CODEC_MIME_MOCK_01, 71 .isVendor = false, 72 .width = DEFAULT_RANGE, 73 .height = DEFAULT_RANGE, 74 .pixFormat = DEFALUT_PIXFORMAT}, 75 {.codecName = "video.F.Decoder.Name.01", 76 .codecType = AVCODEC_TYPE_VIDEO_ENCODER, 77 .mimeType = CODEC_MIME_MOCK_01, 78 .isVendor = false, 79 .width = DEFAULT_RANGE, 80 .height = DEFAULT_RANGE, 81 .pixFormat = DEFALUT_PIXFORMAT}}; 82 const std::vector<CapabilityData> HEVC_DECODER_CAPS = {{.codecName = "video.Hevc.Decoder.Name.00", 83 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 84 .mimeType = CODEC_MIME_MOCK_00, 85 .isVendor = false, 86 .width = HEVC_DECODER_RANGE, 87 .height = HEVC_DECODER_RANGE, 88 .pixFormat = HEVC_DECODER_PIXFORMAT}, 89 {.codecName = "video.Hevc.Decoder.Name.01", 90 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 91 .mimeType = CODEC_MIME_MOCK_01, 92 .isVendor = false, 93 .width = HEVC_DECODER_RANGE, 94 .height = HEVC_DECODER_RANGE, 95 .pixFormat = HEVC_DECODER_PIXFORMAT}}; 96 const std::vector<CapabilityData> HCODEC_CAPS = {{.codecName = "video.H.Decoder.Name.00", 97 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 98 .mimeType = CODEC_MIME_MOCK_00, 99 .isVendor = true, 100 .width = DEFAULT_RANGE, 101 .height = DEFAULT_RANGE, 102 .pixFormat = DEFALUT_PIXFORMAT}, 103 {.codecName = "video.H.Encoder.Name.00", 104 .codecType = AVCODEC_TYPE_VIDEO_ENCODER, 105 .mimeType = CODEC_MIME_MOCK_00, 106 .isVendor = true, 107 .width = DEFAULT_RANGE, 108 .height = DEFAULT_RANGE, 109 .pixFormat = DEFALUT_PIXFORMAT}, 110 {.codecName = "video.H.Decoder.Name.01", 111 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 112 .mimeType = CODEC_MIME_MOCK_01, 113 .isVendor = true, 114 .width = DEFAULT_RANGE, 115 .height = DEFAULT_RANGE, 116 .pixFormat = DEFALUT_PIXFORMAT}, 117 {.codecName = "video.H.Encoder.Name.01", 118 .codecType = AVCODEC_TYPE_VIDEO_ENCODER, 119 .mimeType = CODEC_MIME_MOCK_01, 120 .isVendor = true, 121 .width = DEFAULT_RANGE, 122 .height = DEFAULT_RANGE, 123 .pixFormat = DEFALUT_PIXFORMAT}, 124 {.codecName = "video.H.Decoder.Name.02", 125 .codecType = AVCODEC_TYPE_VIDEO_DECODER, 126 .bitrate = DEFALUT_BITRATE_RANGE, 127 .frameRate = DEFALUT_FRAMERATE_RANGE, 128 .channels = DEFALUT_CHANNELS_RANGE, 129 .sampleRate = DEFALUT_SAMPLE_RATE, 130 .mimeType = CODEC_MIME_MOCK_00, 131 .isVendor = false, 132 .width = DEFAULT_RANGE, 133 .height = DEFAULT_RANGE, 134 .pixFormat = DEFALUT_PIXFORMAT}}; 135 136 class CodecBase; 137 using RetAndCaps = std::pair<int32_t, std::vector<CapabilityData>>; 138 139 class AVCodecCallbackMock : public AVCodecCallback { 140 public: 141 AVCodecCallbackMock() = default; 142 ~AVCodecCallbackMock() = default; 143 144 MOCK_METHOD(void, OnError, (AVCodecErrorType errorType, int32_t errorCode), (override)); 145 MOCK_METHOD(void, OnOutputFormatChanged, (const Format &format), (override)); 146 MOCK_METHOD(void, OnInputBufferAvailable, (uint32_t index, std::shared_ptr<AVSharedMemory> buffer), (override)); 147 MOCK_METHOD(void, OnOutputBufferAvailable, (uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag, 148 std::shared_ptr<AVSharedMemory> buffer), (override)); 149 }; 150 151 class MediaCodecCallbackMock : public MediaCodecCallback { 152 public: 153 MediaCodecCallbackMock() = default; 154 ~MediaCodecCallbackMock() = default; 155 156 MOCK_METHOD(void, OnError, (AVCodecErrorType errorType, int32_t errorCode), (override)); 157 MOCK_METHOD(void, OnOutputFormatChanged, (const Format &format), (override)); 158 MOCK_METHOD(void, OnInputBufferAvailable, (uint32_t index, std::shared_ptr<AVBuffer> buffer), (override)); 159 MOCK_METHOD(void, OnOutputBufferAvailable, (uint32_t index, std::shared_ptr<AVBuffer> buffer), (override)); 160 }; 161 162 class CodecBaseMock { 163 public: 164 CodecBaseMock() = default; 165 ~CodecBaseMock() = default; 166 167 MOCK_METHOD(std::shared_ptr<CodecBase>, CreateFCodecByName, (const std::string &name)); 168 MOCK_METHOD(std::shared_ptr<CodecBase>, CreateHevcDecoderByName, (const std::string &name)); 169 MOCK_METHOD(std::shared_ptr<CodecBase>, CreateHCodecByName, (const std::string &name)); 170 MOCK_METHOD(RetAndCaps, GetHCapabilityList, ()); 171 MOCK_METHOD(RetAndCaps, GetFCapabilityList, ()); 172 MOCK_METHOD(RetAndCaps, GetHevcDecoderCapabilityList, ()); 173 174 MOCK_METHOD(void, CodecBaseCtor, ()); 175 MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<AVCodecCallback> &callback)); 176 MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<MediaCodecCallback> &callback)); 177 MOCK_METHOD(int32_t, Configure, ()); 178 MOCK_METHOD(int32_t, Start, ()); 179 MOCK_METHOD(int32_t, Stop, ()); 180 MOCK_METHOD(int32_t, Flush, ()); 181 MOCK_METHOD(int32_t, Reset, ()); 182 MOCK_METHOD(int32_t, Release, ()); 183 MOCK_METHOD(int32_t, SetParameter, ()); 184 MOCK_METHOD(int32_t, GetOutputFormat, ()); 185 MOCK_METHOD(int32_t, QueueInputBuffer, (uint32_t index, const AVCodecBufferInfo &info, AVCodecBufferFlag flag)); 186 MOCK_METHOD(int32_t, QueueInputBuffer, (uint32_t index)); 187 MOCK_METHOD(int32_t, QueueInputParameter, (uint32_t index)); 188 MOCK_METHOD(int32_t, ReleaseOutputBuffer, (uint32_t index)); 189 190 MOCK_METHOD(int32_t, NotifyEos, ()); 191 MOCK_METHOD(sptr<Surface>, CreateInputSurface, ()); 192 MOCK_METHOD(int32_t, SetInputSurface, (sptr<Surface> surface)); 193 MOCK_METHOD(int32_t, SetOutputSurface, (sptr<Surface> surface)); 194 MOCK_METHOD(int32_t, RenderOutputBuffer, (uint32_t index)); 195 MOCK_METHOD(int32_t, SignalRequestIDRFrame, ()); 196 MOCK_METHOD(int32_t, GetInputFormat, (Format & format)); 197 MOCK_METHOD(std::string, GetHidumperInfo, ()); 198 MOCK_METHOD(int32_t, Init, ()); 199 200 /* API11 audio codec interface */ 201 MOCK_METHOD(int32_t, CreateCodecByName, (const std::string &name)); 202 MOCK_METHOD(int32_t, Configure, (const std::shared_ptr<Media::Meta> &meta)); 203 MOCK_METHOD(int32_t, SetParameter, (const std::shared_ptr<Media::Meta> ¶meter)); 204 MOCK_METHOD(int32_t, GetOutputFormat, (std::shared_ptr<Media::Meta> & parameter)); 205 MOCK_METHOD(int32_t, SetOutputBufferQueue, (const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer)); 206 MOCK_METHOD(int32_t, Prepare, ()); 207 MOCK_METHOD(sptr<Media::AVBufferQueueProducer>, GetInputBufferQueue, ()); 208 MOCK_METHOD(void, ProcessInputBuffer, ()); 209 MOCK_METHOD(int32_t, SetAudioDecryptionConfig, 210 (const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag)); 211 MOCK_METHOD(int32_t, SetCustomBuffer, (std::shared_ptr<AVBuffer> buffer)); 212 std::weak_ptr<AVCodecCallback> codecCb_; 213 std::weak_ptr<MediaCodecCallback> videoCb_; 214 }; 215 216 class CodecBase { 217 public: 218 static void RegisterMock(std::shared_ptr<CodecBaseMock> &mock); 219 220 CodecBase(); 221 virtual ~CodecBase(); 222 virtual int32_t SetCallback(const std::shared_ptr<AVCodecCallback> &callback); 223 virtual int32_t SetCallback(const std::shared_ptr<MediaCodecCallback> &callback); 224 virtual int32_t Configure(const Format &format); 225 virtual int32_t Start(); 226 virtual int32_t Stop(); 227 virtual int32_t Flush(); 228 virtual int32_t Reset(); 229 virtual int32_t Release(); 230 virtual int32_t SetParameter(const Format &format); 231 virtual int32_t GetOutputFormat(Format &format); 232 virtual int32_t QueueInputBuffer(uint32_t index, const AVCodecBufferInfo &info, AVCodecBufferFlag flag); 233 virtual int32_t QueueInputBuffer(uint32_t index); 234 virtual int32_t QueueInputParameter(uint32_t index); 235 virtual int32_t ReleaseOutputBuffer(uint32_t index); 236 237 virtual int32_t NotifyEos(); 238 virtual sptr<Surface> CreateInputSurface(); 239 virtual int32_t SetInputSurface(sptr<Surface> surface); 240 virtual int32_t SetOutputSurface(sptr<Surface> surface); 241 virtual int32_t RenderOutputBuffer(uint32_t index); 242 virtual int32_t SignalRequestIDRFrame(); 243 virtual int32_t GetInputFormat(Format &format); 244 virtual std::string GetHidumperInfo(); 245 virtual int32_t Init(Media::Meta &meta); 246 virtual int32_t SetCustomBuffer(std::shared_ptr<AVBuffer> buffer); 247 248 /* API11 audio codec interface */ 249 virtual int32_t CreateCodecByName(const std::string &name); 250 virtual int32_t Configure(const std::shared_ptr<Media::Meta> &meta); 251 virtual int32_t SetParameter(const std::shared_ptr<Media::Meta> ¶meter); 252 virtual int32_t GetOutputFormat(std::shared_ptr<Media::Meta> ¶meter); 253 virtual int32_t SetOutputBufferQueue(const sptr<Media::AVBufferQueueProducer> &bufferQueueProducer); 254 virtual int32_t Prepare(); 255 virtual sptr<Media::AVBufferQueueProducer> GetInputBufferQueue(); 256 virtual void ProcessInputBuffer(); 257 258 /* API12 audio codec interface for drm*/ 259 virtual int32_t SetAudioDecryptionConfig(const sptr<DrmStandard::IMediaKeySessionService> &keySession, 260 const bool svpFlag); 261 }; 262 } // namespace MediaAVCodec 263 } // namespace OHOS 264 #endif // CODECBASE_MOCK_H