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 MEDIA_CODEC_DECODER_ADAPTER_IMPL_H 17 #define MEDIA_CODEC_DECODER_ADAPTER_IMPL_H 18 19 #include <atomic> 20 #include <condition_variable> 21 #include <cstdint> 22 #include <mutex> 23 #include <queue> 24 #include <thread> 25 26 #include "avcodec_errors.h" 27 #include "avcodec_video_decoder.h" 28 #include "media_codec_decoder_adapter.h" 29 #include "media_description.h" 30 #include "meta_key.h" 31 32 namespace OHOS::NWeb { 33 using namespace OHOS::MediaAVCodec; 34 35 class DecoderCallbackImpl : public MediaAVCodec::AVCodecCallback { 36 public: 37 DecoderCallbackImpl(std::shared_ptr<DecoderCallbackAdapter> cb); 38 39 ~DecoderCallbackImpl() override = default; 40 41 void OnError(MediaAVCodec::AVCodecErrorType errorType, int32_t errorCode) override; 42 43 void OnOutputFormatChanged(const Media::Format& format) override; 44 45 void OnInputBufferAvailable(uint32_t index, std::shared_ptr<Media::AVSharedMemory> buffer) override; 46 47 void OnOutputBufferAvailable(uint32_t index, MediaAVCodec::AVCodecBufferInfo info, 48 MediaAVCodec::AVCodecBufferFlag flag, std::shared_ptr<Media::AVSharedMemory> buffer) override; 49 50 private: 51 std::shared_ptr<DecoderCallbackAdapter> cb_ = nullptr; 52 }; 53 54 class MediaCodecDecoderAdapterImpl : public MediaCodecDecoderAdapter { 55 public: 56 MediaCodecDecoderAdapterImpl() = default; 57 58 ~MediaCodecDecoderAdapterImpl() override = default; 59 60 DecoderAdapterCode CreateVideoDecoderByMime(const std::string& mimetype) override; 61 62 DecoderAdapterCode CreateVideoDecoderByName(const std::string& name) override; 63 64 DecoderAdapterCode ConfigureDecoder(const std::shared_ptr<DecoderFormatAdapter> format) override; 65 66 DecoderAdapterCode SetParameterDecoder(const std::shared_ptr<DecoderFormatAdapter> format) override; 67 68 DecoderAdapterCode SetOutputSurface(void* window) override; 69 70 DecoderAdapterCode PrepareDecoder() override; 71 72 DecoderAdapterCode StartDecoder() override; 73 74 DecoderAdapterCode StopDecoder() override; 75 76 DecoderAdapterCode FlushDecoder() override; 77 78 DecoderAdapterCode ResetDecoder() override; 79 80 DecoderAdapterCode ReleaseDecoder() override; 81 82 DecoderAdapterCode QueueInputBufferDec( 83 uint32_t index, int64_t presentationTimeUs, int32_t size, int32_t offset, BufferFlag flag) override; 84 85 DecoderAdapterCode GetOutputFormatDec(std::shared_ptr<DecoderFormatAdapter> format) override; 86 87 DecoderAdapterCode ReleaseOutputBufferDec(uint32_t index, bool isRender) override; 88 89 DecoderAdapterCode SetCallbackDec(const std::shared_ptr<DecoderCallbackAdapter> callback) override; 90 91 static ErrorType GetErrorType(MediaAVCodec::AVCodecErrorType codecErrorType); 92 93 static BufferFlag GetBufferFlag(MediaAVCodec::AVCodecBufferFlag codecBufferFlag); 94 95 static MediaAVCodec::AVCodecBufferFlag GetAVBufferFlag(BufferFlag bufferFlag); 96 97 private: 98 std::shared_ptr<OHOS::MediaAVCodec::AVCodecVideoDecoder> decoder_ = nullptr; 99 std::shared_ptr<DecoderCallbackImpl> callback_ = nullptr; 100 }; 101 } // namespace OHOS::NWeb 102 103 #endif // MEDIA_CODEC_DECODER_ADAPTER_IMPL_H 104