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

306 lines
6.2 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 "AmlCasBase"
#include <utils/AmlMpLog.h>
#include "AmlCasBase.h"
#include "AmlDvbCasHal.h"
#include "wv_iptvcas/AmlWVIptvCas.h"
#include "wv_iptvcas/AmlWVIptvCas_V2.h"
#include "vmx_iptvcas/AmlVMXIptvCas.h"
#include "vmx_iptvcas/AmlVMXIptvCas_V2.h"
#include "vmx_webcas/AmlVMXWebCas.h"
#include "nagra_webcas/AmlNagraWebCas.h"
#ifdef HAVE_VMX_IPTV_MEDIA_CAS
#include "vmx_iptvcas/AmlVMXIptvMediaCas.h"
#endif
#include <utils/AmlMpUtils.h>
#ifdef HAVE_WVIPTV_CAS_V3
#include "wv_iptvcas/AmlWVIptvCas_V3.h"
#endif
static const char* mName = LOG_TAG;
namespace aml_mp {
sptr<AmlCasBase> AmlCasBase::create(Aml_MP_CASServiceType serviceType)
{
sptr<AmlCasBase> cas = nullptr;
MLOG("cas serviceType: %s", mpCASServiceType2Str(serviceType));
switch (serviceType) {
case AML_MP_CAS_SERVICE_LIVE_PLAY:
case AML_MP_CAS_SERVICE_PVR_PLAY:
case AML_MP_CAS_SERVICE_PVR_RECORDING:
case AML_MP_CAS_SERVICE_PVR_TIMESHIFT_PLAY:
case AML_MP_CAS_SERVICE_PVR_TIMESHIFT_RECORDING:
{
MLOGI("dvb cas_hal support!");
cas = new AmlDvbCasHal(serviceType);
}
break;
case AML_MP_CAS_SERVICE_VERIMATRIX_IPTV:
{
#ifdef HAVE_VMX_IPTV_MEDIA_CAS
MLOGI("%s, vmx iptv media cas support", __func__);
cas = new AmlVMXIptvMediaCas(serviceType);
#elif HAVE_VMXIPTV_CAS_V2
MLOGI("%s, iptv vmxcas v2 support", __func__);
cas = new AmlVMXIptvCas_V2(serviceType);
#elif HAVE_VMXIPTV_CAS
MLOGI("%s, iptv vmxcas support", __func__);
cas = new AmlVMXIptvCas(serviceType);
#endif
}
break;
case AML_MP_CAS_SERVICE_WIDEVINE:
{
#ifdef HAVE_WVIPTV_CAS_V3
MLOGI("%s, iptv wvcas v3 support", __func__);
cas = new AmlWVIptvCas_V3(serviceType);
#elif HAVE_WVIPTV_CAS_V2
MLOGI("%s, iptv wvcas v2 support", __func__);
cas = new AmlWVIptvCas_V2(serviceType);
#elif HAVE_WVIPTV_CAS
MLOGI("%s, iptv wvcas support", __func__);
cas = new AmlWVIptvCas(serviceType);
#endif
}
break;
case AML_MP_CAS_SERVICE_VERIMATRIX_WEB:
{
#ifdef HAVE_VMXWEB_CAS
MLOGI("%s, vmx_web support", __func__);
cas = new AmlVMXWebCas(serviceType);
#endif
}
break;
case AML_MP_CAS_SERVICE_NAGRA_WEB:
{
#ifdef HAVE_NAGRAWEB_CAS
MLOGI("%s, nagra_web support", __func__);
cas = new AmlNagraWebCas(serviceType);
#endif
}
break;
default:
MLOGE("unsupported ca type!");
break;
}
return cas;
}
AmlCasBase::AmlCasBase(Aml_MP_CASServiceType serviceType)
:mServiceType(serviceType)
{
memset(&mIptvCasParam, 0, sizeof(mIptvCasParam));
}
AmlCasBase::~AmlCasBase()
{
MLOG();
}
int AmlCasBase::registerEventCallback(Aml_MP_CAS_EventCallback cb, void* userData)
{
AML_MP_UNUSED(cb);
AML_MP_UNUSED(userData);
return 0;
}
int AmlCasBase::startDescrambling(Aml_MP_CASServiceInfo* params)
{
AML_MP_UNUSED(params);
return 0;
}
int AmlCasBase::startDescrambling(const Aml_MP_IptvCASParams* params)
{
MLOG();
mIptvCasParam = *params;
return 0;
}
int AmlCasBase::setPrivateData(const uint8_t* data, size_t size)
{
AML_MP_UNUSED(data);
AML_MP_UNUSED(size);
return 0;
}
int AmlCasBase::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);
return 0;
}
int AmlCasBase::processEmm(bool isSection, int emmPid, const uint8_t* data, size_t size)
{
AML_MP_UNUSED(isSection);
AML_MP_UNUSED(emmPid);
AML_MP_UNUSED(data);
AML_MP_UNUSED(size);
return 0;
}
int AmlCasBase::switchAudioTrack(const Aml_MP_AudioParams* params)
{
AML_MP_UNUSED(params);
return 0;
}
int AmlCasBase::decrypt(uint8_t *in, int size, void *ext_data, Aml_MP_Buffer* outbuffer)
{
AML_MP_UNUSED(in);
AML_MP_UNUSED(size);
AML_MP_UNUSED(ext_data);
outbuffer->address = in;
outbuffer->size = size;
return 0;
}
int AmlCasBase::updateDescramblingPid(int oldStreamPid, int newStreamPid)
{
AML_MP_UNUSED(oldStreamPid);
AML_MP_UNUSED(newStreamPid);
return 0;
}
int AmlCasBase::startDVRRecord(Aml_MP_CASServiceInfo* serviceInfo)
{
AML_MP_UNUSED(serviceInfo);
return 0;
}
int AmlCasBase::stopDVRRecord()
{
return 0;
}
int AmlCasBase::startDVRReplay(Aml_MP_CASDVRReplayParams* dvrReplayParams)
{
AML_MP_UNUSED(dvrReplayParams);
return 0;
}
int AmlCasBase::stopDVRReplay()
{
return 0;
}
int AmlCasBase::dvrReplay(Aml_MP_CASCryptoParams* cryptoParams)
{
AML_MP_UNUSED(cryptoParams);
return 0;
}
int AmlCasBase::DVREncrypt(Aml_MP_CASCryptoParams* cryptoParams)
{
AML_MP_UNUSED(cryptoParams);
return 0;
}
int AmlCasBase::DVRDecrypt(Aml_MP_CASCryptoParams* cryptoParams)
{
AML_MP_UNUSED(cryptoParams);
return 0;
}
AML_MP_SECMEM AmlCasBase::createSecmem(Aml_MP_CASServiceType type, void** pSecBuf, uint32_t* size)
{
AML_MP_UNUSED(type);
AML_MP_UNUSED(pSecBuf);
AML_MP_UNUSED(size);
return nullptr;
}
int AmlCasBase::destroySecmem(AML_MP_SECMEM secMem)
{
AML_MP_UNUSED(secMem);
return 0;
}
int AmlCasBase::ioctl(const char* inJson, char* outJson, uint32_t outLen)
{
AML_MP_UNUSED(inJson);
AML_MP_UNUSED(outJson);
AML_MP_UNUSED(outLen);
return 0;
}
int AmlCasBase::getStoreRegion(Aml_MP_CASStoreRegion* region, uint8_t* regionCount)
{
AML_MP_UNUSED(region);
AML_MP_UNUSED(regionCount);
return 0;
}
int AmlCasBase::getEcmPids(std::vector<int>& ecmPids)
{
ecmPids.clear();
int pid;
for (size_t i = 0; i < MAX_ECM_PIDS_NUM; ++i) {
pid = mIptvCasParam.ecmPid[i];
if (pid <= 0 || pid >= AML_MP_INVALID_PID) {
continue;
}
ecmPids.push_back(pid);
}
return 0;
}
int AmlCasBase::getChipID(char* chipid, size_t size)
{
AML_MP_UNUSED(chipid);
AML_MP_UNUSED(size);
return 0;
}
const char * AmlCasBase::getCAVersion()
{
return 0;
}
int AmlCasBase::provision(const Aml_MP_IptvCASParams* params)
{
AML_MP_UNUSED(params);
return 0;
}
}