306 lines
6.2 KiB
C++
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;
|
|
}
|
|
|
|
}
|