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> &parameter);
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> &parameter);
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 &currentTime);
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