* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef HMOS_LIVESTREAM_CODECINFO_H
#define HMOS_LIVESTREAM_CODECINFO_H
#include <condition_variable>
#include <queue>
#include "AudioBgmQueue.h"
#include "SampleInfo.h"
struct FaceInfo {
bool valid = false;
int64_t timestamp = -1;
double topLeftX = 0.0f;
double topLeftY = 0.0f;
double width = 0.0f;
double height = 0.0f;
};
struct FaceIntInfo {
bool valid = false;
int64_t timestamp = -1;
int topLeftX = 0;
int topLeftY = 0;
int width = 0;
int height = 0;
};
struct CodecBufferInfo {
uint32_t bufferIndex = 0;
uintptr_t *buffer = nullptr;
uint8_t *bufferAddr = nullptr;
OH_AVCodecBufferAttr attr = {0, 0, 0, AVCODEC_BUFFER_FLAGS_NONE};
explicit CodecBufferInfo(uint8_t *addr) : bufferAddr(addr){};
CodecBufferInfo(uint8_t *addr, int32_t bufferSize)
: bufferAddr(addr), attr({0, bufferSize, 0, AVCODEC_BUFFER_FLAGS_NONE}){};
CodecBufferInfo(uint32_t argBufferIndex, OH_AVBuffer *argBuffer)
: bufferIndex(argBufferIndex), buffer(reinterpret_cast<uintptr_t *>(argBuffer))
{
OH_AVBuffer_GetBufferAttr(argBuffer, &attr);
};
};
struct CodecUserData {
public:
SampleInfo *sampleInfo = nullptr;
uint32_t inputFrameCount = 0;
std::mutex inputMutex;
std::condition_variable inputCond;
std::queue<CodecBufferInfo> inputBufferInfoQueue;
uint32_t outputFrameCount = 0;
std::mutex outputMutex;
std::condition_variable outputCond;
std::mutex renderMutex;
std::condition_variable renderCond;
std::queue<CodecBufferInfo> outputBufferInfoQueue;
std::queue<unsigned char> renderQueue;
AudioBgmQueue* decodedBgmQueue;
std::vector<char> cache;
int32_t remainlen = 0;
void ClearCache()
{
cache.clear();
remainlen = 0;
}
void WriteCache(void *buffer, int32_t bufferLen)
{
if (bufferLen + remainlen > cache.size()) {
cache.resize(remainlen + bufferLen);
}
std::memcpy(cache.data() + remainlen, buffer, bufferLen);
remainlen += bufferLen;
}
bool ReadCache(void *buffer, int32_t bufferLen)
{
if (remainlen < bufferLen) {
return false;
}
std::memcpy(buffer, cache.data(), bufferLen);
remainlen = remainlen - bufferLen;
if (remainlen > 0) {
std::memmove(cache.data(), cache.data() + bufferLen, remainlen);
}
return true;
}
};
#endif