summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Amy Zhang <amyjojo@google.com> 2020-10-14 00:32:06 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-10-14 00:32:06 +0000
commit4a11c4408f280ab99877042692d1250d2ac49be3 (patch)
treecb4da202a96bbfcee3c03c95a22efb6b2f9b450b
parent37f1f0e95f1426c0b230b9bb9b4ecc4fb68bfa92 (diff)
parent7b3b578d50d624cc4cf736a8bc2b2a5da6c2e846 (diff)
Merge changes from topic "filterid"
* changes: Add TunerVersionChecker to expose the Tuner HAL implementation version Make Tuner java framework and Tuner JNI adopt Tuner HAL 1.1
-rw-r--r--Android.bp1
-rw-r--r--api/system-current.txt13
-rw-r--r--api/test-current.txt15
-rw-r--r--media/java/android/media/tv/tuner/Tuner.java46
-rw-r--r--media/java/android/media/tv/tuner/TunerVersionChecker.java153
-rw-r--r--media/java/android/media/tv/tuner/filter/Filter.java15
-rw-r--r--media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java22
-rw-r--r--media/java/android/media/tv/tuner/filter/TsRecordEvent.java13
-rw-r--r--media/jni/Android.bp1
-rw-r--r--media/jni/android_media_tv_Tuner.cpp127
-rw-r--r--media/jni/android_media_tv_Tuner.h22
-rw-r--r--non-updatable-api/system-current.txt13
12 files changed, 407 insertions, 34 deletions
diff --git a/Android.bp b/Android.bp
index afdd832718bb..1f17932be895 100644
--- a/Android.bp
+++ b/Android.bp
@@ -482,6 +482,7 @@ java_library {
"android.hardware.thermal-V2.0-java",
"android.hardware.tv.input-V1.0-java-constants",
"android.hardware.tv.tuner-V1.0-java-constants",
+ "android.hardware.tv.tuner-V1.1-java-constants",
"android.hardware.usb-V1.0-java-constants",
"android.hardware.usb-V1.1-java-constants",
"android.hardware.usb-V1.2-java-constants",
diff --git a/api/system-current.txt b/api/system-current.txt
index 868d090027f7..2e53058f96d2 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5052,6 +5052,8 @@ package android.media.tv.tuner {
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_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
field public static final int INVALID_TS_PID = 65535; // 0xffff
@@ -5071,6 +5073,13 @@ package android.media.tv.tuner {
method public void onResourceLost(@NonNull android.media.tv.tuner.Tuner);
}
+ public final class TunerVersionChecker {
+ method public static int getTunerVersion();
+ field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000
+ field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001
+ field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0
+ }
+
}
package android.media.tv.tuner.dvr {
@@ -5204,6 +5213,7 @@ package android.media.tv.tuner.filter {
method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
method public int flush();
method public int getId();
+ method public long getId64Bit();
method public int read(@NonNull byte[], long, long);
method public int setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
method public int start();
@@ -5304,6 +5314,8 @@ package android.media.tv.tuner.filter {
public class MmtpRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
method public long getDataLength();
+ method public int getMpuSequenceNumber();
+ method public long getPts();
method public int getScHevcIndexMask();
}
@@ -5466,6 +5478,7 @@ package android.media.tv.tuner.filter {
public class TsRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
method public long getDataLength();
method public int getPacketId();
+ method public long getPts();
method public int getScIndexMask();
method public int getTsIndexMask();
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 18320cd21078..9069eea8d93c 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2130,6 +2130,21 @@ package android.media.tv {
}
+package android.media.tv.tuner {
+
+ public final class TunerVersionChecker {
+ method public static int getMajorVersion(int);
+ method public static int getMinorVersion(int);
+ method public static int getTunerVersion();
+ method public static boolean isHigherOrEqualVersionTo(int);
+ method public static boolean supportTunerVersion(int);
+ field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000
+ field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001
+ field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0
+ }
+
+}
+
package android.metrics {
public class LogMaker {
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index e148d0e29b5a..27a49a75c6d0 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -98,15 +98,34 @@ public class Tuner implements AutoCloseable {
* Invalid timestamp.
*
* <p>Returned by {@link android.media.tv.tuner.filter.TimeFilter#getSourceTime()},
- * {@link android.media.tv.tuner.filter.TimeFilter#getTimeStamp()}, or
- * {@link Tuner#getAvSyncTime(int)} when the requested timestamp is not available.
+ * {@link android.media.tv.tuner.filter.TimeFilter#getTimeStamp()},
+ * {@link Tuner#getAvSyncTime(int)} or {@link TsRecordEvent#getPts()} and
+ * {@link MmtpRecordEvent#getPts()} when the requested timestamp is not available.
*
* @see android.media.tv.tuner.filter.TimeFilter#getSourceTime()
* @see android.media.tv.tuner.filter.TimeFilter#getTimeStamp()
* @see Tuner#getAvSyncTime(int)
+ * @see android.media.tv.tuner.filter.TsRecordEvent#getPts()
+ * @see android.media.tv.tuner.filter.MmtpRecordEvent#getPts()
*/
- public static final long INVALID_TIMESTAMP = -1L;
-
+ public static final long INVALID_TIMESTAMP =
+ android.hardware.tv.tuner.V1_1.Constants.Constant64Bit.INVALID_PRESENTATION_TIME_STAMP;
+ /**
+ * Invalid mpu sequence number in MmtpRecordEvent.
+ *
+ * <p>Returned by {@link MmtpRecordEvent#getMpuSequenceNumber()} when the requested sequence
+ * number is not available.
+ *
+ * @see android.media.tv.tuner.filter.MmtpRecordEvent#getMpuSequenceNumber()
+ */
+ 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 64-bit filter ID.
+ */
+ public static final long INVALID_FILTER_ID_64BIT =
+ android.hardware.tv.tuner.V1_1.Constants.Constant64Bit.INVALID_FILTER_ID_64BIT;
/** @hide */
@IntDef(prefix = "SCAN_TYPE_", value = {SCAN_TYPE_UNDEFINED, SCAN_TYPE_AUTO, SCAN_TYPE_BLIND})
@@ -204,6 +223,7 @@ public class Tuner implements AutoCloseable {
private final Context mContext;
private final TunerResourceManager mTunerResourceManager;
private final int mClientId;
+ private static int sTunerVersion = TunerVersionChecker.TUNER_VERSION_UNKNOWN;
private Frontend mFrontend;
private EventHandler mHandler;
@@ -255,6 +275,14 @@ public class Tuner implements AutoCloseable {
public Tuner(@NonNull Context context, @Nullable String tvInputSessionId,
@TvInputService.PriorityHintUseCaseType int useCase) {
nativeSetup();
+ sTunerVersion = nativeGetTunerVersion();
+ if (sTunerVersion == TunerVersionChecker.TUNER_VERSION_UNKNOWN) {
+ Log.e(TAG, "Unknown Tuner version!");
+ } else {
+ Log.d(TAG, "Current Tuner version is "
+ + TunerVersionChecker.getMajorVersion(sTunerVersion) + "."
+ + TunerVersionChecker.getMinorVersion(sTunerVersion) + ".");
+ }
mContext = context;
mTunerResourceManager = (TunerResourceManager)
context.getSystemService(Context.TV_TUNER_RESOURCE_MGR_SERVICE);
@@ -295,6 +323,11 @@ public class Tuner implements AutoCloseable {
}
/** @hide */
+ public static int getTunerVersion() {
+ return sTunerVersion;
+ }
+
+ /** @hide */
public List<Integer> getFrontendIds() {
return nativeGetFrontendIds();
}
@@ -419,6 +452,11 @@ public class Tuner implements AutoCloseable {
/**
* Native method to get all frontend IDs.
*/
+ private native int nativeGetTunerVersion();
+
+ /**
+ * Native method to get all frontend IDs.
+ */
private native List<Integer> nativeGetFrontendIds();
/**
diff --git a/media/java/android/media/tv/tuner/TunerVersionChecker.java b/media/java/android/media/tv/tuner/TunerVersionChecker.java
new file mode 100644
index 000000000000..739f87dd711d
--- /dev/null
+++ b/media/java/android/media/tv/tuner/TunerVersionChecker.java
@@ -0,0 +1,153 @@
+/*
+ * 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.
+ */
+
+package android.media.tv.tuner;
+
+import android.annotation.IntDef;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
+import android.util.Log;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Utility class to check the currently running Tuner Hal implementation version.
+ *
+ * APIs that are not supported by the HAL implementation version would be no-op.
+ *
+ * @hide
+ */
+@TestApi
+@SystemApi
+public final class TunerVersionChecker {
+ private static final String TAG = "TunerVersionChecker";
+
+ private TunerVersionChecker() {}
+
+ /** @hide */
+ @IntDef(prefix = "TUNER_VERSION_", value = {TUNER_VERSION_UNKNOWN, TUNER_VERSION_1_0,
+ TUNER_VERSION_1_1})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface TunerVersion {}
+ /**
+ * Unknown Tuner version.
+ */
+ public static final int TUNER_VERSION_UNKNOWN = 0;
+ /**
+ * Tuner version 1.0.
+ */
+ public static final int TUNER_VERSION_1_0 = (1 << 16);
+ /**
+ * Tuner version 1.1.
+ */
+ public static final int TUNER_VERSION_1_1 = ((1 << 16) | 1);
+
+ /**
+ * Get the current running Tuner version.
+ *
+ * @return Tuner version.
+ */
+ @TunerVersion
+ public static int getTunerVersion() {
+ return Tuner.getTunerVersion();
+ }
+
+ /**
+ * Check if the current running Tuner version supports the given version.
+ *
+ * <p>Note that we treat different major versions as unsupported among each other. If any
+ * feature could be supported across major versions, please use
+ * {@link #isHigherOrEqualVersionTo(int)} to check.
+ *
+ * @param version the version to support.
+ *
+ * @return true if the current version is under the same major version as the given version
+ * and has higher or the same minor version as the given version.
+ * @hide
+ */
+ @TestApi
+ public static boolean supportTunerVersion(@TunerVersion int version) {
+ int currentVersion = Tuner.getTunerVersion();
+ return isHigherOrEqualVersionTo(version)
+ && (getMajorVersion(version) == getMajorVersion(currentVersion));
+ }
+
+ /**
+ * Check if the current running Tuner version is higher than or equal to a given version.
+ *
+ * @param version the version to compare.
+ *
+ * @return true if the current version is higher or equal to the support version.
+ * @hide
+ */
+ @TestApi
+ public static boolean isHigherOrEqualVersionTo(@TunerVersion int version) {
+ int currentVersion = Tuner.getTunerVersion();
+ return currentVersion >= version;
+ }
+
+ /**
+ * Get the major version from a version number.
+ *
+ * @param version the version to be checked.
+ *
+ * @return the major version number.
+ * @hide
+ */
+ @TestApi
+ public static int getMajorVersion(@TunerVersion int version) {
+ return ((version & 0xFFFF0000) >>> 16);
+ }
+
+ /**
+ * Get the major version from a version number.
+ *
+ * @param version the version to be checked.
+ *
+ * @return the minor version number.
+ * @hide
+ */
+ @TestApi
+ public static int getMinorVersion(@TunerVersion int version) {
+ return (version & 0xFFFF);
+ }
+
+ /** @hide */
+ public static boolean checkHigherOrEqualVersionTo(
+ @TunerVersion int version, String methodName) {
+ if (!TunerVersionChecker.isHigherOrEqualVersionTo(version)) {
+ Log.e(TAG, "Current Tuner version "
+ + TunerVersionChecker.getMajorVersion(Tuner.getTunerVersion()) + "."
+ + TunerVersionChecker.getMinorVersion(Tuner.getTunerVersion())
+ + " does not support " + methodName + ".");
+ return false;
+ }
+ return true;
+ }
+
+ /** @hide */
+ public static boolean checkSupportVersion(@TunerVersion int version, String methodName) {
+ if (!TunerVersionChecker.supportTunerVersion(version)) {
+ Log.e(TAG, "Current Tuner version "
+ + TunerVersionChecker.getMajorVersion(Tuner.getTunerVersion()) + "."
+ + TunerVersionChecker.getMinorVersion(Tuner.getTunerVersion())
+ + " does not support " + methodName + ".");
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index f0015b723edb..2f2d8f74c908 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -185,7 +185,7 @@ public class Filter implements AutoCloseable {
private long mNativeContext;
private FilterCallback mCallback;
private Executor mExecutor;
- private final int mId;
+ private final long mId;
private int mMainType;
private int mSubtype;
private Filter mSource;
@@ -196,6 +196,7 @@ public class Filter implements AutoCloseable {
private native int nativeConfigureFilter(
int type, int subType, FilterConfiguration settings);
private native int nativeGetId();
+ private native long nativeGetId64Bit();
private native int nativeSetDataSource(Filter source);
private native int nativeStartFilter();
private native int nativeStopFilter();
@@ -204,7 +205,7 @@ public class Filter implements AutoCloseable {
private native int nativeClose();
// Called by JNI
- private Filter(int id) {
+ private Filter(long id) {
mId = id;
}
@@ -269,6 +270,16 @@ public class Filter implements AutoCloseable {
}
/**
+ * Gets the 64-bit filter Id.
+ */
+ public long getId64Bit() {
+ synchronized (mLock) {
+ TunerUtils.checkResourceState(TAG, mIsClosed);
+ return nativeGetId64Bit();
+ }
+ }
+
+ /**
* Sets the filter's data source.
*
* A filter uses demux as data source by default. If the data was packetized
diff --git a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
index 466fa3ecb6e7..7060bd722d57 100644
--- a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
@@ -29,11 +29,15 @@ import android.media.tv.tuner.filter.RecordSettings.ScHevcIndex;
public class MmtpRecordEvent extends FilterEvent {
private final int mScHevcIndexMask;
private final long mDataLength;
+ private final int mMpuSequenceNumber;
+ private final long mPts;
// This constructor is used by JNI code only
- private MmtpRecordEvent(int scHevcIndexMask, long dataLength) {
+ private MmtpRecordEvent(int scHevcIndexMask, long dataLength, int mpuSequenceNumber, long pts) {
mScHevcIndexMask = scHevcIndexMask;
mDataLength = dataLength;
+ mMpuSequenceNumber = mpuSequenceNumber;
+ mPts = pts;
}
/**
@@ -51,4 +55,20 @@ public class MmtpRecordEvent extends FilterEvent {
public long getDataLength() {
return mDataLength;
}
+
+ /**
+ * Get the MPU sequence number of the filtered data.
+ */
+ public int getMpuSequenceNumber() {
+ return mMpuSequenceNumber;
+ }
+
+ /**
+ * Get the Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz
+ * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and
+ * the SC_HEVC.
+ */
+ public long getPts() {
+ return mPts;
+ }
}
diff --git a/media/java/android/media/tv/tuner/filter/TsRecordEvent.java b/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
index 7a14bb863700..258e2f22427c 100644
--- a/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/TsRecordEvent.java
@@ -32,13 +32,15 @@ public class TsRecordEvent extends FilterEvent {
private final int mTsIndexMask;
private final int mScIndexMask;
private final long mDataLength;
+ private final long mPts;
// This constructor is used by JNI code only
- private TsRecordEvent(int pid, int tsIndexMask, int scIndexMask, long dataLength) {
+ private TsRecordEvent(int pid, int tsIndexMask, int scIndexMask, long dataLength, long pts) {
mPid = pid;
mTsIndexMask = tsIndexMask;
mScIndexMask = scIndexMask;
mDataLength = dataLength;
+ mPts = pts;
}
/**
@@ -72,4 +74,13 @@ public class TsRecordEvent extends FilterEvent {
public long getDataLength() {
return mDataLength;
}
+
+ /**
+ * Gets the Presentation Time Stamp(PTS) for the audio or video frame. It is based on 90KHz
+ * and has the same format as the PTS in ISO/IEC 13818-1. It is used only for the SC and
+ * the SC_HEVC.
+ */
+ public long getPts() {
+ return mPts;
+ }
}
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 4e27c8e2723d..724965dac947 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -142,6 +142,7 @@ cc_library_shared {
shared_libs: [
"android.hardware.graphics.bufferqueue@2.0",
"android.hardware.tv.tuner@1.0",
+ "android.hardware.tv.tuner@1.1",
"libandroid_runtime",
"libcutils",
"libfmq",
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 5daf8b0f88f8..e0afe29de7e6 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -22,7 +22,6 @@
#include "android_runtime/AndroidRuntime.h"
#include <android-base/logging.h>
-#include <android/hardware/tv/tuner/1.0/ITuner.h>
#include <media/stagefright/foundation/ADebug.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedLocalRef.h>
@@ -34,7 +33,6 @@ using ::android::hardware::Void;
using ::android::hardware::hidl_bitfield;
using ::android::hardware::hidl_vec;
using ::android::hardware::tv::tuner::V1_0::AudioExtraMetaData;
-using ::android::hardware::tv::tuner::V1_0::Constant;
using ::android::hardware::tv::tuner::V1_0::DataFormat;
using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
@@ -129,12 +127,13 @@ using ::android::hardware::tv::tuner::V1_0::FrontendStatus;
using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo;
using ::android::hardware::tv::tuner::V1_0::FrontendStatusType;
using ::android::hardware::tv::tuner::V1_0::FrontendType;
-using ::android::hardware::tv::tuner::V1_0::ITuner;
using ::android::hardware::tv::tuner::V1_0::LnbPosition;
using ::android::hardware::tv::tuner::V1_0::LnbTone;
using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
using ::android::hardware::tv::tuner::V1_0::PlaybackSettings;
using ::android::hardware::tv::tuner::V1_0::RecordSettings;
+using ::android::hardware::tv::tuner::V1_1::Constant;
+using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
struct fields_t {
jfieldID tunerContext;
@@ -505,10 +504,11 @@ jobjectArray FilterCallback::getPesEvent(
}
jobjectArray FilterCallback::getTsRecordEvent(
- jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+ jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events,
+ const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
JNIEnv *env = AndroidRuntime::getJNIEnv();
jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/TsRecordEvent");
- jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIJ)V");
+ jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIJJ)V");
for (int i = 0; i < events.size(); i++) {
auto event = events[i];
@@ -537,28 +537,39 @@ jobjectArray FilterCallback::getTsRecordEvent(
jlong byteNumber = static_cast<jlong>(tsRecordEvent.byteNumber);
+ jlong pts = (eventsExt.size() > i) ? static_cast<jlong>(eventsExt[i].tsRecord().pts)
+ : static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
+
jobject obj =
- env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber);
+ env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber, pts);
env->SetObjectArrayElement(arr, i, obj);
}
return arr;
}
jobjectArray FilterCallback::getMmtpRecordEvent(
- jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events) {
+ jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events,
+ const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
JNIEnv *env = AndroidRuntime::getJNIEnv();
jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/MmtpRecordEvent");
- jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IJ)V");
+ jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IJIJ)V");
for (int i = 0; i < events.size(); i++) {
auto event = events[i];
+
DemuxFilterMmtpRecordEvent mmtpRecordEvent = event.mmtpRecord();
jint scHevcIndexMask = static_cast<jint>(mmtpRecordEvent.scHevcIndexMask);
jlong byteNumber = static_cast<jlong>(mmtpRecordEvent.byteNumber);
+ jint mpuSequenceNumber = (eventsExt.size() > i)
+ ? static_cast<jint>(eventsExt[i].mmtpRecord().mpuSequenceNumber)
+ : static_cast<jint>(Constant::INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM);
+ jlong pts = (eventsExt.size() > i) ? static_cast<jlong>(eventsExt[i].mmtpRecord().pts)
+ : static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
jobject obj =
- env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber);
+ env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
+ mpuSequenceNumber, pts);
env->SetObjectArrayElement(arr, i, obj);
}
return arr;
@@ -627,12 +638,14 @@ jobjectArray FilterCallback::getTemiEvent(
return arr;
}
-Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent) {
- ALOGD("FilterCallback::onFilterEvent");
+Return<void> FilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
+ const DemuxFilterEventExt& filterEventExt) {
+ ALOGD("FilterCallback::onFilterEvent_1_1");
JNIEnv *env = AndroidRuntime::getJNIEnv();
std::vector<DemuxFilterEvent::Event> events = filterEvent.events;
+ std::vector<DemuxFilterEventExt::Event> eventsExt = filterEventExt.events;
jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/FilterEvent");
jobjectArray array = env->NewObjectArray(events.size(), eventClazz, NULL);
@@ -652,11 +665,11 @@ Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent)
break;
}
case DemuxFilterEvent::Event::hidl_discriminator::tsRecord: {
- array = getTsRecordEvent(array, events);
+ array = getTsRecordEvent(array, events, eventsExt);
break;
}
case DemuxFilterEvent::Event::hidl_discriminator::mmtpRecord: {
- array = getMmtpRecordEvent(array, events);
+ array = getMmtpRecordEvent(array, events, eventsExt);
break;
}
case DemuxFilterEvent::Event::hidl_discriminator::download: {
@@ -683,6 +696,14 @@ Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent)
return Void();
}
+Return<void> FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent) {
+ ALOGD("FilterCallback::onFilterEvent");
+ std::vector<DemuxFilterEventExt::Event> emptyEventsExt;
+ DemuxFilterEventExt emptyFilterEventExt {
+ .events = emptyEventsExt,
+ };
+ return onFilterEvent_1_1(filterEvent, emptyFilterEventExt);
+}
Return<void> FilterCallback::onFilterStatus(const DemuxFilterStatus status) {
ALOGD("FilterCallback::onFilterStatus");
@@ -919,6 +940,8 @@ Return<void> FrontendCallback::onScanMessage(FrontendScanMessageType type, const
/////////////// Tuner ///////////////////////
sp<ITuner> JTuner::mTuner;
+sp<::android::hardware::tv::tuner::V1_1::ITuner> JTuner::mTuner_1_1;
+int JTuner::mTunerVersion = 0;
JTuner::JTuner(JNIEnv *env, jobject thiz)
: mClass(NULL) {
@@ -950,13 +973,28 @@ JTuner::~JTuner() {
sp<ITuner> JTuner::getTunerService() {
if (mTuner == nullptr) {
- mTuner = ITuner::getService();
+ mTunerVersion = 0;
+ mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService();
+
+ if (mTuner_1_1 == nullptr) {
+ ALOGW("Failed to get tuner 1.1 service.");
+ mTuner = ITuner::getService();
+ if (mTuner == nullptr) {
+ ALOGW("Failed to get tuner 1.0 service.");
+ } else {
+ mTunerVersion = 1 << 16;
+ }
+ } else {
+ mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
+ mTunerVersion = ((1 << 16) | 1);
+ }
+ }
+ return mTuner;
+}
- if (mTuner == nullptr) {
- ALOGW("Failed to get tuner service.");
- }
- }
- return mTuner;
+jint JTuner::getTunerVersion() {
+ ALOGD("JTuner::getTunerVersion()");
+ return (jint) mTunerVersion;
}
jobject JTuner::getFrontendIds() {
@@ -1504,6 +1542,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) {
}
sp<IFilter> iFilterSp;
+ sp<::android::hardware::tv::tuner::V1_1::IFilter> iFilterSp_1_1;
sp<FilterCallback> callback = new FilterCallback();
Result res;
mDemux->openFilter(type, bufferSize, callback,
@@ -1515,17 +1554,23 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) {
ALOGD("Failed to open filter, type = %d", type.mainType);
return NULL;
}
- int fId;
+ uint64_t fId;
iFilterSp->getId([&](Result, uint32_t filterId) {
fId = filterId;
});
+ iFilterSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(iFilterSp);
+ if (iFilterSp_1_1 != NULL) {
+ iFilterSp_1_1->getId64Bit([&](Result, uint64_t filterId64Bit) {
+ fId = filterId64Bit;
+ });
+ }
JNIEnv *env = AndroidRuntime::getJNIEnv();
jobject filterObj =
env->NewObject(
env->FindClass("android/media/tv/tuner/filter/Filter"),
gFields.filterInitID,
- (jint) fId);
+ (jlong) fId);
sp<Filter> filterSp = new Filter(iFilterSp, filterObj);
filterSp->incStrong(filterObj);
@@ -2460,7 +2505,7 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) {
jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter");
gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J");
gFields.filterInitID =
- env->GetMethodID(filterClazz, "<init>", "(I)V");
+ env->GetMethodID(filterClazz, "<init>", "(J)V");
gFields.onFilterStatusID =
env->GetMethodID(filterClazz, "onFilterStatus", "(I)V");
gFields.onFilterEventID =
@@ -2501,6 +2546,11 @@ static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) {
setTuner(env,thiz, tuner);
}
+static jint android_media_tv_Tuner_native_get_tuner_version(JNIEnv *env, jobject thiz) {
+ sp<JTuner> tuner = getTuner(env, thiz);
+ return tuner->getTunerVersion();
+}
+
static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz) {
sp<JTuner> tuner = getTuner(env, thiz);
return tuner->getFrontendIds();
@@ -3071,6 +3121,36 @@ static jint android_media_tv_Tuner_get_filter_id(JNIEnv* env, jobject filter) {
return (jint) id;
}
+static jlong android_media_tv_Tuner_get_filter_64bit_id(JNIEnv* env, jobject filter) {
+ sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
+ if (iFilterSp == NULL) {
+ ALOGD("Failed to get filter ID: filter not found");
+ return static_cast<jlong>(
+ ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
+ }
+
+ sp<::android::hardware::tv::tuner::V1_1::IFilter> iFilterSp_1_1;
+ iFilterSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(iFilterSp);
+ Result res;
+ uint64_t id;
+
+ if (iFilterSp_1_1 != NULL) {
+ iFilterSp_1_1->getId64Bit(
+ [&](Result r, uint64_t filterId64Bit) {
+ res = r;
+ id = filterId64Bit;
+ });
+ } else {
+ ALOGW("getId64Bit is not supported with the current HAL implementation.");
+ return static_cast<jlong>(
+ ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
+ }
+
+ return (res == Result::SUCCESS) ?
+ static_cast<jlong>(id) : static_cast<jlong>(
+ ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
+}
+
static jint android_media_tv_Tuner_set_filter_data_source(
JNIEnv* env, jobject filter, jobject srcFilter) {
sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
@@ -3684,6 +3764,7 @@ static void android_media_tv_Tuner_media_event_finalize(JNIEnv* env, jobject med
static const JNINativeMethod gTunerMethods[] = {
{ "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init },
{ "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup },
+ { "nativeGetTunerVersion", "()I", (void *)android_media_tv_Tuner_native_get_tuner_version },
{ "nativeGetFrontendIds", "()Ljava/util/List;",
(void *)android_media_tv_Tuner_get_frontend_ids },
{ "nativeOpenFrontendByHandle", "(I)Landroid/media/tv/tuner/Tuner$Frontend;",
@@ -3735,6 +3816,8 @@ static const JNINativeMethod gFilterMethods[] = {
{ "nativeConfigureFilter", "(IILandroid/media/tv/tuner/filter/FilterConfiguration;)I",
(void *)android_media_tv_Tuner_configure_filter },
{ "nativeGetId", "()I", (void *)android_media_tv_Tuner_get_filter_id },
+ { "nativeGetId64Bit", "()J",
+ (void *)android_media_tv_Tuner_get_filter_64bit_id },
{ "nativeSetDataSource", "(Landroid/media/tv/tuner/filter/Filter;)I",
(void *)android_media_tv_Tuner_set_filter_data_source },
{ "nativeStartFilter", "()I", (void *)android_media_tv_Tuner_start_filter },
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index c4deeaf887bb..d7dc600a166b 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -17,7 +17,11 @@
#ifndef _ANDROID_MEDIA_TV_TUNER_H_
#define _ANDROID_MEDIA_TV_TUNER_H_
-#include <android/hardware/tv/tuner/1.0/ITuner.h>
+#include <android/hardware/tv/tuner/1.1/IFilter.h>
+#include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
+#include <android/hardware/tv/tuner/1.1/ITuner.h>
+#include <android/hardware/tv/tuner/1.1/types.h>
+
#include <C2BlockInternal.h>
#include <C2HandleIonInternal.h>
#include <C2ParamDef.h>
@@ -38,6 +42,7 @@ using ::android::hardware::hidl_handle;
using ::android::hardware::hidl_vec;
using ::android::hardware::kSynchronizedReadWrite;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
+using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
using ::android::hardware::tv::tuner::V1_0::DemuxPid;
@@ -54,7 +59,7 @@ using ::android::hardware::tv::tuner::V1_0::IDescrambler;
using ::android::hardware::tv::tuner::V1_0::IDvr;
using ::android::hardware::tv::tuner::V1_0::IDvrCallback;
using ::android::hardware::tv::tuner::V1_0::IFilter;
-using ::android::hardware::tv::tuner::V1_0::IFilterCallback;
+using ::android::hardware::tv::tuner::V1_1::IFilterCallback;
using ::android::hardware::tv::tuner::V1_0::IFrontend;
using ::android::hardware::tv::tuner::V1_0::IFrontendCallback;
using ::android::hardware::tv::tuner::V1_0::ILnb;
@@ -147,6 +152,8 @@ struct Filter : public RefBase {
struct FilterCallback : public IFilterCallback {
~FilterCallback();
+ virtual Return<void> onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
+ const DemuxFilterEventExt& filterEventExt);
virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
virtual Return<void> onFilterStatus(const DemuxFilterStatus status);
@@ -161,9 +168,11 @@ private:
jobjectArray getPesEvent(
jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
jobjectArray getTsRecordEvent(
- jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
+ jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>&events,
+ const std::vector<DemuxFilterEventExt::Event>& eventsExt);
jobjectArray getMmtpRecordEvent(
- jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
+ jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>&events,
+ const std::vector<DemuxFilterEventExt::Event>& eventsExt);
jobjectArray getDownloadEvent(
jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
jobjectArray getIpPayloadEvent(
@@ -194,6 +203,7 @@ struct TimeFilter : public RefBase {
struct JTuner : public RefBase {
JTuner(JNIEnv *env, jobject thiz);
sp<ITuner> getTunerService();
+ int getTunerVersion();
jobject getAvSyncHwId(sp<Filter> filter);
jobject getAvSyncTime(jint id);
int connectCiCam(jint id);
@@ -229,6 +239,10 @@ private:
jclass mClass;
jweak mObject;
static sp<ITuner> mTuner;
+ static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1;
+ // An integer that carries the Tuner version. The high 16 bits are the major version number
+ // while the low 16 bits are the minor version. Default value is unknown version 0.
+ static int mTunerVersion;
hidl_vec<FrontendId> mFeIds;
sp<IFrontend> mFe;
int mFeId;
diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt
index c69169ec13a5..75e038be1a2b 100644
--- a/non-updatable-api/system-current.txt
+++ b/non-updatable-api/system-current.txt
@@ -4992,6 +4992,8 @@ package android.media.tv.tuner {
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_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
field public static final int INVALID_TS_PID = 65535; // 0xffff
@@ -5011,6 +5013,13 @@ package android.media.tv.tuner {
method public void onResourceLost(@NonNull android.media.tv.tuner.Tuner);
}
+ public final class TunerVersionChecker {
+ method public static int getTunerVersion();
+ field public static final int TUNER_VERSION_1_0 = 65536; // 0x10000
+ field public static final int TUNER_VERSION_1_1 = 65537; // 0x10001
+ field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0
+ }
+
}
package android.media.tv.tuner.dvr {
@@ -5144,6 +5153,7 @@ package android.media.tv.tuner.filter {
method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
method public int flush();
method public int getId();
+ method public long getId64Bit();
method public int read(@NonNull byte[], long, long);
method public int setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
method public int start();
@@ -5244,6 +5254,8 @@ package android.media.tv.tuner.filter {
public class MmtpRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
method public long getDataLength();
+ method public int getMpuSequenceNumber();
+ method public long getPts();
method public int getScHevcIndexMask();
}
@@ -5406,6 +5418,7 @@ package android.media.tv.tuner.filter {
public class TsRecordEvent extends android.media.tv.tuner.filter.FilterEvent {
method public long getDataLength();
method public int getPacketId();
+ method public long getPts();
method public int getScIndexMask();
method public int getTsIndexMask();
}