Files
2026-08-24 10:03:24 +08:00

197 lines
6.3 KiB
C++

#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include "wst_essos.h"
#include "Logger.h"
#define TAG "rlib:wst_essos"
#define DEFAULT_WINDOW_WIDTH (1280)
#define DEFAULT_WINDOW_HEIGHT (720)
#define DEFAULT_USAGE (EssRMgrVidUse_fullResolution|EssRMgrVidUse_fullQuality|EssRMgrVidUse_fullPerformance)
void WstEssRMgrOps::resMgrNotify( EssRMgr *rm, int event, int type, int id, void* userData )
{
WstEssRMgrOps *rMgrOps = static_cast<WstEssRMgrOps *>(userData);
std::lock_guard<std::mutex> lck(rMgrOps->mLock);
DEBUG(rMgrOps->mLogCategory,"resMgrNotify: enter");
switch ( type )
{
case EssRMgrResType_videoDecoder:
switch ( event )
{
case EssRMgrEvent_granted: {
if (rMgrOps->mResAssignedId == id)
{
DEBUG(rMgrOps->mLogCategory,"essos notify granted,assigned id %d",id);
DEBUG(rMgrOps->mLogCategory,"resMgrNotify: exit");
return;
}
rMgrOps->mResAssignedId = id;
memset( &rMgrOps->mResCurrCaps, 0, sizeof(EssRMgrCaps) );
if ( !EssRMgrResourceGetCaps( rMgrOps->mEssRmgr, EssRMgrResType_videoDecoder, rMgrOps->mResAssignedId, &rMgrOps->mResCurrCaps ) )
{
ERROR(rMgrOps->mLogCategory,"resMgrNotify: failed to get caps of assigned decoder");
}
DEBUG(rMgrOps->mLogCategory,"essos notify granted,async assigned id %d caps %X (%dx%d)",
rMgrOps->mResAssignedId,
rMgrOps->mResCurrCaps.capabilities,
rMgrOps->mResCurrCaps.info.video.maxWidth,
rMgrOps->mResCurrCaps.info.video.maxHeight);
if (rMgrOps->mUserCallback) {
rMgrOps->mUserCallback(EssRMgrEvent_granted, rMgrOps->mUserData);
}
} break;
case EssRMgrEvent_revoked: {
memset( &rMgrOps->mResCurrCaps, 0, sizeof(EssRMgrCaps) );
WARNING(rMgrOps->mLogCategory,"essos notify revoked , releasing video decoder %d", id);
if (rMgrOps->mUserCallback) {
rMgrOps->mUserCallback(EssRMgrEvent_revoked, rMgrOps->mUserData);
}
rMgrOps->mResAssignedId = -1;
WARNING(rMgrOps->mLogCategory,"done releasing video decoder %d", id);
} break;
default:
break;
}
break;
default:
break;
}
DEBUG(rMgrOps->mLogCategory,"resMgrNotify: exit");
}
WstEssRMgrOps::WstEssRMgrOps(int logCategory) {
mUserData = NULL;
mResPriority = 0;
mResAssignedId = -1;
mResUsage = DEFAULT_USAGE;
mEssRmgr = NULL;
mLogCategory = logCategory;
mUserCallback = NULL;
};
WstEssRMgrOps::~WstEssRMgrOps() {
};
void WstEssRMgrOps::setCallback(essMgrCallback essCallback, void *userData)
{
mUserData = userData;
mUserCallback = essCallback;
}
void WstEssRMgrOps::resMgrInit()
{
int enableEssos = 0;
//get environment to enable essos manager,default is invalid
char *env = getenv("ENABLE_WST_ESSOS");
if (env) {
INFO(mLogCategory,"enable essos %s",env);
enableEssos = atoi(env);
}
if (enableEssos > 0)
{
mEssRmgr = EssRMgrCreate();
}
if (!mEssRmgr) {
ERROR(mLogCategory,"EssRMgrCreate failed");
return;
}
memset( &mResCurrCaps, 0, sizeof(EssRMgrCaps) );
INFO(mLogCategory,"resMgrInit,ok");
return;
}
void WstEssRMgrOps::resMgrTerm()
{
if (mEssRmgr) {
EssRMgrDestroy(mEssRmgr);
mEssRmgr = NULL;
memset( &mResCurrCaps, 0, sizeof(EssRMgrCaps) );
}
INFO(mLogCategory,"resMgrTerm, ok");
}
void WstEssRMgrOps::resMgrRequestDecoder(bool pip)
{
bool result;
if (pip) {
mResUsage = 0;
}
mResReq.type = EssRMgrResType_videoDecoder;
mResReq.priority = mResPriority;
mResReq.usage = mResUsage;
mResReq.info.video.maxWidth= DEFAULT_WINDOW_WIDTH;
mResReq.info.video.maxHeight= DEFAULT_WINDOW_HEIGHT;
mResReq.asyncEnable = true;
mResReq.notifyCB = WstEssRMgrOps::resMgrNotify;
mResReq.notifyUserData = this;
if (!mEssRmgr)
{
WARNING(mLogCategory,"EssRMgrCreate failed");
return;
}
std::lock_guard<std::mutex> lck(mLock);
DEBUG(mLogCategory,"request resource resUsage %d priority %X", mResUsage, mResPriority);
result = EssRMgrRequestResource(mEssRmgr, EssRMgrResType_videoDecoder, &mResReq);
if ( result )
{
if ( mResReq.assignedId >= 0 )
{
DEBUG(mLogCategory,"assigned id %d caps %X", mResReq.assignedId, mResReq.assignedCaps);
mResAssignedId = mResReq.assignedId;
memset( &mResCurrCaps, 0, sizeof(EssRMgrCaps) );
if ( !EssRMgrResourceGetCaps( mEssRmgr, EssRMgrResType_videoDecoder, mResAssignedId, &mResCurrCaps ) )
{
ERROR(mLogCategory,"resMgrRequestDecoder: failed to get caps of assigned decoder");
}
DEBUG(mLogCategory,"done assigned id %d caps %X (%dx%d)",
mResAssignedId,
mResCurrCaps.capabilities,
mResCurrCaps.info.video.maxWidth,
mResCurrCaps.info.video.maxHeight);
}
else
{
DEBUG(mLogCategory,"async grant pending" );
}
}
else
{
ERROR(mLogCategory,"resMgrRequestDecoder: request failed");
}
}
void WstEssRMgrOps::resMgrReleaseDecoder()
{
if (!mEssRmgr)
{
WARNING(mLogCategory,"EssRMgrCreate failed");
return;
}
DEBUG(mLogCategory,"EssRMgrReleaseResource assigned id %d",mResAssignedId);
if (mResAssignedId >= 0) {
EssRMgrReleaseResource( mEssRmgr, EssRMgrResType_videoDecoder, mResAssignedId );
DEBUG(mLogCategory,"EssRMgrReleaseResource done");
mResReq.assignedId = -1;
mResAssignedId = -1;
}
}
void WstEssRMgrOps::resMgrUpdateState(int state)
{
if (!mEssRmgr)
{
WARNING(mLogCategory,"EssRMgrCreate failed");
return;
}
if ( mResAssignedId >= 0 )
{
EssRMgrResourceSetState( mEssRmgr, EssRMgrResType_videoDecoder, mResAssignedId, state );
}
}