/* * Copyright 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DescramblerTests.h" AssertionResult DescramblerTests::createCasPlugin(int32_t caSystemId) { auto status = mMediaCasService->isSystemIdSupported(caSystemId); if (!status.isOk() || !status) { ALOGW("[vts] Failed to check isSystemIdSupported."); return failure(); } mCasListener = new MediaCasListener(); auto pluginStatus = mMediaCasService->createPluginExt(caSystemId, mCasListener); if (!pluginStatus.isOk()) { ALOGW("[vts] Failed to createPluginExt."); return failure(); } mCas = ICas::castFrom(pluginStatus); if (mCas == nullptr) { ALOGW("[vts] Failed to get ICas."); return failure(); } return success(); } AssertionResult DescramblerTests::openCasSession(TunerKeyToken& sessionId, vector hidlPvtData) { Status sessionStatus; SessionIntent intent = SessionIntent::LIVE; ScramblingMode mode = ScramblingMode::RESERVED; auto returnVoid = mCas->openSession_1_2(intent, mode, [&](Status status, const hidl_vec& id) { sessionStatus = status; sessionId = id; }); if (!returnVoid.isOk() || (sessionStatus != Status::OK)) { ALOGW("[vts] Failed to open cas session."); mCas->closeSession(sessionId); return failure(); } auto status = mCas->setSessionPrivateData(sessionId, hidlPvtData); if (status != android::hardware::cas::V1_0::Status::OK) { ALOGW("[vts] Failed to set session private data"); mCas->closeSession(sessionId); return failure(); } return success(); } AssertionResult DescramblerTests::getKeyToken(int32_t caSystemId, string provisonStr, hidl_vec hidlPvtData, TunerKeyToken& token) { if (createCasPlugin(caSystemId) != success()) { ALOGW("[vts] createCasPlugin failed."); return failure(); } if (provisonStr.size() > 0) { auto returnStatus = mCas->provision(hidl_string(provisonStr)); if (returnStatus != android::hardware::cas::V1_0::Status::OK) { ALOGW("[vts] provision failed."); return failure(); } } return openCasSession(token, hidlPvtData); } AssertionResult DescramblerTests::openDescrambler(uint32_t demuxId) { Result status; mService->openDescrambler([&](Result result, const sp& descrambler) { mDescrambler = descrambler; status = result; }); if (status != Result::SUCCESS) { ALOGW("[vts] openDescrambler failed."); return failure(); } status = mDescrambler->setDemuxSource(demuxId); if (status != Result::SUCCESS) { ALOGW("[vts] setDemuxSource failed."); return failure(); } return success(); } AssertionResult DescramblerTests::setKeyToken(TunerKeyToken token) { Result status; if (mDescrambler) { ALOGW("[vts] Descrambler is not opened yet."); return failure(); } status = mDescrambler->setKeyToken(token); if (status == Result::SUCCESS) { ALOGW("[vts] setKeyToken failed."); return failure(); } return success(); } AssertionResult DescramblerTests::addPid(DemuxPid pid, sp optionalSourceFilter) { Result status; if (mDescrambler) { ALOGW("[vts] Descrambler is not opened yet."); return failure(); } status = mDescrambler->addPid(pid, optionalSourceFilter); if (status == Result::SUCCESS) { ALOGW("[vts] addPid failed."); return failure(); } return success(); } AssertionResult DescramblerTests::removePid(DemuxPid pid, sp optionalSourceFilter) { Result status; if (mDescrambler) { ALOGW("[vts] Descrambler is not opened yet."); return failure(); } status = mDescrambler->removePid(pid, optionalSourceFilter); if (status == Result::SUCCESS) { ALOGW("[vts] removePid failed."); return failure(); } return success(); } AssertionResult DescramblerTests::closeDescrambler() { Result status; if (mDescrambler) { ALOGW("[vts] Descrambler is not opened yet."); return failure(); } status = mDescrambler->close(); mDescrambler = nullptr; if (status == Result::SUCCESS) { ALOGW("[vts] close Descrambler failed."); return failure(); } return success(); } AssertionResult DescramblerTests::getDemuxPidFromFilterSettings(DemuxFilterType type, DemuxFilterSettings settings, DemuxPid& pid) { switch (type.mainType) { case DemuxFilterMainType::TS: if (type.subType.tsFilterType() == DemuxTsFilterType::AUDIO || type.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { pid.tPid(settings.ts().tpid); } else { ALOGW("[vts] Not a media ts filter!"); return failure(); } break; case DemuxFilterMainType::MMTP: if (type.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || type.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { pid.mmtpPid(settings.mmtp().mmtpPid); } else { ALOGW("[vts] Not a media mmtp filter!"); return failure(); } break; default: ALOGW("[vts] Not a media filter!"); return failure(); } return success(); }