• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 #include "surface_encoder_adapter.h"
17 #include <ctime>
18 #include "avcodec_info.h"
19 #include "avcodec_common.h"
20 #include "codec_server.h"
21 #include "meta/format.h"
22 #include "media_description.h"
23 #include "native_avcapability.h"
24 #include "native_avcodec_base.h"
25 #include "avcodec_trace.h"
26 #include "avcodec_sysevent.h"
27 #include "common/log.h"
28 
29 namespace {
30 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_RECORDER, "SurfaceEncoderAdapter" };
31 }
32 
33 constexpr uint32_t TIME_OUT_MS = 1000;
34 constexpr uint32_t NS_PER_US = 1000;
35 constexpr int64_t SEC_TO_NS = 1000000000;
36 constexpr uint32_t STOP_TIME_OUT_MS = 2000;
37 //Codec wait timeout with no video frame received
38 constexpr uint32_t AVCODEC_ERR_TIMEOUT_NO_FRAME_RECEIVED = 50001 ;
39 namespace OHOS {
40 namespace Media {
41 
42 using namespace OHOS::MediaAVCodec;
43 class SurfaceEncoderAdapterCallback : public MediaAVCodec::MediaCodecCallback {
44 public:
SurfaceEncoderAdapterCallback(std::shared_ptr<SurfaceEncoderAdapter> surfaceEncoderAdapter)45     explicit SurfaceEncoderAdapterCallback(std::shared_ptr<SurfaceEncoderAdapter> surfaceEncoderAdapter)
46         : surfaceEncoderAdapter_(std::move(surfaceEncoderAdapter))
47     {
48     }
49 
OnError(MediaAVCodec::AVCodecErrorType errorType,int32_t errorCode)50     void OnError(MediaAVCodec::AVCodecErrorType errorType, int32_t errorCode) override
51     {
52         if (auto surfaceEncoderAdapter = surfaceEncoderAdapter_.lock()) {
53             if (surfaceEncoderAdapter->GetIsTransCoderMode() && transCoderErrorCbOnce_) {
54                 return;
55             }
56             if (surfaceEncoderAdapter->GetIsTransCoderMode()) {
57                 transCoderErrorCbOnce_ = true;
58             }
59             surfaceEncoderAdapter->encoderAdapterCallback_->OnError(errorType, errorCode);
60         } else {
61             MEDIA_LOG_I("invalid surfaceEncoderAdapter");
62         }
63     }
64 
OnOutputFormatChanged(const MediaAVCodec::Format & format)65     void OnOutputFormatChanged(const MediaAVCodec::Format &format) override
66     {
67     }
68 
OnInputBufferAvailable(uint32_t index,std::shared_ptr<AVBuffer> buffer)69     void OnInputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override
70     {
71     }
72 
OnOutputBufferAvailable(uint32_t index,std::shared_ptr<AVBuffer> buffer)73     void OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer) override
74     {
75         if (auto surfaceEncoderAdapter = surfaceEncoderAdapter_.lock()) {
76             surfaceEncoderAdapter->OnOutputBufferAvailable(index, buffer);
77         } else {
78             MEDIA_LOG_I("invalid surfaceEncoderAdapter");
79         }
80     }
81 
82 private:
83     std::weak_ptr<SurfaceEncoderAdapter> surfaceEncoderAdapter_;
84     bool transCoderErrorCbOnce_ = false;
85 };
86 
87 class DroppedFramesCallback : public MediaAVCodec::MediaCodecParameterWithAttrCallback {
88 public:
DroppedFramesCallback(std::shared_ptr<SurfaceEncoderAdapter> surfaceEncoderAdapter)89     explicit DroppedFramesCallback(std::shared_ptr<SurfaceEncoderAdapter> surfaceEncoderAdapter)
90         : surfaceEncoderAdapter_(std::move(surfaceEncoderAdapter))
91     {
92     }
93 
OnInputParameterWithAttrAvailable(uint32_t index,std::shared_ptr<Format> attribute,std::shared_ptr<Format> parameter)94     void OnInputParameterWithAttrAvailable(uint32_t index, std::shared_ptr<Format> attribute,
95         std::shared_ptr<Format> parameter) override
96     {
97         if (auto surfaceEncoderAdapter = surfaceEncoderAdapter_.lock()) {
98             surfaceEncoderAdapter->OnInputParameterWithAttrAvailable(index, attribute, parameter);
99         } else {
100             MEDIA_LOG_I("invalid surfaceEncoderAdapter");
101         }
102     }
103 
104 private:
105     std::weak_ptr<SurfaceEncoderAdapter> surfaceEncoderAdapter_;
106 };
107 
SurfaceEncoderAdapter()108 SurfaceEncoderAdapter::SurfaceEncoderAdapter()
109 {
110     MEDIA_LOG_I("encoder adapter create");
111 }
112 
~SurfaceEncoderAdapter()113 SurfaceEncoderAdapter::~SurfaceEncoderAdapter()
114 {
115     MEDIA_LOG_I("encoder adapter destroy");
116     if (codecServer_) {
117         codecServer_->Release();
118     }
119     codecServer_ = nullptr;
120 }
121 
Init(const std::string & mime,bool isEncoder)122 Status SurfaceEncoderAdapter::Init(const std::string &mime, bool isEncoder)
123 {
124     MEDIA_LOG_I("Init mime: " PUBLIC_LOG_S, mime.c_str());
125     codecMimeType_ = mime;
126     Format format;
127     std::shared_ptr<Media::Meta> callerInfo = std::make_shared<Media::Meta>();
128     callerInfo->SetData(Media::Tag::AV_CODEC_FORWARD_CALLER_PID, appPid_);
129     callerInfo->SetData(Media::Tag::AV_CODEC_FORWARD_CALLER_UID, appUid_);
130     callerInfo->SetData(Media::Tag::AV_CODEC_FORWARD_CALLER_PROCESS_NAME, bundleName_);
131     format.SetMeta(callerInfo);
132     int32_t ret = MediaAVCodec::VideoEncoderFactory::CreateByMime(mime, format, codecServer_);
133     MEDIA_LOG_I("AVCodecVideoEncoderImpl::Init CreateByMime errorCode %{public}d", ret);
134     if (!codecServer_) {
135         MEDIA_LOG_I("Create codecServer failed");
136         SetFaultEvent("SurfaceEncoderAdapter::Init Create codecServer failed", ret);
137         return Status::ERROR_UNKNOWN;
138     }
139     if (!releaseBufferTask_) {
140         releaseBufferTask_ = std::make_shared<Task>("SurfaceEncoder",  "", TaskType::SINGLETON);
141         releaseBufferTask_->RegisterJob([this] {
142             ReleaseBuffer();
143             return 0;
144         });
145     }
146     return Status::OK;
147 }
148 
ConfigureGeneralFormat(MediaAVCodec::Format & format,const std::shared_ptr<Meta> & meta)149 void SurfaceEncoderAdapter::ConfigureGeneralFormat(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta)
150 {
151     MEDIA_LOG_I("ConfigureGeneralFormat");
152     if (meta->Find(Tag::VIDEO_WIDTH) != meta->end()) {
153         int32_t videoWidth;
154         meta->Get<Tag::VIDEO_WIDTH>(videoWidth);
155         format.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_WIDTH, videoWidth);
156     }
157     if (meta->Find(Tag::VIDEO_HEIGHT) != meta->end()) {
158         int32_t videoHeight;
159         meta->Get<Tag::VIDEO_HEIGHT>(videoHeight);
160         format.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_HEIGHT, videoHeight);
161     }
162     if (meta->Find(Tag::VIDEO_CAPTURE_RATE) != meta->end()) {
163         double videoCaptureRate;
164         meta->Get<Tag::VIDEO_CAPTURE_RATE>(videoCaptureRate);
165         format.PutDoubleValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_CAPTURE_RATE, videoCaptureRate);
166     }
167     if (meta->Find(Tag::MEDIA_BITRATE) != meta->end()) {
168         int64_t mediaBitrate;
169         meta->Get<Tag::MEDIA_BITRATE>(mediaBitrate);
170         format.PutLongValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_BITRATE, mediaBitrate);
171     }
172     if (meta->Find(Tag::VIDEO_FRAME_RATE) != meta->end()) {
173         double videoFrameRate;
174         meta->Get<Tag::VIDEO_FRAME_RATE>(videoFrameRate);
175         FALSE_LOG_MSG(videoFrameRate > 0, "videoFrameRate get invalid");
176         videoFrameRate_ = static_cast<int32_t>(videoFrameRate);
177         MEDIA_LOG_I("videoFrameRate_: %{public}d", videoFrameRate_);
178         format.PutDoubleValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_FRAME_RATE, videoFrameRate);
179     }
180     if (meta->Find(Tag::MIME_TYPE) != meta->end()) {
181         std::string mimeType;
182         meta->Get<Tag::MIME_TYPE>(mimeType);
183         format.PutStringValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_CODEC_MIME, mimeType);
184     }
185     if (meta->Find(Tag::VIDEO_H265_PROFILE) != meta->end()) {
186         Plugins::HEVCProfile h265Profile;
187         meta->Get<Tag::VIDEO_H265_PROFILE>(h265Profile);
188         format.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_PROFILE, h265Profile);
189     }
190 }
191 
ConfigureEnableFormat(MediaAVCodec::Format & format,const std::shared_ptr<Meta> & meta)192 void SurfaceEncoderAdapter::ConfigureEnableFormat(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta)
193 {
194     MEDIA_LOG_I("ConfigureEnableFormat");
195     if (meta->Find(Tag::VIDEO_ENCODER_ENABLE_WATERMARK) != meta->end()) {
196         bool enableWatermark = false;
197         meta->Get<Tag::VIDEO_ENCODER_ENABLE_WATERMARK>(enableWatermark);
198         format.PutIntValue(Tag::VIDEO_ENCODER_ENABLE_WATERMARK, enableWatermark);
199     }
200 }
201 
Configure(const std::shared_ptr<Meta> & meta)202 Status SurfaceEncoderAdapter::Configure(const std::shared_ptr<Meta> &meta)
203 {
204     MEDIA_LOG_I("Configure");
205     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Configure");
206     MediaAVCodec::Format format = MediaAVCodec::Format();
207     ConfigureGeneralFormat(format, meta);
208     ConfigureAboutRGBA(format, meta);
209     ConfigureAboutEnableTemporalScale(format, meta);
210     ConfigureEnableFormat(format, meta);
211     if (!codecServer_) {
212         SetFaultEvent("SurfaceEncoderAdapter::Configure, CodecServer is null");
213         return Status::ERROR_UNKNOWN;
214     }
215     int32_t ret = static_cast<int32_t>(Status::OK);
216     if (!isTransCoderMode) {
217         std::shared_ptr<MediaAVCodec::MediaCodecParameterWithAttrCallback> droppedFramesCallback =
218         std::make_shared<DroppedFramesCallback>(shared_from_this());
219         ret = codecServer_->SetCallback(droppedFramesCallback);
220         if (ret != 0) {
221             MEDIA_LOG_I("Set dropped Frames Callback failed");
222             SetFaultEvent("DroppedFramesCallback::DroppedFramesCallback error", ret);
223             return Status::ERROR_UNKNOWN;
224         }
225     }
226     if (isTransCoderMode) {
227         format.PutIntValue(Tag::VIDEO_FRAME_RATE_ADAPTIVE_MODE, true);
228         bool isSetEnable = meta->Get<Tag::AV_TRANSCODER_ENABLE_B_FRAME>(enableBFrame_);
229         MEDIA_LOG_I("Transcoder enable B frame: %{public}d", static_cast<int32_t>(enableBFrame_));
230         if (isSetEnable) {
231             format.PutIntValue(Tag::VIDEO_ENCODER_ENABLE_B_FRAME, static_cast<int32_t>(enableBFrame_));
232         }
233     }
234     if (!isTransCoderMode) {
235         format.PutIntValue(Tag::VIDEO_ENCODER_ENABLE_B_FRAME, enableBFrame_);
236     }
237     ret = codecServer_->Configure(format);
238     if (ret != 0) {
239         SetFaultEvent("SurfaceEncoderAdapter::Configure error", ret);
240     }
241     return ret == 0 ? Status::OK : Status::ERROR_UNKNOWN;
242 }
243 
SetWatermark(std::shared_ptr<AVBuffer> & waterMarkBuffer)244 Status SurfaceEncoderAdapter::SetWatermark(std::shared_ptr<AVBuffer> &waterMarkBuffer)
245 {
246     MEDIA_LOG_I("SetWaterMark");
247     if (!codecServer_) {
248         MEDIA_LOG_I("CodecServer is null");
249         SetFaultEvent("SurfaceEncoderAdapter::setWatermark, CodecServer is null");
250         return Status::ERROR_UNKNOWN;
251     }
252     int ret = codecServer_->SetCustomBuffer(waterMarkBuffer);
253     if (ret != 0) {
254         MEDIA_LOG_E("SetCustomBuffer error");
255         return Status::ERROR_UNKNOWN;
256     }
257     return Status::OK;
258 }
259 
SetVideoEnableBFrame(bool & enableBFrame)260 Status SurfaceEncoderAdapter::SetVideoEnableBFrame(bool &enableBFrame)
261 {
262     MEDIA_LOG_I("SurfaceEncoderAdapter::SetVideoEnableBFrame in, enableBFrame is: %{public}d", enableBFrame);
263     if (!codecServer_) {
264         MEDIA_LOG_I("CodecServer is null");
265         SetFaultEvent("SurfaceEncoderAdapter::SetVideoEnableBFrame, CodecServer is null");
266         return Status::ERROR_UNKNOWN;
267     }
268     enableBFrame_ = enableBFrame;
269     return Status::OK;
270 }
271 
SetStopTime()272 Status SurfaceEncoderAdapter::SetStopTime()
273 {
274     GetCurrentTime(stopTime_);
275     MEDIA_LOG_I("SetStopTime: " PUBLIC_LOG_D64, stopTime_);
276     return Status::OK;
277 }
278 
SetOutputBufferQueue(const sptr<AVBufferQueueProducer> & bufferQueueProducer)279 Status SurfaceEncoderAdapter::SetOutputBufferQueue(const sptr<AVBufferQueueProducer> &bufferQueueProducer)
280 {
281     MEDIA_LOG_I("SetOutputBufferQueue");
282     outputBufferQueueProducer_ = bufferQueueProducer;
283     return Status::OK;
284 }
285 
SetEncoderAdapterCallback(const std::shared_ptr<EncoderAdapterCallback> & encoderAdapterCallback)286 Status SurfaceEncoderAdapter::SetEncoderAdapterCallback(
287     const std::shared_ptr<EncoderAdapterCallback> &encoderAdapterCallback)
288 {
289     MEDIA_LOG_I("SetEncoderAdapterCallback");
290     std::shared_ptr<MediaAVCodec::MediaCodecCallback> surfaceEncoderAdapterCallback =
291         std::make_shared<SurfaceEncoderAdapterCallback>(shared_from_this());
292     encoderAdapterCallback_ = encoderAdapterCallback;
293     if (!codecServer_) {
294         SetFaultEvent("SurfaceEncoderAdapter::SetEncoderAdapterCallback, CodecServer is null");
295         return Status::ERROR_UNKNOWN;
296     }
297     int32_t ret = codecServer_->SetCallback(surfaceEncoderAdapterCallback);
298     if (ret == 0) {
299         return Status::OK;
300     } else {
301         SetFaultEvent("SurfaceEncoderAdapter::SetEncoderAdapterCallback error", ret);
302         return Status::ERROR_UNKNOWN;
303     }
304 }
305 
SetEncoderAdapterKeyFramePtsCallback(const std::shared_ptr<EncoderAdapterKeyFramePtsCallback> & encoderAdapterKeyFramePtsCallback)306 Status SurfaceEncoderAdapter::SetEncoderAdapterKeyFramePtsCallback(
307     const std::shared_ptr<EncoderAdapterKeyFramePtsCallback> &encoderAdapterKeyFramePtsCallback)
308 {
309     MEDIA_LOG_I("SetEncoderAdapterKeyFramePtsCallback");
310     encoderAdapterKeyFramePtsCallback_ = encoderAdapterKeyFramePtsCallback;
311     return Status::OK;
312 }
313 
SetInputSurface(sptr<Surface> surface)314 Status SurfaceEncoderAdapter::SetInputSurface(sptr<Surface> surface)
315 {
316     MEDIA_LOG_I("GetInputSurface");
317     if (!codecServer_) {
318         SetFaultEvent("SurfaceEncoderAdapter::SetInputSurface, CodecServer is null");
319         return Status::ERROR_UNKNOWN;
320     }
321     MediaAVCodec::CodecServer *codecServerPtr = (MediaAVCodec::CodecServer *)(codecServer_.get());
322     int32_t ret = codecServerPtr->SetInputSurface(surface);
323     if (ret == 0) {
324         return Status::OK;
325     } else {
326         SetFaultEvent("SurfaceEncoderAdapter::SetInputSurface error", ret);
327         return Status::ERROR_UNKNOWN;
328     }
329 }
330 
SetTransCoderMode()331 Status SurfaceEncoderAdapter::SetTransCoderMode()
332 {
333     MEDIA_LOG_I("SetTransCoderMode");
334     isTransCoderMode = true;
335     return Status::OK;
336 }
337 
GetInputSurface()338 sptr<Surface> SurfaceEncoderAdapter::GetInputSurface()
339 {
340     FALSE_RETURN_V_MSG(codecServer_ != nullptr, nullptr, "codecServer_ is nullptr");
341     return codecServer_->CreateInputSurface();
342 }
343 
Start()344 Status SurfaceEncoderAdapter::Start()
345 {
346     MEDIA_LOG_I("Start");
347     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Start");
348     if (!codecServer_) {
349         SetFaultEvent("SurfaceEncoderAdapter::Start, CodecServer is null");
350         return Status::ERROR_UNKNOWN;
351     }
352     Clear();
353     int32_t ret;
354     isThreadExit_ = false;
355     hasReceivedEOS_ = false;
356     if (releaseBufferTask_) {
357         releaseBufferTask_->Start();
358     }
359     ret = codecServer_->Start();
360     isStart_ = true;
361     isStartKeyFramePts_ = true;
362     if (ret == 0) {
363         curState_ = ProcessStateCode::RECORDING;
364         return Status::OK;
365     } else {
366         SetFaultEvent("SurfaceEncoderAdapter::Start error", ret);
367         curState_ = ProcessStateCode::ERROR;
368         return Status::ERROR_UNKNOWN;
369     }
370 }
371 
Stop()372 Status SurfaceEncoderAdapter::Stop()
373 {
374     MEDIA_LOG_I("Stop");
375     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Stop");
376     if (stopTime_ < 0) {
377         GetCurrentTime(stopTime_);
378     }
379     isStopKeyFramePts_ = true;
380     MEDIA_LOG_I("Stop time: " PUBLIC_LOG_D64, stopTime_);
381     // operate stop when it is paused state.
382     if (curState_ == ProcessStateCode::PAUSED && !isTransCoderMode) {
383         stopTime_ = pauseTime_;
384         // current frame is not the last frame before the pasue time, wait for stop
385         if (currentKeyFramePts_ <= pauseTime_ - (SEC_TO_NS / videoFrameRate_)) {
386             MEDIA_LOG_D("paused state -> stop, wait for stop.");
387             HandleWaitforStop();
388         }
389         // else stop directly
390         AddStopPts();
391     }
392     // operate stop when it is recording state.
393     if (curState_ == ProcessStateCode::RECORDING && !isTransCoderMode) {
394         MEDIA_LOG_D("recording state -> stop, wait for stop.");
395         HandleWaitforStop();
396         AddStopPts();
397     }
398 
399     if (releaseBufferTask_) {
400         {
401             std::lock_guard<std::mutex> lock(releaseBufferMutex_);
402             isThreadExit_ = true;
403         }
404         releaseBufferCondition_.notify_all();
405         releaseBufferTask_->Stop();
406         MEDIA_LOG_I("releaseBufferTask_ Stop");
407     }
408     if (!codecServer_) {
409         return Status::OK;
410     }
411     int32_t ret = codecServer_->Stop();
412     MEDIA_LOG_I("codecServer_ Stop");
413     isStart_ = false;
414     if (ret == 0) {
415         curState_ = ProcessStateCode::STOPPED;
416         return Status::OK;
417     } else {
418         SetFaultEvent("SurfaceEncoderAdapter::Stop error", ret);
419         curState_ = ProcessStateCode::ERROR;
420         return Status::ERROR_UNKNOWN;
421     }
422 }
423 
Pause()424 Status SurfaceEncoderAdapter::Pause()
425 {
426     MEDIA_LOG_I("Pause");
427     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Pause");
428     if (isTransCoderMode) {
429         return Status::OK;
430     }
431     std::lock_guard<std::mutex> lock(checkFramesMutex_);
432     GetCurrentTime(pauseTime_);
433     FALSE_RETURN_V_MSG(pauseTime_ > 0, Status::ERROR_UNKNOWN, "GetCurrentTime pauseTime_ <= 0");
434     MEDIA_LOG_I("Pause time: " PUBLIC_LOG_D64, pauseTime_);
435     if (pauseResumeQueue_.empty() ||
436         (pauseResumeQueue_.back().second == StateCode::RESUME && pauseResumeQueue_.back().first <= pauseTime_)) {
437         pauseResumeQueue_.push_back({pauseTime_, StateCode::PAUSE});
438         pauseResumeQueue_.push_back({std::numeric_limits<int64_t>::max(), StateCode::RESUME});
439         pauseResumePts_.push_back({pauseTime_, StateCode::PAUSE});
440         pauseResumePts_.push_back({std::numeric_limits<int64_t>::max(), StateCode::RESUME});
441     }
442     curState_ = ProcessStateCode::PAUSED;
443     return Status::OK;
444 }
445 
Resume()446 Status SurfaceEncoderAdapter::Resume()
447 {
448     MEDIA_LOG_I("Resume");
449     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Resume");
450     if (isTransCoderMode) {
451         isResume_ = true;
452         return Status::OK;
453     }
454     std::lock_guard<std::mutex> lock(checkFramesMutex_);
455     GetCurrentTime(resumeTime_);
456     FALSE_RETURN_V_MSG(resumeTime_ > 0, Status::ERROR_UNKNOWN, "GetCurrentTime resumeTime_ <= 0");
457     MEDIA_LOG_I("resume time: " PUBLIC_LOG_D64, resumeTime_);
458     if (pauseResumeQueue_.empty()) {
459         MEDIA_LOG_I("Status Error, no pause before resume");
460         return Status::ERROR_UNKNOWN;
461     }
462     if (pauseResumeQueue_.back().second == StateCode::RESUME) {
463         pauseResumeQueue_.back().first = std::min(resumeTime_, pauseResumeQueue_.back().first);
464         pauseResumePts_.back().first = std::min(resumeTime_, pauseResumePts_.back().first);
465     }
466     if (pauseTime_ != -1) {
467         totalPauseTime_ = totalPauseTime_ + resumeTime_ - pauseTime_;
468         MEDIA_LOG_I("total pause time: " PUBLIC_LOG_D64, totalPauseTime_);
469         // total pause time (without checkFramesPauseTime)
470         totalPauseTimeQueue_.push_back(totalPauseTime_);
471     }
472 
473     curState_ = ProcessStateCode::RECORDING;
474     pauseTime_ = -1;
475     resumeTime_ = -1;
476     return Status::OK;
477 }
478 
Flush()479 Status SurfaceEncoderAdapter::Flush()
480 {
481     MEDIA_LOG_I("Flush");
482     if (!codecServer_) {
483         SetFaultEvent("SurfaceEncoderAdapter::Flush, CodecServer is null");
484         return Status::ERROR_UNKNOWN;
485     }
486     int32_t ret = codecServer_->Flush();
487     if (ret == 0) {
488         return Status::OK;
489     } else {
490         SetFaultEvent("SurfaceEncoderAdapter::Flush error", ret);
491         curState_ = ProcessStateCode::ERROR;
492         return Status::ERROR_UNKNOWN;
493     }
494 }
495 
Reset()496 Status SurfaceEncoderAdapter::Reset()
497 {
498     MEDIA_LOG_I("Reset");
499     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Reset");
500     if (!codecServer_) {
501         return Status::OK;
502     }
503     int32_t ret = codecServer_->Reset();
504     Clear();
505     if (ret == 0) {
506         curState_ = ProcessStateCode::IDLE;
507         return Status::OK;
508     } else {
509         SetFaultEvent("SurfaceEncoderAdapter::Reset error", ret);
510         curState_ = ProcessStateCode::ERROR;
511         return Status::ERROR_UNKNOWN;
512     }
513 }
514 
Release()515 Status SurfaceEncoderAdapter::Release()
516 {
517     MEDIA_LOG_I("Release");
518     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::Release");
519     if (!codecServer_) {
520         return Status::OK;
521     }
522     int32_t ret = codecServer_->Release();
523     if (ret == 0) {
524         return Status::OK;
525     } else {
526         SetFaultEvent("SurfaceEncoderAdapter::Release error", ret);
527         return Status::ERROR_UNKNOWN;
528     }
529 }
530 
NotifyEos(int64_t pts)531 Status SurfaceEncoderAdapter::NotifyEos(int64_t pts)
532 {
533     MEDIA_LOG_I("NotifyEos");
534     if (!codecServer_) {
535         SetFaultEvent("SurfaceEncoderAdapter::NotifyEos, CodecServer is null");
536         return Status::ERROR_UNKNOWN;
537     }
538     int32_t ret = 0;
539     MEDIA_LOG_I("lastBuffer PTS: " PUBLIC_LOG_D64 " current PTS: " PUBLIC_LOG_D64, pts, currentPts_.load());
540     eosPts_ = pts;
541     ret = codecServer_->NotifyEos();
542     if (ret == 0) {
543         return Status::OK;
544     } else {
545         SetFaultEvent("SurfaceEncoderAdapter::NotifyEos error", ret);
546         return Status::ERROR_UNKNOWN;
547     }
548 }
549 
SetParameter(const std::shared_ptr<Meta> & parameter)550 Status SurfaceEncoderAdapter::SetParameter(const std::shared_ptr<Meta> &parameter)
551 {
552     MEDIA_LOG_I("SetParameter");
553     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::SetParameter");
554     if (!codecServer_) {
555         SetFaultEvent("SurfaceEncoderAdapter::SetParameter, CodecServer is null");
556         return Status::ERROR_UNKNOWN;
557     }
558     MediaAVCodec::Format format = MediaAVCodec::Format();
559     int32_t ret = codecServer_->SetParameter(format);
560     if (ret == 0) {
561         return Status::OK;
562     } else {
563         SetFaultEvent("SurfaceEncoderAdapter::SetParameter error", ret);
564         return Status::ERROR_UNKNOWN;
565     }
566 }
567 
GetOutputFormat()568 std::shared_ptr<Meta> SurfaceEncoderAdapter::GetOutputFormat()
569 {
570     MEDIA_LOG_I("GetOutputFormat is not supported");
571     return nullptr;
572 }
573 
TransCoderOnOutputBufferAvailable(uint32_t index,std::shared_ptr<AVBuffer> buffer)574 void SurfaceEncoderAdapter::TransCoderOnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer)
575 {
576     int32_t size = buffer->memory_->GetSize();
577     std::shared_ptr<AVBuffer> emptyOutputBuffer;
578     AVBufferConfig avBufferConfig;
579     avBufferConfig.size = size;
580     avBufferConfig.memoryType = MemoryType::SHARED_MEMORY;
581     avBufferConfig.memoryFlag = MemoryFlag::MEMORY_READ_WRITE;
582     Status status = outputBufferQueueProducer_->RequestBuffer(emptyOutputBuffer, avBufferConfig, TIME_OUT_MS);
583     if (status != Status::OK) {
584         MEDIA_LOG_I("RequestBuffer fail.");
585         return;
586     }
587     std::shared_ptr<AVMemory> &bufferMem = emptyOutputBuffer->memory_;
588     if (emptyOutputBuffer->memory_ == nullptr) {
589         MEDIA_LOG_I("emptyOutputBuffer->memory_ is nullptr");
590         return;
591     }
592     bufferMem->Write(buffer->memory_->GetAddr(), size, 0);
593     bufferMem->SetSize(size);
594     *(emptyOutputBuffer->meta_) = *(buffer->meta_);
595     emptyOutputBuffer->pts_ = buffer->pts_;
596     emptyOutputBuffer->flag_ = buffer->flag_;
597     outputBufferQueueProducer_->PushBuffer(emptyOutputBuffer, true);
598     {
599         std::lock_guard<std::mutex> lock(releaseBufferMutex_);
600         indexs_.push_back(index);
601     }
602     releaseBufferCondition_.notify_all();
603     MEDIA_LOG_D("OnOutputBufferAvailable end");
604 }
605 
OnOutputBufferAvailable(uint32_t index,std::shared_ptr<AVBuffer> buffer)606 void SurfaceEncoderAdapter::OnOutputBufferAvailable(uint32_t index, std::shared_ptr<AVBuffer> buffer)
607 {
608     MEDIA_LOG_D("OnOutputBufferAvailable buffer->pts" PUBLIC_LOG_D64, buffer->pts_);
609     currentPts_ = currentPts_.load() < buffer->pts_? buffer->pts_ : currentPts_.load();
610     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::OnOutputBufferAvailable");
611     if (isTransCoderMode) {
612         TransCoderOnOutputBufferAvailable(index, buffer);
613         return;
614     }
615     FALSE_RETURN_MSG(buffer->memory_ != nullptr, "buffer->memory_ is nullptr, OnOutputBufferAvailable fail");
616     int32_t size = buffer->memory_->GetSize();
617     std::shared_ptr<AVBuffer> outputBuffer;
618     AVBufferConfig avBufferConfig;
619     avBufferConfig.size = size;
620     avBufferConfig.memoryType = MemoryType::SHARED_MEMORY;
621     avBufferConfig.memoryFlag = MemoryFlag::MEMORY_READ_WRITE;
622     Status status = outputBufferQueueProducer_->RequestBuffer(outputBuffer, avBufferConfig, TIME_OUT_MS);
623     FALSE_RETURN_MSG(status == Status::OK, "RequestBuffer fail.");
624     FALSE_RETURN_MSG(outputBuffer != nullptr, "outputBuffer is nullptr.");
625     std::shared_ptr<AVMemory> &bufferMem = outputBuffer->memory_;
626     FALSE_RETURN_MSG(outputBuffer->memory_ != nullptr, "outputBuffer->memory_ is nullptr");
627     bufferMem->Write(buffer->memory_->GetAddr(), size, 0);
628     *(outputBuffer->meta_) = *(buffer->meta_);
629     outputBuffer->pts_ = buffer->pts_ / NS_PER_US;
630     outputBuffer->flag_ = buffer->flag_;
631     outputBufferQueueProducer_->PushBuffer(outputBuffer, true);
632     {
633         std::lock_guard<std::mutex> lock(releaseBufferMutex_);
634         indexs_.push_back(index);
635     }
636     releaseBufferCondition_.notify_all();
637     if (buffer->flag_ == AVCODEC_BUFFER_FLAG_EOS) {
638         MEDIA_LOG_I("EOS received, ready to stop.");
639         hasReceivedEOS_ = true;
640         std::unique_lock<std::mutex> lock(stopMutex_);
641         stopCondition_.notify_all();
642     }
643 }
644 
ReleaseBuffer()645 void SurfaceEncoderAdapter::ReleaseBuffer()
646 {
647     MEDIA_LOG_I("ReleaseBuffer");
648     while (true) {
649         if (isThreadExit_) {
650             MEDIA_LOG_I("Exit ReleaseBuffer thread.");
651             break;
652         }
653         std::vector<uint32_t> indexs;
654         {
655             std::unique_lock<std::mutex> lock(releaseBufferMutex_);
656             releaseBufferCondition_.wait(lock, [this] {
657                 return isThreadExit_ || !indexs_.empty();
658             });
659             indexs = indexs_;
660             indexs_.clear();
661         }
662         for (auto &index : indexs) {
663             codecServer_->ReleaseOutputBuffer(index);
664         }
665     }
666     MEDIA_LOG_I("ReleaseBuffer end");
667 }
668 
ConfigureAboutRGBA(MediaAVCodec::Format & format,const std::shared_ptr<Meta> & meta)669 void SurfaceEncoderAdapter::ConfigureAboutRGBA(MediaAVCodec::Format &format, const std::shared_ptr<Meta> &meta)
670 {
671     Plugins::VideoPixelFormat pixelFormat = Plugins::VideoPixelFormat::NV12;
672     if (meta->Find(Tag::VIDEO_PIXEL_FORMAT) != meta->end()) {
673         meta->Get<Tag::VIDEO_PIXEL_FORMAT>(pixelFormat);
674     }
675     format.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_PIXEL_FORMAT, static_cast<int32_t>(pixelFormat));
676 
677     if (meta->Find(Tag::VIDEO_ENCODE_BITRATE_MODE) != meta->end()) {
678         Plugins::VideoEncodeBitrateMode videoEncodeBitrateMode;
679         meta->Get<Tag::VIDEO_ENCODE_BITRATE_MODE>(videoEncodeBitrateMode);
680         format.PutIntValue(MediaAVCodec::MediaDescriptionKey::MD_KEY_VIDEO_ENCODE_BITRATE_MODE, videoEncodeBitrateMode);
681     }
682 }
683 
ConfigureAboutEnableTemporalScale(MediaAVCodec::Format & format,const std::shared_ptr<Meta> & meta)684 void SurfaceEncoderAdapter::ConfigureAboutEnableTemporalScale(MediaAVCodec::Format &format,
685     const std::shared_ptr<Meta> &meta)
686 {
687     if (meta->Find(Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY) != meta->end()) {
688         bool enableTemporalScale;
689         meta->Get<Tag::VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY>(enableTemporalScale);
690         if (!enableTemporalScale) {
691             MEDIA_LOG_I("video encoder enableTemporalScale is false!");
692             return;
693         }
694         OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, true);
695         bool isSupported = OH_AVCapability_IsFeatureSupported(capability, VIDEO_ENCODER_TEMPORAL_SCALABILITY);
696         if (isSupported) {
697             MEDIA_LOG_I("VIDEO_ENCODER_TEMPORAL_SCALABILITY is supported!");
698             format.PutIntValue(MediaAVCodec::MediaDescriptionKey::OH_MD_KEY_VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY,
699                 1);
700         } else {
701             MEDIA_LOG_I("VIDEO_ENCODER_TEMPORAL_SCALABILITY is not supported!");
702         }
703     }
704 }
705 
SetFaultEvent(const std::string & errMsg,int32_t ret)706 void SurfaceEncoderAdapter::SetFaultEvent(const std::string &errMsg, int32_t ret)
707 {
708     SetFaultEvent(errMsg + ", ret = " + std::to_string(ret));
709 }
710 
SetFaultEvent(const std::string & errMsg)711 void SurfaceEncoderAdapter::SetFaultEvent(const std::string &errMsg)
712 {
713     VideoCodecFaultInfo videoCodecFaultInfo;
714     videoCodecFaultInfo.appName = bundleName_;
715     videoCodecFaultInfo.instanceId = std::to_string(instanceId_);
716     videoCodecFaultInfo.callerType = "player_framework";
717     videoCodecFaultInfo.videoCodec = codecMimeType_;
718     videoCodecFaultInfo.errMsg = errMsg;
719     FaultVideoCodecEventWrite(videoCodecFaultInfo);
720 }
721 
SetCallingInfo(int32_t appUid,int32_t appPid,const std::string & bundleName,uint64_t instanceId)722 void SurfaceEncoderAdapter::SetCallingInfo(int32_t appUid, int32_t appPid,
723     const std::string &bundleName, uint64_t instanceId)
724 {
725     appUid_ = appUid;
726     appPid_ = appPid;
727     bundleName_ = bundleName;
728     instanceId_ = instanceId;
729 }
730 
OnInputParameterWithAttrAvailable(uint32_t index,std::shared_ptr<Format> & attribute,std::shared_ptr<Format> & parameter)731 void SurfaceEncoderAdapter::OnInputParameterWithAttrAvailable(uint32_t index, std::shared_ptr<Format> &attribute,
732     std::shared_ptr<Format> &parameter)
733 {
734     MediaAVCodec::AVCodecTrace trace("SurfaceEncoderAdapter::OnInputParameterWithAttrAvailable");
735     if (isTransCoderMode) {
736         MEDIA_LOG_D("isTransCoderMode");
737         parameter->PutIntValue(Tag::VIDEO_ENCODER_PER_FRAME_DISCARD, false);
738         codecServer_->QueueInputParameter(index);
739         return;
740     }
741     std::lock_guard<std::mutex> lock(checkFramesMutex_);
742     int64_t currentPts = 0;
743     attribute->GetLongValue(Tag::MEDIA_TIME_STAMP, currentPts);
744     MEDIA_LOG_D("OnInputParameterWithAttrAvailable currentPts " PUBLIC_LOG_D64, currentPts);
745 
746     bool isDroppedFrames = CheckFrames(currentPts, checkFramesPauseTime_);
747     MEDIA_LOG_D("OnInputParameterWithAttrAvailable checkFramesPauseTime " PUBLIC_LOG_D64, checkFramesPauseTime_);
748     MEDIA_LOG_D("OnInputParameterWithAttrAvailable isDroppedFrames = " PUBLIC_LOG_S,
749         isDroppedFrames ? "true" : "false");
750     {
751         std::lock_guard<std::mutex> mappingLock(mappingPtsMutex_);
752         // adjustPts means timestamps after resume time are translated to corresponding ones after pause time
753         int64_t adjustPts = currentPts - totalPauseTimeQueue_[0] + checkFramesPauseTime_;
754         MEDIA_LOG_D("OnInputParameterWithAttrAvailable adjustPts " PUBLIC_LOG_D64, adjustPts);
755         MEDIA_LOG_D("OnInputParameterWithAttrAvailable totalPauseTimeQueue_[0] " PUBLIC_LOG_D64,
756                     totalPauseTimeQueue_[0]);
757         if (!isDroppedFrames) {
758             if (startBufferTime_ == -1) {
759                 startBufferTime_ = currentPts;
760             }
761             int64_t mappingTime = adjustPts - startBufferTime_;
762             MEDIA_LOG_D("OnInputParameterWithAttrAvailable mappingTime = " PUBLIC_LOG_D64, mappingTime);
763             preKeyFramePts_ = currentKeyFramePts_;
764             currentKeyFramePts_ = currentPts;
765             AddStartPts(currentPts);
766             AddPauseResumePts(currentPts);
767             parameter->PutLongValue(Tag::VIDEO_ENCODE_SET_FRAME_PTS, mappingTime);
768         }
769         lastBufferTime_ = currentPts;
770     }
771     parameter->PutIntValue(Tag::VIDEO_ENCODER_PER_FRAME_DISCARD, isDroppedFrames);
772     codecServer_->QueueInputParameter(index);
773     FALSE_RETURN_MSG(videoFrameRate_ != 0, "videoFrameRate_ = 0, invalid value.");
774     if (stopTime_ != -1 && currentPts > stopTime_ - (SEC_TO_NS / videoFrameRate_)) {
775         MEDIA_LOG_I("currentPts > stopTime, send EOS.");
776         int32_t ret = codecServer_->NotifyEos();
777         if (ret != 0) {
778             MEDIA_LOG_E("OnInputParameterWithAttrAvailable codecServer_->NotifyEos() failed!");
779         }
780     }
781 }
782 
CheckFrames(int64_t currentPts,int64_t & checkFramesPauseTime)783 bool SurfaceEncoderAdapter::CheckFrames(int64_t currentPts, int64_t &checkFramesPauseTime)
784 {
785     if (pauseResumeQueue_.empty()) {
786         return false;
787     }
788     auto stateCode = pauseResumeQueue_[0].second;
789     MEDIA_LOG_D("CheckFrames stateCode: " PUBLIC_LOG_D32
790         " time:" PUBLIC_LOG_D64, static_cast<int32_t>(stateCode), pauseResumeQueue_[0].first);
791     // means not dropped frames when less than pause time
792     if (stateCode == StateCode::PAUSE && currentPts < pauseResumeQueue_[0].first) {
793         return false;
794     }
795     // means dropped frames when less than resume time
796     if (stateCode == StateCode::RESUME && currentPts < pauseResumeQueue_[0].first) {
797         return true;
798     }
799     // pop expire nodes
800     // currentpts bigger than the first two node, it means the pause and resume node are useless
801     if (pauseResumeQueue_.size() > 1
802         && currentPts >= pauseResumeQueue_[0].first
803         && currentPts >= pauseResumeQueue_[1].first) {
804         if (pauseResumeQueue_[0].second == StateCode::RESUME && !totalPauseTimeQueue_.empty()) {
805             // pop totalPauseTime
806             totalPauseTimeQueue_.pop_front();
807         }
808         pauseResumeQueue_.pop_front();
809         MEDIA_LOG_I("pauseResumeQueue_ pop expire nodes");
810         return CheckFrames(currentPts, checkFramesPauseTime);
811     }
812     if (stateCode == StateCode::RESUME && currentPts >= pauseResumeQueue_[0].first) {
813         if (!totalPauseTimeQueue_.empty()) {
814             // after resume pop totalPauseTime
815             totalPauseTimeQueue_.pop_front();
816         }
817         // resumetime之后第一帧与resumetime的差
818         checkFramesPauseTime = checkFramesPauseTime - (currentPts - pauseResumeQueue_[0].first);
819     }
820     pauseResumeQueue_.pop_front();
821     return CheckFrames(currentPts, checkFramesPauseTime);
822 }
823 
GetCurrentTime(int64_t & currentTime)824 void SurfaceEncoderAdapter::GetCurrentTime(int64_t &currentTime)
825 {
826     struct timespec timestamp = {0, 0};
827     clock_gettime(CLOCK_MONOTONIC, &timestamp);
828     currentTime = static_cast<int64_t>(timestamp.tv_sec) * SEC_TO_NS + static_cast<int64_t>(timestamp.tv_nsec);
829 }
830 
AddStartPts(int64_t currentPts)831 void SurfaceEncoderAdapter::AddStartPts(int64_t currentPts)
832 {
833     // start time
834     if (isStartKeyFramePts_) {
835         keyFramePts_ += std::to_string(currentPts / NS_PER_US) + ",";
836         isStartKeyFramePts_ = false;
837         if (encoderAdapterKeyFramePtsCallback_) {
838             encoderAdapterKeyFramePtsCallback_->OnReportFirstFramePts(currentPts);
839         } else {
840             MEDIA_LOG_E("encoderAdapterKeyFramePtsCallback_ is null, can't report firstFramePts");
841         }
842         MEDIA_LOG_I("AddStartPts success %{public}s end", keyFramePts_.c_str());
843     }
844 }
845 
AddStopPts()846 void SurfaceEncoderAdapter::AddStopPts()
847 {
848     // stop time
849     MEDIA_LOG_D("AddStopPts enter");
850     if (isStopKeyFramePts_) {
851         if (currentKeyFramePts_ > stopTime_) {
852             keyFramePts_ += std::to_string(preKeyFramePts_ / NS_PER_US);
853             MEDIA_LOG_I("AddStopPts preKeyFramePts_ %{public}s end", keyFramePts_.c_str());
854         } else {
855             keyFramePts_ += std::to_string(currentKeyFramePts_ / NS_PER_US);
856             MEDIA_LOG_I("AddStopPts currentKeyFramePts_ %{public}s end", keyFramePts_.c_str());
857         }
858         isStopKeyFramePts_ = false;
859         if (encoderAdapterKeyFramePtsCallback_) {
860             encoderAdapterKeyFramePtsCallback_->OnReportKeyFramePts(keyFramePts_);
861         }
862         keyFramePts_.clear();
863     }
864 }
865 
AddPauseResumePts(int64_t currentPts)866 bool SurfaceEncoderAdapter::AddPauseResumePts(int64_t currentPts)
867 {
868     if (pauseResumePts_.empty()) {
869         return false;
870     }
871     auto stateCode = pauseResumePts_[0].second;
872     MEDIA_LOG_D("CheckFrames stateCode: " PUBLIC_LOG_D32
873         " time:" PUBLIC_LOG_D64, static_cast<int32_t>(stateCode), pauseResumePts_[0].first);
874     // means not dropped frames when less than pause time
875     if (stateCode == StateCode::PAUSE && currentPts < pauseResumePts_[0].first) {
876         return false;
877     }
878     // means dropped frames when less than resume time
879     if (stateCode == StateCode::RESUME && currentPts < pauseResumePts_[0].first) {
880         return true;
881     }
882     if (stateCode == StateCode::PAUSE) {
883         MEDIA_LOG_D("AddPausePts %{public}s start", keyFramePts_.c_str());
884         keyFramePts_ += std::to_string(preKeyFramePts_ / NS_PER_US) + ",";
885         MEDIA_LOG_D("AddPausePts %{public}s end", keyFramePts_.c_str());
886     }
887     if (stateCode == StateCode::RESUME) {
888         MEDIA_LOG_D("AddResumePts %{public}s start", keyFramePts_.c_str());
889         keyFramePts_ += std::to_string(currentKeyFramePts_ / NS_PER_US) + ",";
890         if (encoderAdapterKeyFramePtsCallback_) {
891             encoderAdapterKeyFramePtsCallback_->OnReportFirstFramePts(currentKeyFramePts_);
892         } else {
893             MEDIA_LOG_E("encoderAdapterKeyFramePtsCallback_ is null, can't report firstFramePts");
894         }
895         MEDIA_LOG_D("AddResumePts %{public}s end", keyFramePts_.c_str());
896     }
897     pauseResumePts_.pop_front();
898     return AddPauseResumePts(currentPts);
899 }
900 
HandleWaitforStop()901 void SurfaceEncoderAdapter::HandleWaitforStop()
902 {
903     // Determine whether to end directly or wait STOP_TIME_OUT_MS
904     std::unique_lock<std::mutex> lock(stopMutex_);
905     if (hasReceivedEOS_) {
906         MEDIA_LOG_I("SurfaceEncoderAdapter::HandleWaitforStop, EOS has received, directly stop");
907         return;
908     }
909     std::cv_status waitStatus = stopCondition_.wait_for(lock, std::chrono::milliseconds(STOP_TIME_OUT_MS));
910     // Waiting timeout with no video frame received
911     if (waitStatus == std::cv_status::timeout && currentKeyFramePts_ == -1) {
912         MEDIA_LOG_E("Codec wait timeout with no video frame received");
913         encoderAdapterCallback_->OnError(AVCodecErrorType::AVCODEC_ERROR_INTERNAL,
914                                          AVCODEC_ERR_TIMEOUT_NO_FRAME_RECEIVED);
915     }
916 }
917 
Clear()918 void SurfaceEncoderAdapter::Clear()
919 {
920     MEDIA_LOG_I("SurfaceEncoderAdapter::Clear enter");
921     startBufferTime_ = -1;
922     stopTime_ = -1;
923     pauseTime_ = -1;
924     resumeTime_ = -1;
925     totalPauseTime_ = 0;
926     isStart_ = false;
927     isResume_ = false;
928     isStartKeyFramePts_ = false;
929     pauseResumeQueue_.clear();
930     pauseResumePts_.clear();
931     totalPauseTimeQueue_ = {0};
932     checkFramesPauseTime_ = 0;
933     currentPts_ = -1;
934     currentKeyFramePts_ = -1;
935     preKeyFramePts_ = -1;
936 }
937 
GetIsTransCoderMode()938 bool SurfaceEncoderAdapter::GetIsTransCoderMode()
939 {
940     return isTransCoderMode;
941 }
942 } // namespace MEDIA
943 } // namespace OHOS
944