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> ¶meter)
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> ¶meter)
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 ¤tTime)
825 {
826 struct timespec timestamp = {0, 0};
827 clock_gettime(CLOCK_MONOTONIC, ×tamp);
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