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