Files
BPI-CM9-Linux/aml-comp/multimedia/aml_mp_sdk/cas/vmx_webcas/AmlVMXWebCas.cpp
T
2026-08-24 10:03:24 +08:00

193 lines
4.5 KiB
C++

/*
* Copyright (c) 2020 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_TAG "AmlVMXWebCas"
#include <utils/AmlMpLog.h>
#include <utils/AmlMpUtils.h>
#include "AmlVMXWebCas.h"
#include <dlfcn.h>
#include <cutils/properties.h>
#include <utils/Amlsysfsutils.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
static const char* mName = LOG_TAG;
namespace aml_mp {
AmlVMXWebCas::AmlVMXWebCas(Aml_MP_CASServiceType serviceType)
:AmlCasBase(serviceType)
{
MLOGI("ctor AmlVMXWebCas");
pIptvCas = new AmCasLibWrapper<AML_MP_CAS_SERVICE_VERIMATRIX_WEB>("libdec_ca_vmx_web.so");
memset(sessionId, 0, sizeof(sessionId));
memset(mServerPort, 0, sizeof(mServerPort));
mInstanceId = 0;
mFirstEcm = 0;
}
AmlVMXWebCas::~AmlVMXWebCas()
{
MLOGI("dtor AmlVMXWebCas");
int ret = 0;
pIptvCas.clear();
}
int AmlVMXWebCas::startDescrambling(const Aml_MP_IptvCASParams* params)
{
MLOG();
AmlCasBase::startDescrambling(params);
int ret = 0;
drmserverinfo_t initParam;
memset(&initParam, 0, sizeof(initParam));
initParam.enablelog = 1;
initParam.serveraddr = mIptvCasParam.serverAddress;
snprintf(mServerPort, sizeof(mServerPort), "%d", mIptvCasParam.serverPort);
initParam.serverport = mServerPort;
initParam.storepath = mIptvCasParam.keyPath;
ret = pIptvCas->setPrivateData((void *)&initParam, sizeof(drmserverinfo_t));
MLOGI("%s, setPrivateData ret:%d", __func__, ret);
ret = pIptvCas->provision();
if (pIptvCas) {
setDscSource(TSN_IPTV);
MLOGI("%s, vpid=0x%x, apid=0x%x", __func__, mIptvCasParam.videoPid, mIptvCasParam.audioPid);
pIptvCas->setPids(mIptvCasParam.videoPid, mIptvCasParam.audioPid);
ret = pIptvCas->openSession(&sessionId[0]);
}
return ret;
}
int AmlVMXWebCas::stopDescrambling()
{
MLOGI("closeSession");
int ret = 0;
setDscSource(TSN_DVB);
if (pIptvCas) {
ret = pIptvCas->closeSession(&sessionId[0]);
pIptvCas.clear();
}
return ret;
}
int AmlVMXWebCas::setPrivateData(const uint8_t* data, size_t size)
{
int ret = 0;
if (pIptvCas) {
uint8_t *pdata = const_cast<uint8_t *>(data);
ret = pIptvCas->setPrivateData((void*)pdata, size);
if (ret != 0) {
MLOGI("setPrivateData failed, ret =%d", ret);
return ret;
}
}
return ret;
}
int AmlVMXWebCas::processEcm(bool isSection, int ecmPid, const uint8_t* data, size_t size)
{
AML_MP_UNUSED(isSection);
AML_MP_UNUSED(ecmPid);
AML_MP_UNUSED(data);
AML_MP_UNUSED(size);
int ret = 0;
return ret;
}
int AmlVMXWebCas::decrypt(uint8_t *in, int size, void *ext_data, Aml_MP_Buffer* outbuffer)
{
int ret = pIptvCas->decrypt(in, in, size, ext_data);
if (ret) {
MLOGE("decrypt failed, ret=%d", ret);
return ret;
}
outbuffer->address = pIptvCas->getOutbuffer();
outbuffer->size = size / 188 * 188;
if (!outbuffer->size || !outbuffer->address) {
return -1;
}
return 0;
}
int AmlVMXWebCas::dscDevOpen(const char *port_addr, int flags)
{
int r;
#if 1
int retry_open_times = 0;
retry_open:
r = open(port_addr, flags);
if (r < 0 /*&& r == EBUSY */)
{
retry_open_times++;
usleep(10*1000);
if (retry_open_times < 100)
{
goto retry_open;
}
MLOGI("retry_open [%s] failed,ret = %d error=%d used_times=%d*10(ms)\n", port_addr, r, errno, retry_open_times);
return r;
}
if (retry_open_times > 0)
{
MLOGI("retry_open [%s] success\n", port_addr);
}
#endif
return (int)r;
}
int AmlVMXWebCas::setDscSource(const char* source)
{
int ret = 0;
bool use_hw_multi_demux = false;
#if 1
if (isSupportMultiHwDemux()) {
MLOGI("Work with Hw Multi Demux.");
use_hw_multi_demux = true;
} else {
MLOGI("Work with Hw Demux.");
use_hw_multi_demux = false;
}
#if 1
if (!use_hw_multi_demux) {
ret = amsysfs_set_sysfs_str(DMX0_SOURCE_PATH, DMX_SRC);
if (ret)
MLOGI("Error ret 0x%x\n", ret);
ret = amsysfs_set_sysfs_str(DSC0_SOURCE_PATH, DSC_SRC);
if (ret)
MLOGI("Error ret 0x%x\n", ret);
}
else
{
ret = amsysfs_set_sysfs_str(TSN_PATH, source);
if (ret)
MLOGI("hw multi demux Error ret 0x%x\n", ret);
}
#endif
#endif
return ret;
}
}