1 /*
2 * Copyright (c) 2022-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 #include "image_source_processor.h"
17
18 #include "dscreen_errcode.h"
19 #include "dscreen_hisysevent.h"
20 #include "dscreen_hitrace.h"
21 #include "dscreen_log.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
ConfigureImageProcessor(const VideoParam & localParam,const VideoParam & remoteParam,const std::shared_ptr<IImageSourceProcessorListener> & listener)25 int32_t ImageSourceProcessor::ConfigureImageProcessor(const VideoParam &localParam, const VideoParam &remoteParam,
26 const std::shared_ptr<IImageSourceProcessorListener> &listener)
27 {
28 DHLOGI("%{public}s: ConfigureImageProcessor.", DSCREEN_LOG_TAG);
29 imageEncoder_ = std::make_shared<ImageSourceEncoder>(listener);
30 int32_t ret = imageEncoder_->ConfigureEncoder(localParam);
31 if (ret != DH_SUCCESS) {
32 DHLOGE("%{public}s: Configure screen encoder failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret);
33 return ret;
34 }
35
36 localParam_ = localParam;
37 remoteParam_ = remoteParam;
38 return DH_SUCCESS;
39 }
40
ReleaseImageProcessor()41 int32_t ImageSourceProcessor::ReleaseImageProcessor()
42 {
43 DHLOGI("%{public}s: ReleaseImageProcessor.", DSCREEN_LOG_TAG);
44 if (imageEncoder_ == nullptr) {
45 DHLOGE("%{public}s: Create screen encoder failed.", DSCREEN_LOG_TAG);
46 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_TRANS_NULL_VALUE, "ReleaseImageProcessor encoder is nullptr.");
47 return ERR_DH_SCREEN_TRANS_NULL_VALUE;
48 }
49
50 StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_RELESSE_ENCODER_START);
51 int32_t ret = imageEncoder_->ReleaseEncoder();
52 FinishTrace(DSCREEN_HITRACE_LABEL);
53 if (ret != DH_SUCCESS) {
54 DHLOGE("%{public}s: Release screen encoder failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret);
55 ReportOptFail(DSCREEN_OPT_FAIL, ret, "Release screen encoder failed.");
56 return ret;
57 }
58
59 return DH_SUCCESS;
60 }
61
StartImageProcessor()62 int32_t ImageSourceProcessor::StartImageProcessor()
63 {
64 DHLOGI("%{public}s: StartImageProcessor.", DSCREEN_LOG_TAG);
65 if (imageEncoder_ == nullptr) {
66 DHLOGE("%{public}s: Create screen encoder failed.", DSCREEN_LOG_TAG);
67 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_TRANS_NULL_VALUE, "StartImageProcessor encoder is nullptr.");
68 return ERR_DH_SCREEN_TRANS_NULL_VALUE;
69 }
70
71 StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_START_ENCODER_START);
72 int32_t ret = imageEncoder_->StartEncoder();
73 FinishTrace(DSCREEN_HITRACE_LABEL);
74 if (ret != DH_SUCCESS) {
75 DHLOGE("%{public}s: Start screen encoder failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret);
76 ReportOptFail(DSCREEN_OPT_FAIL, ret, "Start screen encoder failed.");
77 return ret;
78 }
79
80 return DH_SUCCESS;
81 }
82
StopImageProcessor()83 int32_t ImageSourceProcessor::StopImageProcessor()
84 {
85 DHLOGI("%{public}s: StopImageProcessor.", DSCREEN_LOG_TAG);
86 if (imageEncoder_ == nullptr) {
87 DHLOGE("%{public}s: Create screen encoder failed.", DSCREEN_LOG_TAG);
88 ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_TRANS_NULL_VALUE, "StopImageProcessor encoder is nullptr.");
89 return ERR_DH_SCREEN_TRANS_NULL_VALUE;
90 }
91
92 StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_STOP_ENCODER_START);
93 int32_t ret = imageEncoder_->StopEncoder();
94 FinishTrace(DSCREEN_HITRACE_LABEL);
95 if (ret != DH_SUCCESS) {
96 DHLOGE("%{public}s: Stop screen encoder failed ret: %{public}" PRId32, DSCREEN_LOG_TAG, ret);
97 ReportOptFail(DSCREEN_OPT_FAIL, ret, "Stop screen encoder failed.");
98 return ret;
99 }
100
101 return DH_SUCCESS;
102 }
103
GetImageSurface()104 sptr<Surface> ImageSourceProcessor::GetImageSurface()
105 {
106 DHLOGI("%{public}s: GetImageSurface.", DSCREEN_LOG_TAG);
107 return imageEncoder_->GetInputSurface();
108 }
109
GetConsumerSurface()110 sptr<Surface> ImageSourceProcessor::GetConsumerSurface()
111 {
112 DHLOGI("%{public}s: GetConsumerSurface.", DSCREEN_LOG_TAG);
113 return imageEncoder_->GetConsumerSurface();
114 }
115
ProcessFullImage(sptr<SurfaceBuffer> & surfaceBuffer)116 int32_t ImageSourceProcessor::ProcessFullImage(sptr<SurfaceBuffer> &surfaceBuffer)
117 {
118 DHLOGI("%{public}s: ProcessFullImage.", DSCREEN_LOG_TAG);
119 if (surfaceBuffer == nullptr) {
120 DHLOGE("%{public}s: Process surfaceBuffer is null.", DSCREEN_LOG_TAG);
121 return ERR_DH_SCREEN_SURFACE_BUFFER_INVALIED;
122 }
123 int32_t ret = imageEncoder_->FeedEncoderData(surfaceBuffer);
124 if (ret != DH_SUCCESS) {
125 DHLOGE("%{public}s: FeedEncoderData failed.", DSCREEN_LOG_TAG);
126 return ERR_DH_SCREEN_TRANS_ERROR;
127 }
128 return DH_SUCCESS;
129 }
130 } // namespace DistributedHardware
131 } // namespace OHOS