• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &parameter);
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> &parameter);
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 &currentTime);
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