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 "render_strategy.h"
17 
18 #include "effect_log.h"
19 
20 namespace OHOS {
21 namespace Media {
22 namespace Effect {
Init(const std::shared_ptr<EffectBuffer> & src,const std::shared_ptr<EffectBuffer> & dst)23 void RenderStrategy::Init(const std::shared_ptr<EffectBuffer> &src, const std::shared_ptr<EffectBuffer> &dst)
24 {
25     src_ = src;
26     dst_ = dst;
27 }
28 
ChooseBufOnSetInput(EffectBuffer * buffer,EffectBuffer * src,std::shared_ptr<MemNegotiatedCap> & memNegotiatedCap)29 EffectBuffer *ChooseBufOnSetInput(EffectBuffer *buffer, EffectBuffer *src,
30     std::shared_ptr<MemNegotiatedCap> &memNegotiatedCap)
31 {
32     return buffer;
33 }
34 
ChooseBufOnSetInOutput(EffectBuffer * buffer,EffectBuffer * src,EffectBuffer * dst,std::shared_ptr<MemNegotiatedCap> & memNegotiatedCap)35 EffectBuffer *ChooseBufOnSetInOutput(EffectBuffer *buffer, EffectBuffer *src, EffectBuffer *dst,
36     std::shared_ptr<MemNegotiatedCap> &memNegotiatedCap)
37 {
38     if (buffer->buffer_ == dst->buffer_) {
39         return buffer;
40     }
41 
42     std::shared_ptr<BufferInfo> &bufferInfo = buffer->bufferInfo_;
43     std::shared_ptr<BufferInfo> &dstBufferInfo = dst->bufferInfo_;
44     CHECK_AND_RETURN_RET_LOG(bufferInfo != nullptr && dstBufferInfo != nullptr, buffer,
45         "dst or input buffer info is null!");
46     CHECK_AND_RETURN_RET_LOG(memNegotiatedCap != nullptr, buffer, "memNegotiatedCap is null!");
47     EFFECT_LOGD("ChooseBufOnSetInOutput: w=%{public}d, h=%{public}d, dstW=%{public}d, dstH=%{public}d, "
48         "negoW=%{public}d, negoH=%{public}d", bufferInfo->width_, bufferInfo->height_,
49         dstBufferInfo->width_, dstBufferInfo->height_, memNegotiatedCap->width, memNegotiatedCap->height);
50 
51     if (memNegotiatedCap->width == dstBufferInfo->width_ && memNegotiatedCap->height == dstBufferInfo->height_) {
52         return dst;
53     }
54 
55     // not allow to modify src while set input and output
56     if (src->buffer_ == buffer->buffer_) {
57         return nullptr;
58     }
59 
60     return buffer;
61 }
62 
ChooseBestOutput(EffectBuffer * buffer,std::shared_ptr<MemNegotiatedCap> & memNegotiatedCap)63 EffectBuffer *RenderStrategy::ChooseBestOutput(EffectBuffer *buffer,
64     std::shared_ptr<MemNegotiatedCap> &memNegotiatedCap)
65 {
66     CHECK_AND_RETURN_RET_LOG(src_ != nullptr && buffer != nullptr, buffer,
67         "src or input buffer is null! src_=%{public}d", src_ == nullptr);
68     if (dst_ == nullptr || dst_->buffer_ == nullptr || src_->buffer_ == dst_->buffer_
69         || dst_->extraInfo_->dataType == DataType::NATIVE_WINDOW) {
70         return ChooseBufOnSetInput(buffer, src_.get(), memNegotiatedCap);
71     }
72     return ChooseBufOnSetInOutput(buffer, src_.get(), dst_.get(), memNegotiatedCap);
73 }
74 
GetInput()75 EffectBuffer *RenderStrategy::GetInput()
76 {
77     return src_.get();
78 }
79 
GetOutput()80 EffectBuffer *RenderStrategy::GetOutput()
81 {
82     return dst_.get();
83 }
84 
Deinit()85 void RenderStrategy::Deinit()
86 {
87     src_ = nullptr;
88     dst_ = nullptr;
89 }
90 } // namespace Effect
91 } // namespace Media
92 } // namespace OHOS