Files
BPI-CM9-Linux/aml-comp/vendor/amlogic/aml_tvserver/client/TvClientWrapper.cpp
T

454 lines
14 KiB
C++
Raw Normal View History

2026-08-13 11:28:40 +08:00
/*
* Copyright (c) 2019 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_MODULE_TAG "TV"
#define LOG_CLASS_TAG "TvClientWrapper"
#include "TvClientWrapper.h"
#include "CTvLog.h"
#include "TvClient.h"
#include <memory>
#include <vector>
#include <cstring>
#ifdef __cplusplus
extern "C" {
#endif
typedef void (*TvClientEventCallbackFunc)(event_type_t eventType,
void *eventData);
class TvClientWrapper : public TvClient::TvClientIObserver {
public:
TvClientWrapper() {
mpTvClient = TvClient::GetInstance();
mpTvClient->setTvClientObserver(this);
mEventCallbackFunc = NULL;
}
~TvClientWrapper() {
LOGD("%s.\n", __FUNCTION__);
if (mpTvClient != NULL) {
mpTvClient->Release();
mpTvClient = NULL;
}
if (mEventCallbackFunc != NULL) {
mEventCallbackFunc = NULL;
}
}
int RegisterCallback(TvClientEventCallbackFunc eventCallbackFunc) {
if (eventCallbackFunc == NULL) {
LOGD("eventCallbackFunc is NULL.\n");
return -1;
} else {
mEventCallbackFunc = eventCallbackFunc;
return 0;
}
}
int StartTv(tv_source_input_t source) { return mpTvClient->StartTv(source); }
int StopTv(tv_source_input_t source) { return mpTvClient->StopTv(source); }
int SwitchSource(tv_source_input_t source) { return mpTvClient->SwitchSource(source); }
tv_source_input_t GetCurrentSource() { return mpTvClient->GetCurrentSource(); }
int SetEdidVersion(tv_source_input_t source, int edidVer) {
return mpTvClient->SetEdidVersion(source, edidVer);
}
int GetEdidVersion(tv_source_input_t source) {
return mpTvClient->GetEdidVersion(source);
}
int SetEdidData(tv_source_input_t source, char *dataBuf) {
return mpTvClient->SetEdidData(source, dataBuf);
}
int GetEdidData(tv_source_input_t source, char *dataBuf) {
LOGD("%s\n", __FUNCTION__);
char buf[512] = {0};
int ret = mpTvClient->GetEdidData(source, buf);
if (ret < 0) {
LOGD("%s failed.\n", __FUNCTION__);
} else {
memcpy(dataBuf, buf, sizeof(buf));
}
return ret;
}
int SetVdinWorkMode(vdin_work_mode_t vdinWorkMode) {
return mpTvClient->SetVdinWorkMode(vdinWorkMode);
}
int GetHdmiSPDInfo(tv_source_input_t source, char *data, size_t datalen) {
return mpTvClient->GetHdmiSPDInfo(source, data, datalen);
}
int GetCurrentSourceFrameHeight() {
return mpTvClient->GetCurrentSourceFrameHeight();
}
int GetCurrentSourceFrameWidth() {
return mpTvClient->GetCurrentSourceFrameWidth();
}
int GetCurrentSourceFrameFps() {
return mpTvClient->GetCurrentSourceFrameFps();
}
int GetCurrentSourceColorDepth() {
return mpTvClient->GetCurrentSourceColorDepth();
}
tvin_aspect_ratio_t GetCurrentSourceAspectRatio() {
return mpTvClient->GetCurrentSourceAspectRatio();
}
tvin_color_fmt_t GetCurrentSourceColorFormat() {
return mpTvClient->GetCurrentSourceColorFormat();
}
tvin_color_range_t GetCurrentSourceColorRange() {
return mpTvClient->GetCurrentSourceColorRange();
}
tvin_line_scan_mode_t GetCurrentSourceLineScanMode() {
return mpTvClient->GetCurrentSourceLineScanMode();
}
int GetSourceConnectStatus(tv_source_input_t source) {
return mpTvClient->GetSourceConnectStatus(source);
}
int SetEdidBoostOn(int bBoostOn) {
return mpTvClient->SetEdidBoostOn(bBoostOn);
}
int GetCurrentSourceAllmInfo(tvin_latency_s *info) {
return mpTvClient->GetCurrentSourceAllmInfo(info);
}
int SetHdmiAllmEnabled(bool enable) {
return mpTvClient->SetHdmiAllmEnabled(enable);
}
bool GetHdmiAllmEnabled() { return mpTvClient->GetHdmiAllmEnabled(); }
bool GetHdmiVrrSupport() { return mpTvClient->GetHdmiVrrSupport(); }
int SetHdmiVrrEnabled(bool enable) {
return mpTvClient->SetHdmiVrrEnabled(enable);
}
bool GetHdmiVrrEnabled() { return mpTvClient->GetHdmiVrrEnabled(); }
vdin_vrr_mode_t GetHdmiVrrMode() { return mpTvClient->GetHdmiVrrMode(); }
bool GetHdmiQmsSupport() { return mpTvClient->GetHdmiQmsSupport(); }
int SetHdmiQmsEnabled(bool enable) {
return mpTvClient->SetHdmiQmsEnabled(enable);
}
bool GetHdmiQmsEnabled() { return mpTvClient->GetHdmiQmsEnabled(); }
int GetCurrentStdInfo(tvin_std_s *info) {
return mpTvClient->GetCurrentStdInfo(info);
}
int SetAudioDecoderId(int channel, int id) {
return mpTvClient->SetAudioDecoderId(channel, id);
}
int SetAvAudioModeEnabled(bool enable) {
return mpTvClient->SetAvAudioModeEnabled(enable);
}
int StartTvInPIP(tv_source_input_t source) {
return mpTvClient->StartTvInPIP(source);
}
int StopTvInPIP(tv_source_input_t source) {
return mpTvClient->StopTvInPIP(source);
}
int SetHdmiDlgEnabled(bool enable) {
return mpTvClient->SetHdmiDlgEnabled(enable);
}
bool GetHdmiDlgEnabled() {
return mpTvClient->GetHdmiDlgEnabled();
}
bool GetHdmiDlgSupport(void) {
return mpTvClient->GetHdmiDlgSupport();
}
void onTvClientEvent(CTvEvent &event) {
int eventType = event.getEventType();
LOGD("%s: eventType: %d.\n", __FUNCTION__, eventType);
switch (eventType) {
case CTvEvent::TV_EVENT_SIGNAL_DETECT: {
LOGD("%s: signal event.\n", __FUNCTION__);
TvEvent::SignalDetectEvent *signalDetectEvent =
(TvEvent::SignalDetectEvent *)(&event);
SignalDetectCallback_t SignalDetectCallback;
SignalDetectCallback.SourceInput =
(tv_source_input_t)signalDetectEvent->mSourceInput;
SignalDetectCallback.SignalFmt = (tvin_sig_fmt_t)signalDetectEvent->mFmt;
SignalDetectCallback.TransFmt =
(tvin_trans_fmt_t)signalDetectEvent->mTrans_fmt;
SignalDetectCallback.SignalStatus =
(tvin_sig_status_t)signalDetectEvent->mStatus;
SignalDetectCallback.isDviSignal = signalDetectEvent->mDviFlag;
SignalDetectCallback.Hdrinfo = signalDetectEvent->mhdr_info;
mEventCallbackFunc(TV_EVENT_TYPE_SIGNAL_DETECT, &SignalDetectCallback);
break;
}
case CTvEvent::TV_EVENT_SOURCE_CONNECT: {
LOGD("%s: connect event.\n", __FUNCTION__);
TvEvent::SourceConnectEvent *sourceConnectEvent =
(TvEvent::SourceConnectEvent *)(&event);
SourceConnectCallback_t SourceConnectCallback;
SourceConnectCallback.SourceInput =
(tv_source_input_t)sourceConnectEvent->mSourceInput;
SourceConnectCallback.ConnectionState =
sourceConnectEvent->connectionState;
mEventCallbackFunc(TV_EVENT_TYPE_SOURCE_CONNECT, &SourceConnectCallback);
break;
}
case CTvEvent::TV_EVENT_SIG_DV_ALLM: {
LOGD("%s: allm event.\n", __FUNCTION__);
TvEvent::SignalDvAllmEvent *signalDvAllmEvent =
(TvEvent::SignalDvAllmEvent *)(&event);
SignalDvAllmCallback_t SignalDvAllmCallback;
SignalDvAllmCallback.allm_mode = signalDvAllmEvent->allm_mode;
SignalDvAllmCallback.it_content = signalDvAllmEvent->it_content;
SignalDvAllmCallback.cn_type = (tvin_cn_type_t)signalDvAllmEvent->cn_type;
mEventCallbackFunc(TV_EVENT_TYPE_SIG_DV_ALLM, &SignalDvAllmCallback);
break;
}
case CTvEvent::TV_EVENT_PIP_SIGNAL_DETECT: {
LOGD("%s: pip signal event.\n", __FUNCTION__);
TvEvent::PipSignalDetectEvent *pipDetectEvent =
(TvEvent::PipSignalDetectEvent *)(&event);
PipSignalDetectCallback_t PipSignalDetectCallback;
PipSignalDetectCallback.SourceInput =
(tv_source_input_t)pipDetectEvent->mSourceInput;
PipSignalDetectCallback.SignalFmt = (tvin_sig_fmt_t)pipDetectEvent->mFmt;
PipSignalDetectCallback.TransFmt =
(tvin_trans_fmt_t)pipDetectEvent->mTrans_fmt;
PipSignalDetectCallback.SignalStatus =
(tvin_sig_status_t)pipDetectEvent->mStatus;
PipSignalDetectCallback.isDviSignal = pipDetectEvent->mDviFlag;
PipSignalDetectCallback.Hdrinfo = pipDetectEvent->mhdr_info;
mEventCallbackFunc(TV_EVENT_TYPE_PIP_SIGNAL_DETECT,
&PipSignalDetectCallback);
break;
}
default:
LOGD("%s: invalid event!\n", __FUNCTION__);
break;
}
return;
}
TvClient *mpTvClient;
TvClientEventCallbackFunc mEventCallbackFunc;
};
static void HandleTvClientEvent(event_type_t eventType, void *eventData) {
if (eventType == TV_EVENT_TYPE_SIGNAL_DETECT) {
SignalDetectCallback_t *SignalDetectCallback =
(SignalDetectCallback_t *)(eventData);
LOGD("%s: source: %d, signalFmt: %d, transFmt: %d, status: %d, isDVI: %d, "
"Hdrinfo: %ud\n",
__FUNCTION__, SignalDetectCallback->SourceInput,
SignalDetectCallback->SignalFmt, SignalDetectCallback->TransFmt,
SignalDetectCallback->SignalStatus, SignalDetectCallback->isDviSignal,
SignalDetectCallback->Hdrinfo);
} else if (eventType == TV_EVENT_TYPE_SOURCE_CONNECT) {
SourceConnectCallback_t *SourceConnectCallback =
(SourceConnectCallback_t *)eventData;
LOGD("%s: source: %d, connectStatus: %d\n", __FUNCTION__,
SourceConnectCallback->SourceInput,
SourceConnectCallback->ConnectionState);
} else if (eventType == TV_EVENT_TYPE_SIG_DV_ALLM) {
SignalDvAllmCallback_t *SignalDvAllmCallback =
(SignalDvAllmCallback_t *)eventData;
LOGD("%s: allm_mode: %d, it_content: %d, cn_type: %d\n", __FUNCTION__,
SignalDvAllmCallback->allm_mode, SignalDvAllmCallback->it_content,
SignalDvAllmCallback->cn_type);
} else if (eventType == TV_EVENT_TYPE_PIP_SIGNAL_DETECT) {
PipSignalDetectCallback_t *PipSignalDetectCallback =
(PipSignalDetectCallback_t *)eventData;
LOGD("%s: pip source: %d, signalFmt: %d, transFmt: %d, status: %d, isDVI: "
"%d, Hdrinfo: %ud\n",
__FUNCTION__, PipSignalDetectCallback->SourceInput,
PipSignalDetectCallback->SignalFmt, PipSignalDetectCallback->TransFmt,
PipSignalDetectCallback->SignalStatus,
PipSignalDetectCallback->isDviSignal,
PipSignalDetectCallback->Hdrinfo);
} else {
LOGD("%s: invalid event.\n", __FUNCTION__);
}
mEventCallback(eventType, eventData);
}
/**************************************wrapper
* api*******************************************/
static std::shared_ptr<TvClientWrapper> instance_ = nullptr;
static std::shared_ptr<TvClientWrapper> GetInstance(void) {
if (!instance_) {
instance_ = std::shared_ptr<TvClientWrapper>(new TvClientWrapper());
GetInstance()->RegisterCallback(HandleTvClientEvent);
LOGD("%s: start GetInstance.\n", __FUNCTION__);
}
return instance_;
}
int StartTv(tv_source_input_t source) { return GetInstance()->StartTv(source); }
int StopTv(tv_source_input_t source) { return GetInstance()->StopTv(source); }
int SwitchSource(tv_source_input_t source) { return GetInstance()->SwitchSource(source); }
tv_source_input_t GetCurrentSource() { return GetInstance()->GetCurrentSource(); }
int SetEdidVersion(tv_source_input_t source, int edidVer) {
return GetInstance()->SetEdidVersion(source, edidVer);
}
int GetEdidVersion(tv_source_input_t source) {
return GetInstance()->GetEdidVersion(source);
}
int SetEdidData(tv_source_input_t source, char *dataBuf) {
return GetInstance()->SetEdidData(source, dataBuf);
}
int GetEdidData(tv_source_input_t source, char *dataBuf) {
return GetInstance()->GetEdidData(source, dataBuf);
}
int GetHdmiSPDInfo(tv_source_input_t source, char *data, size_t datalen) {
return GetInstance()->GetHdmiSPDInfo(source, data, datalen);
}
int setTvEventCallback(EventCallback Callback) {
if (Callback == NULL) {
LOGD("%s: Callback is NULL.\n", __FUNCTION__);
} else {
mEventCallback = Callback;
}
return 0;
}
int SetVdinWorkMode(vdin_work_mode_t vdinWorkMode) {
return GetInstance()->SetVdinWorkMode(vdinWorkMode);
}
int GetCurrentSourceFrameHeight() {
return GetInstance()->GetCurrentSourceFrameHeight();
}
int GetCurrentSourceFrameWidth() {
return GetInstance()->GetCurrentSourceFrameWidth();
}
int GetCurrentSourceFrameFps() {
return GetInstance()->GetCurrentSourceFrameFps();
}
int GetCurrentSourceColorDepth() {
return GetInstance()->GetCurrentSourceColorDepth();
}
tvin_aspect_ratio_t GetCurrentSourceAspectRatio() {
return GetInstance()->GetCurrentSourceAspectRatio();
}
tvin_color_fmt_t GetCurrentSourceColorFormat() {
return GetInstance()->GetCurrentSourceColorFormat();
}
tvin_color_range_t GetCurrentSourceColorRange() {
return GetInstance()->GetCurrentSourceColorRange();
}
tvin_line_scan_mode_t GetCurrentSourceLineScanMode() {
return GetInstance()->GetCurrentSourceLineScanMode();
}
int GetSourceConnectStatus(tv_source_input_t source) {
return GetInstance()->GetSourceConnectStatus(source);
}
int SetEdidBoostOn(int bBoostOn) {
return GetInstance()->SetEdidBoostOn(bBoostOn);
}
int GetCurrentStdInfo(tvin_std_s *info) {
return GetInstance()->GetCurrentStdInfo(info);
}
int GetCurrentSourceAllmInfo(tvin_latency_s *info) {
return GetInstance()->GetCurrentSourceAllmInfo(info);
}
int SetHdmiAllmEnabled(bool enable) {
return GetInstance()->SetHdmiAllmEnabled(enable);
}
bool GetHdmiAllmEnabled() { return GetInstance()->GetHdmiAllmEnabled(); }
bool GetHdmiVrrSupport() { return GetInstance()->GetHdmiVrrSupport(); }
int SetHdmiVrrEnabled(bool enable) {
return GetInstance()->SetHdmiVrrEnabled(enable);
}
bool GetHdmiVrrEnabled() { return GetInstance()->GetHdmiVrrEnabled(); }
vdin_vrr_mode_t GetHdmiVrrMode() { return GetInstance()->GetHdmiVrrMode(); }
bool GetHdmiQmsSupport() { return GetInstance()->GetHdmiQmsSupport(); }
int SetHdmiQmsEnabled(bool enable) {
return GetInstance()->SetHdmiQmsEnabled(enable);
}
bool GetHdmiQmsEnabled() { return GetInstance()->GetHdmiQmsEnabled(); }
int SetAudioDecoderId(int channel, int id) {return GetInstance()->SetAudioDecoderId(channel, id); }
int SetAvAudioModeEnabled(bool enable) {return GetInstance()->SetAvAudioModeEnabled(enable); }
int StartTvInPIP(tv_source_input_t source) { return GetInstance()->StartTvInPIP(source); }
int StopTvInPIP(tv_source_input_t source) { return GetInstance()->StopTvInPIP(source); }
int SetHdmiDlgEnabled(bool enable) { return GetInstance()->SetHdmiDlgEnabled(enable);}
bool GetHdmiDlgEnabled() { return GetInstance()->GetHdmiDlgEnabled(); }
bool GetHdmiDlgSupport(void) { return GetInstance()->GetHdmiDlgSupport(); }
#ifdef __cplusplus
};
#endif