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:
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
153
media/java/android/media/tv/tuner/TunerVersionChecker.java
Normal file
153
media/java/android/media/tv/tuner/TunerVersionChecker.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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,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 },
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user