1 /* 2 * Copyright (c) 2023-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 FILTERS_SURFACE_ENCODER_ADAPTER_H 17 #define FILTERS_SURFACE_ENCODER_ADAPTER_H 18 19 #include <cstring> 20 #include <shared_mutex> 21 #include <deque> 22 #include <utility> 23 #include "surface.h" 24 #include "meta/meta.h" 25 #include "buffer/avbuffer.h" 26 #include "buffer/avallocator.h" 27 #include "buffer/avbuffer_queue.h" 28 #include "buffer/avbuffer_queue_producer.h" 29 #include "buffer/avbuffer_queue_consumer.h" 30 #include "common/status.h" 31 #include "osal/task/task.h" 32 #include "avcodec_common.h" 33 #include "osal/task/condition_variable.h" 34 #include "avcodec_video_encoder.h" 35 36 namespace OHOS { 37 namespace MediaAVCodec { 38 class ICodecService; 39 } 40 41 namespace Media { 42 enum class StateCode { 43 PAUSE, 44 RESUME, 45 }; 46 47 enum class ProcessStateCode { 48 IDLE, 49 // operate start, resume 50 RECORDING, 51 // operate pause 52 PAUSED, 53 // operate stop 54 STOPPED, 55 ERROR, 56 }; 57 58 class EncoderAdapterCallback { 59 public: 60 virtual ~EncoderAdapterCallback() = default; 61 virtual void OnError(MediaAVCodec::AVCodecErrorType type, int32_t errorCode) = 0; 62 virtual void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) = 0; 63 }; 64 65 class EncoderAdapterKeyFramePtsCallback { 66 public: 67 virtual ~EncoderAdapterKeyFramePtsCallback() = default; 68 virtual void OnReportKeyFramePts(std::string KeyFramePts) = 0; 69 // report the first video frame pts when start() or resume(). 70 virtual void OnReportFirstFramePts(int64_t firstFramePts) = 0; 71 }; 72 73 class SurfaceEncoderAdapter : public std::enable_shared_from_this<SurfaceEncoderAdapter> { 74 public: 75 explicit SurfaceEncoderAdapter(); 76 ~SurfaceEncoderAdapter(); 77 public: 78 Status Init(const std::string &mime, bool isEncoder); 79 Status Configure(const std::shared_ptr<Meta> &meta); 80 Status SetWatermark(std::shared_ptr<AVBuffer> &waterMarkBuffer); 81 Status SetVideoEnableBFrame(bool &enableBFrame); 82 Status SetStopTime(); 83 Status SetOutputBufferQueue(const sptr<AVBufferQueueProducer> &bufferQueueProducer); 84 Status SetEncoderAdapterCallback(const std::shared_ptr<EncoderAdapterCallback> &encoderAdapterCallback); 85 Status SetEncoderAdapterKeyFramePtsCallback( 86 const std::shared_ptr<EncoderAdapterKeyFramePtsCallback> &encoderAdapterKeyFramePtsCallback); 87 Status SetInputSurface(sptr<Surface> surface); 88 Status SetTransCoderMode(); 89 sptr<Surface> GetInputSurface(); 90 Status Start(); 91 Status Stop(); 92 Status Pause(); 93 Status Resume(); 94 Status Flush(); 95 Status Reset(); 96 Status Release(); 97 Status NotifyEos(int64_t pts); 98 Status SetParameter(const std::shared_ptr<Meta> ¶meter); 99 std::shared_ptr<Meta> GetOutputFormat(); 100 void TransCoderOnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 101 void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 102 void SetFaultEvent(const std::string &errMsg); 103 void SetFaultEvent(const std::string &errMsg, int32_t ret); 104 void SetCallingInfo(int32_t appUid, int32_t appPid, const std::string &bundleName, uint64_t instanceId); 105 void OnInputParameterWithAttrAvailable(uint32_t index, std::shared_ptr<Format> &attribute, 106 std::shared_ptr<Format> ¶meter); 107 108 std::shared_ptr<EncoderAdapterCallback> encoderAdapterCallback_; 109 std::shared_ptr<EncoderAdapterKeyFramePtsCallback> encoderAdapterKeyFramePtsCallback_; 110 bool GetIsTransCoderMode(); 111 112 private: 113 void ReleaseBuffer(); 114 void ConfigureGeneralFormat(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 115 void ConfigureAboutRGBA(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 116 void ConfigureEnableFormat(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 117 void ConfigureAboutEnableTemporalScale(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 118 bool CheckFrames(int64_t currentPts, int64_t &checkFramesPauseTime); 119 void GetCurrentTime(int64_t ¤tTime); 120 void AddStartPts(int64_t currentPts); 121 void AddStopPts(); 122 bool AddPauseResumePts(int64_t currentPts); 123 void HandleWaitforStop(); 124 void Clear(); 125 126 std::shared_ptr<MediaAVCodec::AVCodecVideoEncoder> codecServer_; 127 sptr<AVBufferQueueProducer> outputBufferQueueProducer_; 128 129 std::shared_ptr<Task> releaseBufferTask_{nullptr}; 130 std::mutex releaseBufferMutex_; 131 std::condition_variable releaseBufferCondition_; 132 std::vector<uint32_t> indexs_; 133 std::deque<std::pair<int64_t, StateCode>> pauseResumeQueue_; 134 std::deque<int64_t> totalPauseTimeQueue_{0}; 135 int64_t checkFramesPauseTime_{0}; 136 std::atomic<bool> isThreadExit_ = true; 137 bool isTransCoderMode = false; 138 139 std::mutex mappingPtsMutex_; 140 std::mutex checkFramesMutex_; 141 std::mutex stopMutex_; 142 std::condition_variable stopCondition_; 143 int64_t stopTime_{-1}; 144 int64_t pauseTime_{-1}; 145 int64_t resumeTime_{-1}; 146 std::atomic<int64_t> eosPts_{UINT32_MAX}; 147 std::atomic<int64_t> currentPts_{-1}; 148 int64_t totalPauseTime_{0}; 149 ProcessStateCode curState_{ProcessStateCode::IDLE}; 150 151 int64_t startBufferTime_{-1}; 152 int64_t lastBufferTime_{-1}; 153 bool isStart_ = false; 154 bool isResume_ = false; 155 std::string codecMimeType_; 156 std::string bundleName_; 157 uint64_t instanceId_{0}; 158 int32_t appUid_ {0}; 159 int32_t appPid_ {0}; 160 161 std::string keyFramePts_; 162 bool isStartKeyFramePts_ = false; 163 bool isStopKeyFramePts_ = false; 164 int64_t currentKeyFramePts_{-1}; 165 int64_t preKeyFramePts_{-1}; 166 int32_t videoFrameRate_{-1}; 167 std::deque<std::pair<int64_t, StateCode>> pauseResumePts_; 168 bool enableBFrame_ {false}; 169 bool hasReceivedEOS_ = false; 170 }; 171 } // namespace MediaAVCodec 172 } // namespace OHOS 173 #endif // FILTERS_SURFACE_ENCODER_ADAPTER_H 174