1fa7767c5Sopenharmony_ci/* 2fa7767c5Sopenharmony_ci * Copyright (c) 2021-2021 Huawei Device Co., Ltd. 3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License. 5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at 6fa7767c5Sopenharmony_ci * 7fa7767c5Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fa7767c5Sopenharmony_ci * 9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and 13fa7767c5Sopenharmony_ci * limitations under the License. 14fa7767c5Sopenharmony_ci */ 15fa7767c5Sopenharmony_ci 16fa7767c5Sopenharmony_ci#if !defined(OHOS_LITE) && defined(VIDEO_SUPPORT) 17fa7767c5Sopenharmony_ci 18fa7767c5Sopenharmony_ci#define HST_LOG_TAG "SurfaceAllocator" 19fa7767c5Sopenharmony_ci 20fa7767c5Sopenharmony_ci#include "common/surface_allocator.h" 21fa7767c5Sopenharmony_ci#include "display_type.h" 22fa7767c5Sopenharmony_ci#include "inner_api/common/log.h" 23fa7767c5Sopenharmony_ci#include "sync_fence.h" 24fa7767c5Sopenharmony_ci 25fa7767c5Sopenharmony_cinamespace { 26fa7767c5Sopenharmony_ciconstexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "SurfaceAllocator" }; 27fa7767c5Sopenharmony_ci} 28fa7767c5Sopenharmony_ci 29fa7767c5Sopenharmony_cinamespace OHOS { 30fa7767c5Sopenharmony_cinamespace Media { 31fa7767c5Sopenharmony_cinamespace Plugins { 32fa7767c5Sopenharmony_ciconst std::unordered_map<VideoScaleType, ScalingMode> scaleTypeMap = { 33fa7767c5Sopenharmony_ci { VideoScaleType::VIDEO_SCALE_TYPE_FIT, ScalingMode::SCALING_MODE_SCALE_TO_WINDOW }, 34fa7767c5Sopenharmony_ci { VideoScaleType::VIDEO_SCALE_TYPE_FIT_CROP, ScalingMode::SCALING_MODE_SCALE_CROP} 35fa7767c5Sopenharmony_ci}; 36fa7767c5Sopenharmony_ci 37fa7767c5Sopenharmony_ciOHOS::ScalingMode GetScaleType(VideoScaleType scaleType) 38fa7767c5Sopenharmony_ci{ 39fa7767c5Sopenharmony_ci if (!scaleTypeMap.count(scaleType)) { 40fa7767c5Sopenharmony_ci return OHOS::SCALING_MODE_SCALE_TO_WINDOW; 41fa7767c5Sopenharmony_ci } 42fa7767c5Sopenharmony_ci return scaleTypeMap.at(scaleType); 43fa7767c5Sopenharmony_ci} 44fa7767c5Sopenharmony_ci 45fa7767c5Sopenharmony_ciconstexpr int32_t DEFAULT_SURFACE_WIDTH = 640; 46fa7767c5Sopenharmony_ciconstexpr int32_t DEFAULT_SURFACE_HEIGHT = 480; 47fa7767c5Sopenharmony_ciconstexpr int32_t DEFAULT_SURFACE_STRIDE_ALIGN = 8; 48fa7767c5Sopenharmony_ci 49fa7767c5Sopenharmony_ciSurfaceAllocator::SurfaceAllocator(sptr<Surface> surface) 50fa7767c5Sopenharmony_ci : Allocator(MemoryType::SURFACE_MEMORY), 51fa7767c5Sopenharmony_ci surface_(surface) 52fa7767c5Sopenharmony_ci{ 53fa7767c5Sopenharmony_ci requestConfig_ = { 54fa7767c5Sopenharmony_ci DEFAULT_SURFACE_WIDTH, DEFAULT_SURFACE_HEIGHT, DEFAULT_SURFACE_STRIDE_ALIGN, 55fa7767c5Sopenharmony_ci PixelFormat::PIXEL_FMT_RGBA_8888, BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA, 0}; 56fa7767c5Sopenharmony_ci} 57fa7767c5Sopenharmony_ci 58fa7767c5Sopenharmony_cisptr<SurfaceBuffer> SurfaceAllocator::AllocSurfaceBuffer() 59fa7767c5Sopenharmony_ci{ 60fa7767c5Sopenharmony_ci if (!surface_) { 61fa7767c5Sopenharmony_ci MEDIA_LOG_E("surface is nullptr"); 62fa7767c5Sopenharmony_ci return nullptr; 63fa7767c5Sopenharmony_ci } 64fa7767c5Sopenharmony_ci MEDIA_LOG_DD("width: " PUBLIC_LOG_D32 ", height :" PUBLIC_LOG_D32 ", align: " PUBLIC_LOG_D32 65fa7767c5Sopenharmony_ci ", format: " PUBLIC_LOG_D32 ", usage: " PUBLIC_LOG_U64 ", timeout: " PUBLIC_LOG_D32, 66fa7767c5Sopenharmony_ci requestConfig_.width, requestConfig_.height, requestConfig_.strideAlignment, requestConfig_.format, 67fa7767c5Sopenharmony_ci requestConfig_.usage, requestConfig_.timeout); 68fa7767c5Sopenharmony_ci OHOS::sptr<OHOS::SurfaceBuffer> surfaceBuffer = nullptr; 69fa7767c5Sopenharmony_ci int32_t releaseFence = -1; 70fa7767c5Sopenharmony_ci auto ret = surface_->RequestBuffer(surfaceBuffer, releaseFence, requestConfig_); 71fa7767c5Sopenharmony_ci if (ret != OHOS::SurfaceError::SURFACE_ERROR_OK || surfaceBuffer == nullptr) { 72fa7767c5Sopenharmony_ci if (ret == OHOS::SurfaceError::SURFACE_ERROR_NO_BUFFER) { 73fa7767c5Sopenharmony_ci MEDIA_LOG_DD("buffer queue is no more buffers"); 74fa7767c5Sopenharmony_ci } else { 75fa7767c5Sopenharmony_ci MEDIA_LOG_E("surface RequestBuffer fail, ret: " PUBLIC_LOG_U64, static_cast<uint64_t>(ret)); 76fa7767c5Sopenharmony_ci } 77fa7767c5Sopenharmony_ci return nullptr; 78fa7767c5Sopenharmony_ci } 79fa7767c5Sopenharmony_ci if (surfaceBuffer->Map() != OHOS::SurfaceError::SURFACE_ERROR_OK) { 80fa7767c5Sopenharmony_ci MEDIA_LOG_E("surface buffer Map failed"); 81fa7767c5Sopenharmony_ci surface_->CancelBuffer(surfaceBuffer); 82fa7767c5Sopenharmony_ci return nullptr; 83fa7767c5Sopenharmony_ci } 84fa7767c5Sopenharmony_ci sptr<SyncFence> autoFence = new(std::nothrow) SyncFence(releaseFence); 85fa7767c5Sopenharmony_ci if (autoFence != nullptr) { 86fa7767c5Sopenharmony_ci autoFence->Wait(100); // 100ms 87fa7767c5Sopenharmony_ci } 88fa7767c5Sopenharmony_ci surface_->SetScalingMode(surfaceBuffer->GetSeqNum(), scalingMode_); 89fa7767c5Sopenharmony_ci if (ret != OHOS::SurfaceError::SURFACE_ERROR_OK) { 90fa7767c5Sopenharmony_ci MEDIA_LOG_E("surface buffer set scaling mode failed"); 91fa7767c5Sopenharmony_ci surface_->CancelBuffer(surfaceBuffer); 92fa7767c5Sopenharmony_ci return nullptr; 93fa7767c5Sopenharmony_ci } 94fa7767c5Sopenharmony_ci MEDIA_LOG_DD("request surface buffer success, releaseFence: " PUBLIC_LOG_D32, releaseFence); 95fa7767c5Sopenharmony_ci return surfaceBuffer; 96fa7767c5Sopenharmony_ci} 97fa7767c5Sopenharmony_ci 98fa7767c5Sopenharmony_civoid SurfaceAllocator::ReleaseSurfaceBuffer(sptr<SurfaceBuffer>& surfaceBuffer, bool needRender) 99fa7767c5Sopenharmony_ci{ 100fa7767c5Sopenharmony_ci if (!needRender) { 101fa7767c5Sopenharmony_ci auto ret = surface_->CancelBuffer(surfaceBuffer); 102fa7767c5Sopenharmony_ci if (ret != OHOS::SurfaceError::SURFACE_ERROR_OK) { 103fa7767c5Sopenharmony_ci MEDIA_LOG_E("surface CancelBuffer fail, ret: " PUBLIC_LOG_U64, static_cast<uint64_t>(ret)); 104fa7767c5Sopenharmony_ci } 105fa7767c5Sopenharmony_ci } 106fa7767c5Sopenharmony_ci surfaceBuffer = nullptr; 107fa7767c5Sopenharmony_ci} 108fa7767c5Sopenharmony_ci 109fa7767c5Sopenharmony_civoid* SurfaceAllocator::Alloc(size_t size) 110fa7767c5Sopenharmony_ci{ 111fa7767c5Sopenharmony_ci return nullptr; 112fa7767c5Sopenharmony_ci} 113fa7767c5Sopenharmony_ci 114fa7767c5Sopenharmony_civoid SurfaceAllocator::Free(void* ptr) // NOLINT: void* 115fa7767c5Sopenharmony_ci{ 116fa7767c5Sopenharmony_ci (void)ptr; 117fa7767c5Sopenharmony_ci} 118fa7767c5Sopenharmony_ci 119fa7767c5Sopenharmony_civoid SurfaceAllocator::Config(int32_t width, int32_t height, uint64_t usage, int32_t format, int32_t strideAlign, 120fa7767c5Sopenharmony_ci int32_t timeout) 121fa7767c5Sopenharmony_ci{ 122fa7767c5Sopenharmony_ci requestConfig_ = { 123fa7767c5Sopenharmony_ci width, height, strideAlign, format, usage, timeout 124fa7767c5Sopenharmony_ci }; 125fa7767c5Sopenharmony_ci} 126fa7767c5Sopenharmony_ci 127fa7767c5Sopenharmony_civoid SurfaceAllocator::SetScaleType(VideoScaleType videoScaleType) 128fa7767c5Sopenharmony_ci{ 129fa7767c5Sopenharmony_ci scalingMode_ = GetScaleType(videoScaleType); 130fa7767c5Sopenharmony_ci} 131fa7767c5Sopenharmony_ci 132fa7767c5Sopenharmony_civoid SurfaceAllocator::UpdateSurfaceBufferScaleMode(sptr<SurfaceBuffer>& surfaceBuffer) 133fa7767c5Sopenharmony_ci{ 134fa7767c5Sopenharmony_ci auto ret = surface_->SetScalingMode(surfaceBuffer->GetSeqNum(), scalingMode_); 135fa7767c5Sopenharmony_ci if (ret != OHOS::SurfaceError::SURFACE_ERROR_OK) { 136fa7767c5Sopenharmony_ci MEDIA_LOG_E("update surface buffer scaling mode fail, ret: " PUBLIC_LOG_U64, static_cast<uint64_t>(ret)); 137fa7767c5Sopenharmony_ci } 138fa7767c5Sopenharmony_ci} 139fa7767c5Sopenharmony_ci} // namespace Plugins 140fa7767c5Sopenharmony_ci} // namespace Media 141fa7767c5Sopenharmony_ci} // namespace OHOS 142fa7767c5Sopenharmony_ci#endif