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 class EncoderAdapterCallback { 47 public: 48 virtual ~EncoderAdapterCallback() = default; 49 virtual void OnError(MediaAVCodec::AVCodecErrorType type, int32_t errorCode) = 0; 50 virtual void OnOutputFormatChanged(const std::shared_ptr<Meta> &format) = 0; 51 }; 52 53 class EncoderAdapterKeyFramePtsCallback { 54 public: 55 virtual ~EncoderAdapterKeyFramePtsCallback() = default; 56 virtual void OnReportKeyFramePts(std::string KeyFramePts) = 0; 57 }; 58 59 class SurfaceEncoderAdapter : public std::enable_shared_from_this<SurfaceEncoderAdapter> { 60 public: 61 explicit SurfaceEncoderAdapter(); 62 ~SurfaceEncoderAdapter(); 63 public: 64 Status Init(const std::string &mime, bool isEncoder); 65 Status Configure(const std::shared_ptr<Meta> &meta); 66 Status SetWatermark(std::shared_ptr<AVBuffer> &waterMarkBuffer); 67 Status SetOutputBufferQueue(const sptr<AVBufferQueueProducer> &bufferQueueProducer); 68 Status SetEncoderAdapterCallback(const std::shared_ptr<EncoderAdapterCallback> &encoderAdapterCallback); 69 Status SetEncoderAdapterKeyFramePtsCallback( 70 const std::shared_ptr<EncoderAdapterKeyFramePtsCallback> &encoderAdapterKeyFramePtsCallback); 71 Status SetInputSurface(sptr<Surface> surface); 72 Status SetTransCoderMode(); 73 sptr<Surface> GetInputSurface(); 74 Status Start(); 75 Status Stop(); 76 Status Pause(); 77 Status Resume(); 78 Status Flush(); 79 Status Reset(); 80 Status Release(); 81 Status NotifyEos(int64_t pts); 82 Status SetParameter(const std::shared_ptr<Meta> ¶meter); 83 std::shared_ptr<Meta> GetOutputFormat(); 84 void TransCoderOnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 85 void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer); 86 void SetFaultEvent(const std::string &errMsg); 87 void SetFaultEvent(const std::string &errMsg, int32_t ret); 88 void SetCallingInfo(int32_t appUid, int32_t appPid, const std::string &bundleName, uint64_t instanceId); 89 void OnInputParameterWithAttrAvailable(uint32_t index, std::shared_ptr<Format> &attribute, 90 std::shared_ptr<Format> ¶meter); 91 92 std::shared_ptr<EncoderAdapterCallback> encoderAdapterCallback_; 93 std::shared_ptr<EncoderAdapterKeyFramePtsCallback> encoderAdapterKeyFramePtsCallback_; 94 95 private: 96 void ReleaseBuffer(); 97 void ConfigureGeneralFormat(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 98 void ConfigureAboutRGBA(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 99 void ConfigureEnableFormat(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 100 void ConfigureAboutEnableTemporalScale(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta); 101 bool CheckFrames(int64_t currentPts, int64_t &checkFramesPauseTime); 102 void GetCurrentTime(int64_t ¤tTime); 103 void AddStartPts(int64_t currentPts); 104 void AddStopPts(); 105 bool AddPauseResumePts(int64_t currentPts); 106 107 std::shared_ptr<MediaAVCodec::AVCodecVideoEncoder> codecServer_; 108 sptr<AVBufferQueueProducer> outputBufferQueueProducer_; 109 110 std::shared_ptr<Task> releaseBufferTask_{nullptr}; 111 std::mutex releaseBufferMutex_; 112 std::condition_variable releaseBufferCondition_; 113 std::vector<uint32_t> indexs_; 114 std::deque<std::pair<int64_t, StateCode>> pauseResumeQueue_; 115 std::deque<std::pair<int64_t, int64_t>> mappingTimeQueue_; 116 std::atomic<bool> isThreadExit_ = true; 117 bool isTransCoderMode = false; 118 119 std::mutex mappingPtsMutex_; 120 std::mutex checkFramesMutex_; 121 std::mutex stopMutex_; 122 std::condition_variable stopCondition_; 123 int64_t stopTime_{-1}; 124 std::atomic<int64_t> eosPts_{UINT32_MAX}; 125 std::atomic<int64_t> currentPts_{-1}; 126 int64_t totalPauseTime_{0}; 127 128 int64_t startBufferTime_{-1}; 129 int64_t lastBufferTime_{-1}; 130 bool isStart_ = false; 131 bool isResume_ = false; 132 std::string codecMimeType_; 133 std::string bundleName_; 134 uint64_t instanceId_{0}; 135 int32_t appUid_ {0}; 136 int32_t appPid_ {0}; 137 138 std::string keyFramePts_; 139 bool isStartKeyFramePts_ = false; 140 bool isStopKeyFramePts_ = false; 141 int64_t currentKeyFramePts_{-1}; 142 int64_t preKeyFramePts_{-1}; 143 std::deque<std::pair<int64_t, StateCode>> pauseResumePts_; 144 }; 145 } // namespace MediaAVCodec 146 } // namespace OHOS 147 #endif // FILTERS_SURFACE_ENCODER_ADAPTER_H 148