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
This commit is contained in:
parent
782aa9006b
commit
b13e3042f3
@ -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",
|
||||
|
@ -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
|
||||
@ -5204,6 +5206,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 +5307,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 +5471,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();
|
||||
}
|
||||
|
@ -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})
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
@ -268,6 +269,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.
|
||||
*
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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",
|
||||
|
@ -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,7 @@ Return<void> FrontendCallback::onScanMessage(FrontendScanMessageType type, const
|
||||
/////////////// 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,11 +971,17 @@ JTuner::~JTuner() {
|
||||
}
|
||||
|
||||
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_1_1 == nullptr) {
|
||||
ALOGW("Failed to get tuner 1.1 service.");
|
||||
mTuner = ITuner::getService();
|
||||
if (mTuner == nullptr) {
|
||||
ALOGW("Failed to get tuner service.");
|
||||
ALOGW("Failed to get tuner 1.0 service.");
|
||||
}
|
||||
} else {
|
||||
mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
|
||||
}
|
||||
}
|
||||
return mTuner;
|
||||
@ -1504,6 +1532,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 +1544,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 +2495,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 =
|
||||
@ -3071,6 +3106,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();
|
||||
@ -3735,6 +3800,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 },
|
||||
|
@ -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(
|
||||
@ -229,6 +238,7 @@ private:
|
||||
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;
|
||||
|
@ -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
|
||||
@ -5144,6 +5146,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 +5247,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 +5411,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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user