1da853ecaSopenharmony_ci/* 2da853ecaSopenharmony_ci * Copyright (C) 2023 Huawei Device Co., Ltd. 3da853ecaSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4da853ecaSopenharmony_ci * you may not use this file except in compliance with the License. 5da853ecaSopenharmony_ci * You may obtain a copy of the License at 6da853ecaSopenharmony_ci * 7da853ecaSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8da853ecaSopenharmony_ci * 9da853ecaSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10da853ecaSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11da853ecaSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12da853ecaSopenharmony_ci * See the License for the specific language governing permissions and 13da853ecaSopenharmony_ci * limitations under the License. 14da853ecaSopenharmony_ci */ 15da853ecaSopenharmony_ci 16da853ecaSopenharmony_ci#ifndef HCODEC_HDECODER_H 17da853ecaSopenharmony_ci#define HCODEC_HDECODER_H 18da853ecaSopenharmony_ci 19da853ecaSopenharmony_ci#include "hcodec.h" 20da853ecaSopenharmony_ci#ifdef USE_VIDEO_PROCESSING_ENGINE 21da853ecaSopenharmony_ci#include "video_refreshrate_prediction.h" 22da853ecaSopenharmony_ci#endif 23da853ecaSopenharmony_ci 24da853ecaSopenharmony_cinamespace OHOS::MediaAVCodec { 25da853ecaSopenharmony_ciclass HDecoder : public HCodec { 26da853ecaSopenharmony_cipublic: 27da853ecaSopenharmony_ci HDecoder(CodecHDI::CodecCompCapability caps, OMX_VIDEO_CODINGTYPE codingType) 28da853ecaSopenharmony_ci : HCodec(caps, codingType, false) {} 29da853ecaSopenharmony_ci ~HDecoder() override; 30da853ecaSopenharmony_ci 31da853ecaSopenharmony_ciprivate: 32da853ecaSopenharmony_ci struct SurfaceBufferItem { 33da853ecaSopenharmony_ci sptr<SurfaceBuffer> buffer; 34da853ecaSopenharmony_ci sptr<SyncFence> fence; 35da853ecaSopenharmony_ci int32_t generation = 0; 36da853ecaSopenharmony_ci }; 37da853ecaSopenharmony_ci 38da853ecaSopenharmony_ciprivate: 39da853ecaSopenharmony_ci // configure 40da853ecaSopenharmony_ci int32_t OnConfigure(const Format &format) override; 41da853ecaSopenharmony_ci int32_t SetupPort(const Format &format); 42da853ecaSopenharmony_ci int32_t UpdateInPortFormat() override; 43da853ecaSopenharmony_ci int32_t UpdateOutPortFormat() override; 44da853ecaSopenharmony_ci void UpdateColorAspects() override; 45da853ecaSopenharmony_ci void GetCropFromOmx(uint32_t w, uint32_t h, OHOS::Rect& damage); 46da853ecaSopenharmony_ci int32_t RegisterListenerToSurface(const sptr<Surface> &surface); 47da853ecaSopenharmony_ci void OnSetOutputSurface(const MsgInfo &msg, BufferOperationMode mode) override; 48da853ecaSopenharmony_ci int32_t OnSetOutputSurfaceWhenCfg(const sptr<Surface> &surface); 49da853ecaSopenharmony_ci int32_t OnSetParameters(const Format &format) override; 50da853ecaSopenharmony_ci bool UpdateConfiguredFmt(OMX_COLOR_FORMATTYPE portFmt); 51da853ecaSopenharmony_ci uint64_t GetProducerUsage(); 52da853ecaSopenharmony_ci void CombineConsumerUsage(); 53da853ecaSopenharmony_ci int32_t SaveTransform(const Format &format, bool set = false); 54da853ecaSopenharmony_ci int32_t SetTransform(); 55da853ecaSopenharmony_ci int32_t SaveScaleMode(const Format &format, bool set = false); 56da853ecaSopenharmony_ci int32_t SetScaleMode(); 57da853ecaSopenharmony_ci 58da853ecaSopenharmony_ci // start 59da853ecaSopenharmony_ci bool UseHandleOnOutputPort(bool isDynamic); 60da853ecaSopenharmony_ci int32_t AllocateBuffersOnPort(OMX_DIRTYPE portIndex) override; 61da853ecaSopenharmony_ci void SetCallerToBuffer(int fd) override; 62da853ecaSopenharmony_ci void UpdateFormatFromSurfaceBuffer() override; 63da853ecaSopenharmony_ci int32_t AllocOutDynamicSurfaceBuf(); 64da853ecaSopenharmony_ci int32_t AllocateOutputBuffersFromSurface(); 65da853ecaSopenharmony_ci int32_t SetQueueSize(const sptr<Surface> &surface, uint32_t targetSize); 66da853ecaSopenharmony_ci __attribute__((no_sanitize("cfi"))) int32_t SubmitAllBuffersOwnedByUs() override; 67da853ecaSopenharmony_ci int32_t SubmitOutputBuffersToOmxNode() override; 68da853ecaSopenharmony_ci bool ReadyToStart() override; 69da853ecaSopenharmony_ci 70da853ecaSopenharmony_ci // input buffer circulation 71da853ecaSopenharmony_ci void OnOMXEmptyBufferDone(uint32_t bufferId, BufferOperationMode mode) override; 72da853ecaSopenharmony_ci 73da853ecaSopenharmony_ci // output buffer circulation 74da853ecaSopenharmony_ci void OnReleaseOutputBuffer(const BufferInfo &info) override; 75da853ecaSopenharmony_ci void OnRenderOutputBuffer(const MsgInfo &msg, BufferOperationMode mode) override; 76da853ecaSopenharmony_ci int32_t NotifySurfaceToRenderOutputBuffer(BufferInfo &info); 77da853ecaSopenharmony_ci GSError OnBufferReleasedByConsumer(uint64_t surfaceId) override; 78da853ecaSopenharmony_ci void OnGetBufferFromSurface(const ParamSP& param) override; 79da853ecaSopenharmony_ci SurfaceBufferItem RequestBuffer(); 80da853ecaSopenharmony_ci std::vector<BufferInfo>::iterator FindBelongTo(sptr<SurfaceBuffer>& buffer); 81da853ecaSopenharmony_ci void SurfaceModeSubmitBuffer(); 82da853ecaSopenharmony_ci void SurfaceModeSubmitBufferFromFreeList(); 83da853ecaSopenharmony_ci bool SurfaceModeSubmitOneItem(SurfaceBufferItem& item); 84da853ecaSopenharmony_ci void DynamicModeSubmitBuffer() override; 85da853ecaSopenharmony_ci void SurfaceDynamicModeSubmitBuffer(std::vector<BufferInfo>::iterator nullSlot); 86da853ecaSopenharmony_ci void BufferDynamicModeSubmitBuffer(std::vector<BufferInfo>::iterator nullSlot); 87da853ecaSopenharmony_ci 88da853ecaSopenharmony_ci // switch surface 89da853ecaSopenharmony_ci void OnSetOutputSurfaceWhenRunning(const sptr<Surface> &newSurface, 90da853ecaSopenharmony_ci const MsgInfo &msg, BufferOperationMode mode); 91da853ecaSopenharmony_ci void SwitchBetweenSurface(const sptr<Surface> &newSurface, 92da853ecaSopenharmony_ci const MsgInfo &msg, BufferOperationMode mode); 93da853ecaSopenharmony_ci void ConsumeFreeList(BufferOperationMode mode); 94da853ecaSopenharmony_ci 95da853ecaSopenharmony_ci // stop/release 96da853ecaSopenharmony_ci void EraseBufferFromPool(OMX_DIRTYPE portIndex, size_t i) override; 97da853ecaSopenharmony_ci void OnClearBufferPool(OMX_DIRTYPE portIndex) override; 98da853ecaSopenharmony_ci void CancelBufferToSurface(BufferInfo &info); 99da853ecaSopenharmony_ci void OnEnterUninitializedState() override; 100da853ecaSopenharmony_ci 101da853ecaSopenharmony_ci // VRR 102da853ecaSopenharmony_ci#ifdef USE_VIDEO_PROCESSING_ENGINE 103da853ecaSopenharmony_ci int32_t SetVrrEnable(const Format &format); 104da853ecaSopenharmony_ci int32_t VrrPrediction(BufferInfo &info) override; 105da853ecaSopenharmony_ci static constexpr double VRR_DEFAULT_INPUT_FRAME_RATE = 60.0; 106da853ecaSopenharmony_ci std::shared_ptr<OHOS::Media::VideoProcessingEngine::VideoRefreshRatePrediction> vrrPredictor_; 107da853ecaSopenharmony_ci#endif 108da853ecaSopenharmony_ci 109da853ecaSopenharmony_ciprivate: 110da853ecaSopenharmony_ci static constexpr uint64_t SURFACE_MODE_PRODUCER_USAGE = BUFFER_USAGE_MEM_DMA | BUFFER_USAGE_VIDEO_DECODER; 111da853ecaSopenharmony_ci static constexpr uint64_t BUFFER_MODE_REQUEST_USAGE = 112da853ecaSopenharmony_ci SURFACE_MODE_PRODUCER_USAGE | BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_MMZ_CACHE; 113da853ecaSopenharmony_ci 114da853ecaSopenharmony_ci struct SurfaceItem { 115da853ecaSopenharmony_ci SurfaceItem() = default; 116da853ecaSopenharmony_ci explicit SurfaceItem(const sptr<Surface> &surface); 117da853ecaSopenharmony_ci void Release(); 118da853ecaSopenharmony_ci sptr<Surface> surface_; 119da853ecaSopenharmony_ci private: 120da853ecaSopenharmony_ci std::optional<GraphicTransformType> originalTransform_; 121da853ecaSopenharmony_ci } currSurface_; 122da853ecaSopenharmony_ci 123da853ecaSopenharmony_ci std::list<SurfaceBufferItem> freeList_; 124da853ecaSopenharmony_ci int32_t currGeneration_ = 0; 125da853ecaSopenharmony_ci bool isDynamic_ = false; 126da853ecaSopenharmony_ci uint32_t outBufferCnt_ = 0; 127da853ecaSopenharmony_ci GraphicTransformType transform_ = GRAPHIC_ROTATE_NONE; 128da853ecaSopenharmony_ci std::optional<ScalingMode> scaleMode_; 129da853ecaSopenharmony_ci double lastFlushRate_ = 0.0; 130da853ecaSopenharmony_ci double codecRate_ = 0.0; 131da853ecaSopenharmony_ci}; 132da853ecaSopenharmony_ci} // namespace OHOS::MediaAVCodec 133da853ecaSopenharmony_ci#endif // HCODEC_HDECODER_H 134