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