diff --git a/api/system-current.txt b/api/system-current.txt index 2e53058f96d25..648be0d74bae4 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5036,6 +5036,7 @@ package android.media.tv.tuner { method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities(); method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo(); method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]); + method public int linkFrontendToCiCam(int); method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler(); method @Nullable public android.media.tv.tuner.dvr.DvrPlayback openDvrPlayback(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnPlaybackStatusChangedListener); method @Nullable public android.media.tv.tuner.dvr.DvrRecorder openDvrRecorder(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnRecordStatusChangedListener); @@ -5049,10 +5050,12 @@ package android.media.tv.tuner { method public void setResourceLostListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.Tuner.OnResourceLostListener); method public void shareFrontendFromTuner(@NonNull android.media.tv.tuner.Tuner); method public int tune(@NonNull android.media.tv.tuner.frontend.FrontendSettings); + method public int unlinkFrontendToCiCam(int); method public void updateResourcePriority(int, int); field public static final int INVALID_AV_SYNC_ID = -1; // 0xffffffff field public static final int INVALID_FILTER_ID = -1; // 0xffffffff field public static final long INVALID_FILTER_ID_64BIT = -1L; // 0xffffffffffffffffL + field public static final int INVALID_LTS_ID = -1; // 0xffffffff field public static final int INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = -1; // 0xffffffff field public static final int INVALID_STREAM_ID = 65535; // 0xffff field public static final long INVALID_TIMESTAMP = -1L; // 0xffffffffffffffffL diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 27a49a75c6d00..867eab017a284 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -121,6 +121,16 @@ public class Tuner implements AutoCloseable { public static final int INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = android.hardware.tv.tuner.V1_1.Constants.Constant .INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM; + /** + * Invalid local transport stream id. + * + *
Returned by {@link #linkFrontendToCiCam(int)} when the requested failed + * or the hal implementation does not support the operation. + * + * @see #linkFrontendToCiCam(int) + */ + public static final int INVALID_LTS_ID = + android.hardware.tv.tuner.V1_1.Constants.Constant.INVALID_LTS_ID; /** * Invalid 64-bit filter ID. */ @@ -475,7 +485,9 @@ public class Tuner implements AutoCloseable { private native Integer nativeGetAvSyncHwId(Filter filter); private native Long nativeGetAvSyncTime(int avSyncId); private native int nativeConnectCiCam(int ciCamId); + private native int nativeLinkCiCam(int ciCamId); private native int nativeDisconnectCiCam(); + private native int nativeUnlinkCiCam(int ciCamId); private native FrontendInfo nativeGetFrontendInfo(int id); private native Filter nativeOpenFilter(int type, int subType, long bufferSize); private native TimeFilter nativeOpenTimeFilter(); @@ -797,6 +809,33 @@ public class Tuner implements AutoCloseable { return RESULT_UNAVAILABLE; } + /** + * Link Conditional Access Modules (CAM) Frontend to support Common Interface (CI) by-pass mode. + * + *
It is used by the client to link CI-CAM to a Frontend. CI by-pass mode requires that + * the CICAM also receives the TS concurrently from the frontend when the Demux is receiving + * the TS directly from the frontend. + * + *
Use {@link #unlinkFrontendToCicam(int)} to disconnect. + * + *
This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause + * no-op and return {@link INVALID_LTS_ID}. Use {@link TunerVersionChecker.getTunerVersion()} to + * check the version. + * + * @param ciCamId specify CI-CAM Id to link. + * @return Local transport stream id when connection is successfully established. Failed + * operation returns {@link INVALID_LTS_ID}. + */ + public int linkFrontendToCiCam(int ciCamId) { + if (TunerVersionChecker.checkHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1, + "linkFrontendToCiCam")) { + if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) { + return nativeLinkCiCam(ciCamId); + } + } + return INVALID_LTS_ID; + } + /** * Disconnects Conditional Access Modules (CAM) * @@ -812,6 +851,28 @@ public class Tuner implements AutoCloseable { return RESULT_UNAVAILABLE; } + /** + * Unlink Conditional Access Modules (CAM) Frontend. + * + *
It is used by the client to unlink CI-CAM to a Frontend. + * + *
This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause
+ * no-op. Use {@link TunerVersionChecker.getTunerVersion()} to check the version.
+ *
+ * @param ciCamId specify CI-CAM Id to unlink.
+ * @return result status of the operation.
+ */
+ @Result
+ public int unlinkFrontendToCiCam(int ciCamId) {
+ if (TunerVersionChecker.checkHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_1_1,
+ "unlinkFrontendToCiCam")) {
+ if (checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND)) {
+ return nativeUnlinkCiCam(ciCamId);
+ }
+ }
+ return RESULT_UNAVAILABLE;
+ }
+
/**
* Gets the frontend information.
*
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index e0afe29de7e69..05ea512ea970b 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -1034,6 +1034,7 @@ jobject JTuner::openFrontendById(int id) {
return NULL;
}
mFe = fe;
+ mFe_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe);
mFeId = id;
if (mDemux != NULL) {
mDemux->setFrontendDataSource(mFeId);
@@ -1493,6 +1494,27 @@ int JTuner::connectCiCam(jint id) {
return (int) r;
}
+int JTuner::linkCiCam(int id) {
+ if (mFe_1_1 == NULL) {
+ ALOGE("frontend 1.1 is not initialized");
+ return (int)Constant::INVALID_LTS_ID;
+ }
+
+ Result res;
+ uint32_t ltsId;
+ mFe_1_1->linkCiCam(static_cast