diff options
| author | 2020-10-14 00:32:06 +0000 | |
|---|---|---|
| committer | 2020-10-14 00:32:06 +0000 | |
| commit | 4a11c4408f280ab99877042692d1250d2ac49be3 (patch) | |
| tree | cb4da202a96bbfcee3c03c95a22efb6b2f9b450b | |
| parent | 37f1f0e95f1426c0b230b9bb9b4ecc4fb68bfa92 (diff) | |
| parent | 7b3b578d50d624cc4cf736a8bc2b2a5da6c2e846 (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.bp | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 13 | ||||
| -rw-r--r-- | api/test-current.txt | 15 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/Tuner.java | 46 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/TunerVersionChecker.java | 153 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/filter/Filter.java | 15 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java | 22 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/filter/TsRecordEvent.java | 13 | ||||
| -rw-r--r-- | media/jni/Android.bp | 1 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 127 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.h | 22 | ||||
| -rw-r--r-- | non-updatable-api/system-current.txt | 13 |
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(); } |