1 /*
2 * Copyright (c) 2025-2025 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 "sample_info.h"
17 #include "utils/camera_log.h"
18
19 namespace OHOS {
20 namespace CameraStandard {
21
CodecAVBufferInfo(uint32_t argBufferIndex,OH_AVBuffer * argBuffer)22 CodecAVBufferInfo::CodecAVBufferInfo(uint32_t argBufferIndex, OH_AVBuffer* argBuffer)
23 : bufferIndex(argBufferIndex), buffer(argBuffer)
24 {
25 // get output buffer attr
26 OH_AVBuffer_GetBufferAttr(argBuffer, &attr);
27 }
28
GetCopyAVBuffer()29 OH_AVBuffer* CodecAVBufferInfo::GetCopyAVBuffer()
30 {
31 // LCOV_EXCL_START
32 MEDIA_INFO_LOG("CodecBufferInfo OH_AVBuffer_Create with size: %{public}d", attr.size);
33 OH_AVBuffer* destBuffer = OH_AVBuffer_Create(attr.size);
34 CHECK_RETURN_RET_ELOG(destBuffer == nullptr, nullptr, "destBuffer is null");
35 auto sourceAddr = OH_AVBuffer_GetAddr(buffer);
36 auto destAddr = OH_AVBuffer_GetAddr(destBuffer);
37 errno_t cpyRet = memcpy_s(reinterpret_cast<void *>(destAddr), attr.size,
38 reinterpret_cast<void *>(sourceAddr), attr.size);
39 CHECK_PRINT_ELOG(cpyRet != 0, "CodecBufferInfo memcpy_s failed. %{public}d", cpyRet);
40
41 OH_AVErrCode errorCode = OH_AVBuffer_SetBufferAttr(destBuffer, &attr);
42 CHECK_PRINT_ELOG(errorCode != 0, "CodecBufferInfo OH_AVBuffer_SetBufferAttr failed. %{public}d", errorCode);
43 return destBuffer;
44 // LCOV_EXCL_STOP
45 }
46
AddCopyAVBuffer(OH_AVBuffer * IDRBuffer)47 OH_AVBuffer* CodecAVBufferInfo::AddCopyAVBuffer(OH_AVBuffer* IDRBuffer)
48 {
49 // LCOV_EXCL_START
50 CHECK_RETURN_RET_ELOG(nullptr == IDRBuffer, IDRBuffer, "AddCopyAVBuffer without IDRBuffer!");
51 OH_AVCodecBufferAttr IDRAttr = {0, 0, 0, AVCODEC_BUFFER_FLAGS_NONE};
52 OH_AVCodecBufferAttr destAttr = {0, 0, 0, AVCODEC_BUFFER_FLAGS_NONE};
53 OH_AVBuffer_GetBufferAttr(IDRBuffer, &IDRAttr);
54 int32_t destBufferSize = IDRAttr.size + attr.size;
55 OH_AVBuffer* destBuffer = OH_AVBuffer_Create(destBufferSize);
56 CHECK_RETURN_RET_ELOG(destBuffer == nullptr, nullptr, "destBuffer is null");
57 auto destAddr = OH_AVBuffer_GetAddr(destBuffer);
58 auto sourceIDRAddr = OH_AVBuffer_GetAddr(IDRBuffer);
59
60 errno_t cpyRet = memcpy_s(reinterpret_cast<void *>(destAddr), destBufferSize,
61 reinterpret_cast<void *>(sourceIDRAddr), IDRAttr.size);
62 CHECK_PRINT_ELOG(0 != cpyRet, "CodecBufferInfo memcpy_s IDR frame failed. %{public}d", cpyRet);
63 destAddr = destAddr + IDRAttr.size;
64 auto sourceAddr = OH_AVBuffer_GetAddr(buffer);
65 cpyRet = memcpy_s(reinterpret_cast<void *>(destAddr), attr.size, reinterpret_cast<void *>(sourceAddr), attr.size);
66 CHECK_PRINT_ELOG(0 != cpyRet, "CodecBufferInfo memcpy_s I frame failed. %{public}d", cpyRet);
67 OH_AVBuffer_Destroy(IDRBuffer);
68 destAttr.size = destBufferSize;
69 destAttr.flags = IDRAttr.flags | attr.flags;
70 MEDIA_INFO_LOG("CodecBufferInfo deep copy with size: %{public}d, %{public}d", destBufferSize, destAttr.flags);
71 OH_AVBuffer_SetBufferAttr(destBuffer, &destAttr);
72 return destBuffer;
73 // LCOV_EXCL_STOP
74 }
75
Release()76 void CodecUserData::Release()
77 {
78 {
79 std::lock_guard<std::mutex> lock(inputMutex_);
80 while (!inputBufferInfoQueue_.empty()) {
81 inputBufferInfoQueue_.pop();
82 }
83 }
84 {
85 std::lock_guard<std::mutex> lock(outputMutex_);
86 while (!outputBufferInfoQueue_.empty()) {
87 outputBufferInfoQueue_.pop();
88 }
89 }
90 }
91
~CodecUserData()92 CodecUserData::~CodecUserData()
93 {
94 Release();
95 }
96
VideoCodecAVBufferInfo(uint32_t argBufferIndex,std::shared_ptr<OHOS::Media::AVBuffer> argBuffer)97 VideoCodecAVBufferInfo::VideoCodecAVBufferInfo(uint32_t argBufferIndex,
98 std::shared_ptr<OHOS::Media::AVBuffer> argBuffer)
99 : bufferIndex(argBufferIndex), buffer(argBuffer)
100 {
101 }
102
GetCopyAVBuffer()103 std::shared_ptr<OHOS::Media::AVBuffer> VideoCodecAVBufferInfo::GetCopyAVBuffer()
104 {
105 // LCOV_EXCL_START
106 MEDIA_INFO_LOG("CodecBufferInfo OH_AVBuffer_Create with size: %{public}d", buffer->memory_->GetSize());
107 auto allocator = Media::AVAllocatorFactory::CreateSharedAllocator(Media::MemoryFlag::MEMORY_READ_WRITE);
108 CHECK_RETURN_RET_ELOG(allocator == nullptr, nullptr, "create allocator failed");
109 std::shared_ptr<Media::AVBuffer> destBuffer = Media::AVBuffer::CreateAVBuffer(allocator,
110 buffer->memory_->GetCapacity());
111 CHECK_RETURN_RET_ELOG(destBuffer == nullptr, nullptr, "destBuffer is null");
112 auto sourceAddr = buffer->memory_->GetAddr();
113 auto destAddr = destBuffer->memory_->GetAddr();
114 errno_t cpyRet = memcpy_s(reinterpret_cast<void *>(destAddr), buffer->memory_->GetSize(),
115 reinterpret_cast<void *>(sourceAddr), buffer->memory_->GetSize());
116 CHECK_PRINT_ELOG(0 != cpyRet, "CodecBufferInfo memcpy_s failed. %{public}d", cpyRet);
117 destBuffer->pts_ = buffer->pts_;
118 destBuffer->flag_ = buffer->flag_;
119 destBuffer->memory_->SetSize(buffer->memory_->GetSize());
120 return destBuffer;
121 // LCOV_EXCL_STOP
122 }
123
AddCopyAVBuffer(std::shared_ptr<OHOS::Media::AVBuffer> IDRBuffer)124 std::shared_ptr<OHOS::Media::AVBuffer> VideoCodecAVBufferInfo::AddCopyAVBuffer(
125 std::shared_ptr<OHOS::Media::AVBuffer> IDRBuffer)
126 {
127 // LCOV_EXCL_START
128 CHECK_RETURN_RET_ELOG(nullptr == IDRBuffer, IDRBuffer, "AddCopyAVBuffer without IDRBuffer!");
129 int32_t destBufferSize = IDRBuffer->memory_->GetSize() + buffer->memory_->GetSize();
130 auto allocator = Media::AVAllocatorFactory::CreateSharedAllocator(Media::MemoryFlag::MEMORY_READ_WRITE);
131 CHECK_RETURN_RET_ELOG(allocator == nullptr, nullptr, "create allocator failed");
132 std::shared_ptr<Media::AVBuffer> destBuffer = Media::AVBuffer::CreateAVBuffer(allocator, destBufferSize);
133 CHECK_RETURN_RET_ELOG(destBuffer == nullptr, nullptr, "destBuffer is null");
134 auto destAddr = destBuffer->memory_->GetAddr();
135 auto sourceIDRAddr = IDRBuffer->memory_->GetAddr();
136 errno_t cpyRet = memcpy_s(reinterpret_cast<void *>(destAddr), destBufferSize,
137 reinterpret_cast<void *>(sourceIDRAddr), IDRBuffer->memory_->GetSize());
138 CHECK_PRINT_ELOG(0 != cpyRet, "CodecBufferInfo memcpy_s IDR frame failed. %{public}d", cpyRet);
139 destAddr = destAddr + IDRBuffer->memory_->GetSize();
140 auto sourceAddr = buffer->memory_->GetAddr();
141 cpyRet = memcpy_s(reinterpret_cast<void *>(destAddr), buffer->memory_->GetSize(),
142 reinterpret_cast<void *>(sourceAddr), buffer->memory_->GetSize());
143 CHECK_PRINT_ELOG(0 != cpyRet, "CodecBufferInfo memcpy_s I frame failed. %{public}d", cpyRet);
144 destBuffer->memory_->SetSize(destBufferSize);
145 destBuffer->flag_ = IDRBuffer->flag_ | buffer->flag_;
146 MEDIA_INFO_LOG("CodecBufferInfo copy with size: %{public}d, %{public}d", destBufferSize, destBuffer->flag_);
147 return destBuffer;
148 // LCOV_EXCL_STOP
149 }
150
Release()151 void VideoCodecUserData::Release()
152 {
153 // LCOV_EXCL_START
154 {
155 std::lock_guard<std::mutex> lock(inputMutex_);
156 while (!inputBufferInfoQueue_.empty()) {
157 inputBufferInfoQueue_.pop();
158 }
159 }
160 {
161 std::lock_guard<std::mutex> lock(outputMutex_);
162 while (!outputBufferInfoQueue_.empty()) {
163 outputBufferInfoQueue_.pop();
164 }
165 }
166 // LCOV_EXCL_STOP
167 }
168
~VideoCodecUserData()169 VideoCodecUserData::~VideoCodecUserData()
170 {
171 Release();
172 }
173
174 } // CameraStandard
175 } // OHOS
176