1 /*
2  * Copyright (c) 2024 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 "video_processing_callback_native.h"
17 
18 #include "vpe_log.h"
19 
20 using namespace OHOS::Media::VideoProcessingEngine;
21 
BindOnError(OH_VideoProcessingCallback_OnError onError)22 VideoProcessing_ErrorCode VideoProcessingCallbackNative::BindOnError(OH_VideoProcessingCallback_OnError onError)
23 {
24     if (onError == nullptr) {
25         VPE_LOGE("onError is null!");
26         return VIDEO_PROCESSING_ERROR_INVALID_PARAMETER;
27     }
28     return BindFunction([this, onError]() { onError_ = onError; });
29 }
30 
BindOnState(OH_VideoProcessingCallback_OnState onState)31 VideoProcessing_ErrorCode VideoProcessingCallbackNative::BindOnState(OH_VideoProcessingCallback_OnState onState)
32 {
33     if (onState == nullptr) {
34         VPE_LOGE("onState is null!");
35         return VIDEO_PROCESSING_ERROR_INVALID_PARAMETER;
36     }
37     return BindFunction([this, onState]() { onState_ = onState; });
38 }
39 
BindOnNewOutputBuffer(OH_VideoProcessingCallback_OnNewOutputBuffer onNewOutputBuffer)40 VideoProcessing_ErrorCode VideoProcessingCallbackNative::BindOnNewOutputBuffer(
41     OH_VideoProcessingCallback_OnNewOutputBuffer onNewOutputBuffer)
42 {
43     if (onNewOutputBuffer == nullptr) {
44         VPE_LOGE("onNewOutputBuffer is null!");
45         return VIDEO_PROCESSING_ERROR_INVALID_PARAMETER;
46     }
47     return BindFunction([this, onNewOutputBuffer]() { onNewOutputBuffer_ = onNewOutputBuffer; });
48 }
49 
IsValid() const50 bool VideoProcessingCallbackNative::IsValid() const
51 {
52     return isValid_.load();
53 }
54 
IsModifiable() const55 bool VideoProcessingCallbackNative::IsModifiable() const
56 {
57     return isModifiable_.load();
58 }
59 
LockModifiers()60 void VideoProcessingCallbackNative::LockModifiers()
61 {
62     std::lock_guard<std::mutex> lock(lock_);
63     isModifiable_ = false;
64 }
65 
UnlockModifiers()66 void VideoProcessingCallbackNative::UnlockModifiers()
67 {
68     std::lock_guard<std::mutex> lock(lock_);
69     isModifiable_ = true;
70 }
71 
HasOnNewOutputBuffer() const72 bool VideoProcessingCallbackNative::HasOnNewOutputBuffer() const
73 {
74     std::lock_guard<std::mutex> lock(lock_);
75     return onNewOutputBuffer_ != nullptr;
76 }
77 
OnError(OH_VideoProcessing * instance,VideoProcessing_ErrorCode errorCode,void * userData) const78 void VideoProcessingCallbackNative::OnError(OH_VideoProcessing* instance, VideoProcessing_ErrorCode errorCode,
79     void* userData) const
80 {
81     if (onError_ == nullptr) {
82         VPE_LOGD("onError_ is null!");
83         return;
84     }
85     onError_(instance, errorCode, userData);
86 }
87 
OnState(OH_VideoProcessing * instance,VideoProcessing_State state,void * userData) const88 void VideoProcessingCallbackNative::OnState(OH_VideoProcessing* instance, VideoProcessing_State state,
89     void* userData) const
90 {
91     if (onState_ == nullptr) {
92         VPE_LOGD("onState_ is null!");
93         return;
94     }
95     onState_(instance, state, userData);
96 }
97 
OnNewOutputBuffer(OH_VideoProcessing * instance,uint32_t index,void * userData) const98 void VideoProcessingCallbackNative::OnNewOutputBuffer(OH_VideoProcessing* instance, uint32_t index,
99     void* userData) const
100 {
101     if (onNewOutputBuffer_ == nullptr) {
102         VPE_LOGD("onNewOutputBuffer_ is null!");
103         return;
104     }
105     onNewOutputBuffer_(instance, index, userData);
106 }
107 
BindFunction(std::function<void ()> && functionBinder)108 VideoProcessing_ErrorCode VideoProcessingCallbackNative::BindFunction(std::function<void()>&& functionBinder)
109 {
110     if (!isModifiable_.load()) {
111         return VIDEO_PROCESSING_ERROR_PROCESS_FAILED;
112     }
113     std::lock_guard<std::mutex> lock(lock_);
114     functionBinder();
115     isValid_ = true;
116     return VIDEO_PROCESSING_SUCCESS;
117 }
118