diff options
| -rw-r--r-- | core/api/system-current.txt | 3 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/TunerVersionChecker.java | 4 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/dvr/DvrPlayback.java | 31 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/dvr/DvrRecorder.java | 31 | ||||
| -rw-r--r-- | media/jni/Android.bp | 2 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 15 | ||||
| -rw-r--r-- | media/jni/tuner/DvrClient.cpp | 10 | ||||
| -rw-r--r-- | media/jni/tuner/DvrClient.h | 5 |
8 files changed, 100 insertions, 1 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 87960d70fa25..5e1c2347664b 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -7132,6 +7132,7 @@ package android.media.tv.tuner { 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_2_0 = 131072; // 0x20000 + field public static final int TUNER_VERSION_3_0 = 196608; // 0x30000 field public static final int TUNER_VERSION_UNKNOWN = 0; // 0x0 } @@ -7149,6 +7150,7 @@ package android.media.tv.tuner.dvr { method public long read(@NonNull byte[], long, long); method public long seek(long); method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor); + method public int setPlaybackBufferStatusCheckIntervalHint(long); method public int start(); method public int stop(); field public static final int PLAYBACK_STATUS_ALMOST_EMPTY = 2; // 0x2 @@ -7164,6 +7166,7 @@ package android.media.tv.tuner.dvr { method public int detachFilter(@NonNull android.media.tv.tuner.filter.Filter); method public int flush(); method public void setFileDescriptor(@NonNull android.os.ParcelFileDescriptor); + method public int setRecordBufferStatusCheckIntervalHint(long); method public int start(); method public int stop(); method public long write(long); diff --git a/media/java/android/media/tv/tuner/TunerVersionChecker.java b/media/java/android/media/tv/tuner/TunerVersionChecker.java index 3e13bed0afbd..f29a93cbb228 100644 --- a/media/java/android/media/tv/tuner/TunerVersionChecker.java +++ b/media/java/android/media/tv/tuner/TunerVersionChecker.java @@ -59,6 +59,10 @@ public final class TunerVersionChecker { * Tuner version 2.0. */ public static final int TUNER_VERSION_2_0 = (2 << 16); + /** + * Tuner version 3.0. + */ + public static final int TUNER_VERSION_3_0 = (3 << 16); /** * Get the current running Tuner version. diff --git a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java index 11e699981e80..06802409baf7 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java +++ b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java @@ -23,6 +23,7 @@ import android.annotation.SystemApi; import android.media.tv.tuner.Tuner; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.TunerUtils; +import android.media.tv.tuner.TunerVersionChecker; import android.media.tv.tuner.filter.Filter; import android.os.ParcelFileDescriptor; import android.os.Process; @@ -91,6 +92,7 @@ public class DvrPlayback implements AutoCloseable { private native int nativeAttachFilter(Filter filter); private native int nativeDetachFilter(Filter filter); private native int nativeConfigureDvr(DvrSettings settings); + private native int nativeSetStatusCheckIntervalHint(long durationInMs); private native int nativeStartDvr(); private native int nativeStopDvr(); private native int nativeFlushDvr(); @@ -177,6 +179,35 @@ public class DvrPlayback implements AutoCloseable { } /** + * Set playback buffer status check time interval. + * + * This status check time interval will be used by the Dvr to decide how often to evaluate + * data. The default value will be decided by HAL if it’s not set. + * + * <p>This functionality is only available in Tuner version 3.0 and higher and will otherwise + * return a {@link Tuner#RESULT_UNAVAILABLE}. Use {@link TunerVersionChecker#getTunerVersion()} + * to get the version information. + * + * @param durationInMs specifies the duration of the delay in milliseconds. + * + * @return one of the following results: + * {@link Tuner#RESULT_SUCCESS} if succeed, + * {@link Tuner#RESULT_UNAVAILABLE} if Dvr is unavailable or unsupported HAL versions, + * {@link Tuner#RESULT_NOT_INITIALIZED} if Dvr is not initialized, + * {@link Tuner#RESULT_INVALID_STATE} if Dvr is in a wrong state, + * {@link Tuner#RESULT_INVALID_ARGUMENT} if the input parameter is invalid. + */ + @Result + public int setPlaybackBufferStatusCheckIntervalHint(long durationInMs) { + if (!TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_3_0, "Set status check interval hint")) { + // no-op + return Tuner.RESULT_UNAVAILABLE; + } + return nativeSetStatusCheckIntervalHint(durationInMs); + } + + /** * Starts DVR. * * <p>Starts consuming playback data or producing data for recording. diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java index e72026aab992..1a658320a1a9 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java +++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java @@ -22,6 +22,7 @@ import android.annotation.SystemApi; import android.media.tv.tuner.Tuner; import android.media.tv.tuner.Tuner.Result; import android.media.tv.tuner.TunerUtils; +import android.media.tv.tuner.TunerVersionChecker; import android.media.tv.tuner.filter.Filter; import android.os.ParcelFileDescriptor; import android.os.Process; @@ -53,6 +54,7 @@ public class DvrRecorder implements AutoCloseable { private native int nativeAttachFilter(Filter filter); private native int nativeDetachFilter(Filter filter); private native int nativeConfigureDvr(DvrSettings settings); + private native int nativeSetStatusCheckIntervalHint(long durationInMs); private native int nativeStartDvr(); private native int nativeStopDvr(); private native int nativeFlushDvr(); @@ -131,6 +133,35 @@ public class DvrRecorder implements AutoCloseable { } /** + * Set record buffer status check time interval. + * + * This status check time interval will be used by the Dvr to decide how often to evaluate + * data. The default value will be decided by HAL if it’s not set. + * + * <p>This functionality is only available in Tuner version 3.0 and higher and will otherwise + * return a {@link Tuner#RESULT_UNAVAILABLE}. Use {@link TunerVersionChecker#getTunerVersion()} + * to get the version information. + * + * @param durationInMs specifies the duration of the delay in milliseconds. + * + * @return one of the following results: + * {@link Tuner#RESULT_SUCCESS} if succeed, + * {@link Tuner#RESULT_UNAVAILABLE} if Dvr is unavailable or unsupported HAL versions, + * {@link Tuner#RESULT_NOT_INITIALIZED} if Dvr is not initialized, + * {@link Tuner#RESULT_INVALID_STATE} if Dvr is in a wrong state, + * {@link Tuner#RESULT_INVALID_ARGUMENT} if the input parameter is invalid. + */ + @Result + public int setRecordBufferStatusCheckIntervalHint(long durationInMs) { + if (!TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_3_0, "Set status check interval hint")) { + // no-op + return Tuner.RESULT_UNAVAILABLE; + } + return nativeSetStatusCheckIntervalHint(durationInMs); + } + + /** * Starts DVR. * * <p>Starts consuming playback data or producing data for recording. diff --git a/media/jni/Android.bp b/media/jni/Android.bp index 96a3781af3a8..a0304bb5c04b 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -175,7 +175,7 @@ cc_library_shared { shared_libs: [ "android.hardware.graphics.bufferqueue@2.0", - "android.hardware.tv.tuner-V1-ndk", + "android.hardware.tv.tuner-V2-ndk", "libbinder_ndk", "libandroid_runtime", "libcutils", diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 244730b76df2..c18edcd8689b 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -4485,6 +4485,17 @@ static jint android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobje return (jint)result; } +static jint android_media_tv_Tuner_set_status_check_interval_hint(JNIEnv *env, jobject dvr, + jlong durationInMs) { + sp<DvrClient> dvrClient = getDvrClient(env, dvr); + if (dvrClient == nullptr) { + ALOGD("Failed to set status check interval hint: dvr client not found"); + return (int)Result::NOT_INITIALIZED; + } + Result result = dvrClient->setStatusCheckIntervalHint(durationInMs); + return (jint)result; +} + static jint android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) { sp<DvrClient> dvrClient = getDvrClient(env, dvr); if (dvrClient == nullptr) { @@ -4828,6 +4839,8 @@ static const JNINativeMethod gDvrRecorderMethods[] = { (void *)android_media_tv_Tuner_detach_filter }, { "nativeConfigureDvr", "(Landroid/media/tv/tuner/dvr/DvrSettings;)I", (void *)android_media_tv_Tuner_configure_dvr }, + { "nativeSetStatusCheckIntervalHint", "(J)I", + (void *)android_media_tv_Tuner_set_status_check_interval_hint}, { "nativeStartDvr", "()I", (void *)android_media_tv_Tuner_start_dvr }, { "nativeStopDvr", "()I", (void *)android_media_tv_Tuner_stop_dvr }, { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr }, @@ -4844,6 +4857,8 @@ static const JNINativeMethod gDvrPlaybackMethods[] = { (void *)android_media_tv_Tuner_detach_filter}, { "nativeConfigureDvr", "(Landroid/media/tv/tuner/dvr/DvrSettings;)I", (void *)android_media_tv_Tuner_configure_dvr}, + { "nativeSetStatusCheckIntervalHint", "(J)I", + (void *)android_media_tv_Tuner_set_status_check_interval_hint}, { "nativeStartDvr", "()I", (void *)android_media_tv_Tuner_start_dvr}, { "nativeStopDvr", "()I", (void *)android_media_tv_Tuner_stop_dvr}, { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr}, diff --git a/media/jni/tuner/DvrClient.cpp b/media/jni/tuner/DvrClient.cpp index 05683b661716..6e4705251724 100644 --- a/media/jni/tuner/DvrClient.cpp +++ b/media/jni/tuner/DvrClient.cpp @@ -303,7 +303,17 @@ Result DvrClient::close() { return Result::INVALID_STATE; } +Result DvrClient::setStatusCheckIntervalHint(int64_t durationInMs) { + if (mTunerDvr == nullptr) { + return Result::INVALID_STATE; + } + if (durationInMs < 0) { + return Result::INVALID_ARGUMENT; + } + Status s = mTunerDvr->setStatusCheckIntervalHint(durationInMs); + return ClientHelper::getServiceSpecificErrorCode(s); +} /////////////// TunerDvrCallback /////////////////////// TunerDvrCallback::TunerDvrCallback(sp<DvrClientCallback> dvrClientCallback) : mDvrClientCallback(dvrClientCallback) {} diff --git a/media/jni/tuner/DvrClient.h b/media/jni/tuner/DvrClient.h index 61c0325813a4..40ed75b365c3 100644 --- a/media/jni/tuner/DvrClient.h +++ b/media/jni/tuner/DvrClient.h @@ -126,6 +126,11 @@ public: */ Result close(); + /** + * Set status check time interval. + */ + Result setStatusCheckIntervalHint(int64_t durationInMs); + private: /** * An AIDL Tuner Dvr Singleton assigned at the first time the Tuner Client |