110 lines
3.2 KiB
C++
110 lines
3.2 KiB
C++
/*
|
|
* Copyright (c) 2021 Amlogic, Inc. All rights reserved.
|
|
*
|
|
* This source code is subject to the terms and conditions defined in the
|
|
* file 'LICENSE' which is part of this source code package.
|
|
*
|
|
* Description:
|
|
*/
|
|
#define LOG_NDEBUG 1
|
|
|
|
#define VTCON_LOGD(fmt,...) MESON_LOGD("[%s] [%s] " fmt, mName, __func__, ##__VA_ARGS__)
|
|
#define VTCON_LOGW(fmt,...) MESON_LOGW("[%s] [%s] " fmt, mName, __func__, ##__VA_ARGS__)
|
|
#define VTCON_LOGE(fmt,...) MESON_LOGE("[%s] [%s] " fmt, mName, __func__, ##__VA_ARGS__)
|
|
|
|
#include "VtConsumer.h"
|
|
#include <cstring>
|
|
|
|
VtConsumer::VtConsumer(int tunnelId, uint32_t dispId, uint32_t layerId) {
|
|
mTunnelId = tunnelId;
|
|
mReleaseListener = nullptr;
|
|
mContentListener = nullptr;
|
|
snprintf(mName, 64, "VtConsumer-%u-%d-%u", dispId, tunnelId, layerId);
|
|
}
|
|
|
|
VtConsumer::~VtConsumer() {
|
|
mContentListener.reset();
|
|
}
|
|
|
|
int32_t VtConsumer::setReleaseListener(VtReleaseListener *listener) {
|
|
if (!listener)
|
|
VTCON_LOGD("set release listener is null");
|
|
|
|
mReleaseListener = listener;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int32_t VtConsumer::setVtContentListener(
|
|
const std::shared_ptr<VtContentListener> & listener) {
|
|
if (!listener || !listener.get()) {
|
|
VTCON_LOGE("set content listener is null");
|
|
return -1;
|
|
}
|
|
|
|
if (mContentListener && mContentListener.get()) {
|
|
mContentListener.reset();
|
|
}
|
|
|
|
mContentListener = listener;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int32_t VtConsumer::onVtCmds(vt_cmd_t & cmd, vt_cmd_data_t & cmdData) {
|
|
if (!mContentListener || !mContentListener.get()) {
|
|
VTCON_LOGE("not found content listener");
|
|
return -1;
|
|
}
|
|
|
|
switch (cmd) {
|
|
case VT_CMD_SET_VIDEO_STATUS:
|
|
{
|
|
vt_video_status_t statusType = (vt_video_status_t)cmdData.data;
|
|
mContentListener->onVideoStatus(statusType);
|
|
}
|
|
break;
|
|
case VT_CMD_SET_GAME_MODE:
|
|
VTCON_LOGD("cmd VT_CMD_SET_GAME_MODE %d", cmdData.data);
|
|
mContentListener->onVideoGameMode(cmdData.data);
|
|
break;
|
|
case VT_CMD_SET_DISPLAY_FRAME:
|
|
VTCON_LOGD("cmd VT_CMD_SET_DISPLAY_FRAME(%d %d %d %d)", cmdData.rect.left,
|
|
cmdData.rect.top, cmdData.rect.right, cmdData.rect.bottom);
|
|
mContentListener->onDisplayFrameChange(cmdData.rect);
|
|
break;
|
|
case VT_CMD_SET_VIDEO_TRANSFORM:
|
|
VTCON_LOGD("received cmd VT_CMD_SET_VIDEO_TRANSFORM %d",
|
|
cmdData.transform);
|
|
mContentListener->onVideoTransform(cmdData.transform);
|
|
break;
|
|
default:
|
|
VTCON_LOGW("received an invalid CMD %d", (int)cmd);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int32_t VtConsumer::onVtFrameDisplayed(std::shared_ptr<VtBufferItem> & item) {
|
|
if (mReleaseListener) {
|
|
return mReleaseListener->onFrameDisplayed(item);
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
int32_t VtConsumer::onFrameAvailable(
|
|
std::vector<std::shared_ptr<VtBufferItem>> & items) {
|
|
if (mContentListener && mContentListener.get()) {
|
|
return mContentListener->onFrameAvailable(items);
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
void VtConsumer::onClearAlwaysVRRMode() {
|
|
if (mReleaseListener)
|
|
mReleaseListener->onClearAlwaysVRRMode();
|
|
}
|