Make Tuner java framework and Tuner JNI adopt Tuner HAL 1.1
Please see the Tuner HAL 1.1 design doc here:
go/android_tuner_hal_1.1
In this CL, the Tuner framework and JNI start to use the
@1.1::IFilter.getId64Bit() API and @1.1::IFilterCallback.
Currently the 1.1 IFilterCallback passes two new 1.1 record filter
events: DemuxFilterTsRecordEvent and DemuxFilterMmtpRecordEvent.
Tuner Framework exposes a new API: getId64Bit() which calls
the native getId64Bit. Also Filter java will be using long id
instead of the previous int id.
The FilterCallback interface remains unchanged but the TsRecordEvent
and the MmtpRecordEvent carry more variables to pass the extra info
in version 1.1.
When the HAL implementation is on version 1.0 and calls
onFilterEvent, it still uses the extended TsRecordEvent and
MmtpRecordEvent but the 1.1 field will be set to invalid.
Related HAL interface can be referred here:
hardware/interfaces/tv/tuner/1.1
Test: make -j44 dist, atest android.media.tv.tuner.cts
Bug: b/159058358
Bug: 158816517
Change-Id: I8d52c0b2031eed9c54909e5bf233137c56eeb78f
diff --git a/Android.bp b/Android.bp
index afdd832..1f17932 100644
--- a/Android.bp
+++ b/Android.bp
@@ -482,6 +482,7 @@
"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 1404f7e..dff171e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5052,6 +5052,8 @@
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
@@ -5204,6 +5206,7 @@
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 +5307,8 @@
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 +5471,7 @@
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/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index e148d0e..0f14134 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -98,15 +98,34 @@
* 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})
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index f0015b7..2f2d8f7 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 @@
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 @@
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 @@
private native int nativeClose();
// Called by JNI
- private Filter(int id) {
+ private Filter(long id) {
mId = id;
}
@@ -269,6 +270,16 @@
}
/**
+ * 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 466fa3e..7060bd72 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 @@
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 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 7a14bb8..258e2f2 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 @@
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 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 4e27c8e..724965d 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -142,6 +142,7 @@
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 5daf8b0..1c23eaf 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::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::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::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 @@
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 @@
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 @@
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();
}
+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,7 @@
/////////////// Tuner ///////////////////////
sp<ITuner> JTuner::mTuner;
+sp<::android::hardware::tv::tuner::V1_1::ITuner> JTuner::mTuner_1_1;
JTuner::JTuner(JNIEnv *env, jobject thiz)
: mClass(NULL) {
@@ -949,14 +971,20 @@
}
sp<ITuner> JTuner::getTunerService() {
- if (mTuner == nullptr) {
- mTuner = ITuner::getService();
+ if (mTuner == nullptr && mTuner_1_1 == nullptr) {
+ mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService();
- if (mTuner == nullptr) {
- ALOGW("Failed to get tuner service.");
- }
- }
- return mTuner;
+ 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 {
+ mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
+ }
+ }
+ return mTuner;
}
jobject JTuner::getFrontendIds() {
@@ -1504,6 +1532,7 @@
}
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 +1544,23 @@
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 +2495,7 @@
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 =
@@ -3071,6 +3106,36 @@
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();
@@ -3735,6 +3800,8 @@
{ "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 c4deeaf..0b145b4 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_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::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 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 @@
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(
@@ -229,6 +238,7 @@
jclass mClass;
jweak mObject;
static sp<ITuner> mTuner;
+ static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1;
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 515c273..80e9043 100644
--- a/non-updatable-api/system-current.txt
+++ b/non-updatable-api/system-current.txt
@@ -4992,6 +4992,8 @@
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
@@ -5144,6 +5146,7 @@
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 +5247,8 @@
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 +5411,7 @@
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();
}