• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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