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
This commit is contained in:
Amy Zhang
2020-10-14 00:32:06 +00:00
committed by Android (Google) Code Review
12 changed files with 407 additions and 34 deletions

View File

@@ -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",

View File

@@ -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();
}

View File

@@ -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 {

View File

@@ -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);
@@ -294,6 +322,11 @@ public class Tuner implements AutoCloseable {
mTunerResourceManager.setFrontendInfoList(infos);
}
/** @hide */
public static int getTunerVersion() {
return sTunerVersion;
}
/** @hide */
public List<Integer> getFrontendIds() {
return nativeGetFrontendIds();
@@ -416,6 +449,11 @@ public class Tuner implements AutoCloseable {
*/
private native void nativeSetup();
/**
* Native method to get all frontend IDs.
*/
private native int nativeGetTunerVersion();
/**
* Native method to get all frontend IDs.
*/

View File

@@ -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;
}
}

View File

@@ -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.
*

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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",

View File

@@ -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 == 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 {
mTunerVersion = 1 << 16;
}
} else {
mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
mTunerVersion = ((1 << 16) | 1);
}
}
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 },

View File

@@ -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;

View File

@@ -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();
}