Add VVC H266 support
Bug: 219981033
Test: atest android.media.tv.tuner.cts
Change-Id: Id61de4aae87a114577942ec75abfb76368bf9adb
diff --git a/Android.bp b/Android.bp
index 0a14565..79e7e54 100644
--- a/Android.bp
+++ b/Android.bp
@@ -99,7 +99,7 @@
":android.hardware.graphics.common-V3-java-source",
":android.hardware.security.keymint-V2-java-source",
":android.hardware.security.secureclock-V1-java-source",
- ":android.hardware.tv.tuner-V1-java-source",
+ ":android.hardware.tv.tuner-V2-java-source",
":android.security.apc-java-source",
":android.security.authorization-java-source",
":android.security.legacykeystore-java-source",
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index b5b87c1..947fe13 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -7374,6 +7374,7 @@
field public static final int VIDEO_STREAM_TYPE_VC1 = 7; // 0x7
field public static final int VIDEO_STREAM_TYPE_VP8 = 8; // 0x8
field public static final int VIDEO_STREAM_TYPE_VP9 = 9; // 0x9
+ field public static final int VIDEO_STREAM_TYPE_VVC = 13; // 0xd
}
public static class AvSettings.Builder {
@@ -7566,6 +7567,7 @@
field public static final int INDEX_TYPE_SC = 1; // 0x1
field public static final int INDEX_TYPE_SC_AVC = 3; // 0x3
field public static final int INDEX_TYPE_SC_HEVC = 2; // 0x2
+ field public static final int INDEX_TYPE_SC_VVC = 4; // 0x4
field public static final int MPT_INDEX_AUDIO = 262144; // 0x40000
field public static final int MPT_INDEX_MPT = 65536; // 0x10000
field public static final int MPT_INDEX_TIMESTAMP_TARGET_AUDIO = 1048576; // 0x100000
@@ -7588,6 +7590,13 @@
field public static final int SC_INDEX_SEQUENCE = 8; // 0x8
field public static final int SC_INDEX_SI_SLICE = 128; // 0x80
field public static final int SC_INDEX_SP_SLICE = 256; // 0x100
+ field public static final int SC_VVC_INDEX_AUD = 64; // 0x40
+ field public static final int SC_VVC_INDEX_SLICE_CRA = 4; // 0x4
+ field public static final int SC_VVC_INDEX_SLICE_GDR = 8; // 0x8
+ field public static final int SC_VVC_INDEX_SLICE_IDR_N_LP = 2; // 0x2
+ field public static final int SC_VVC_INDEX_SLICE_IDR_W_RADL = 1; // 0x1
+ field public static final int SC_VVC_INDEX_SPS = 32; // 0x20
+ field public static final int SC_VVC_INDEX_VPS = 16; // 0x10
field public static final int TS_INDEX_ADAPTATION_EXTENSION_FLAG = 4096; // 0x1000
field public static final int TS_INDEX_CHANGE_TO_EVEN_SCRAMBLED = 8; // 0x8
field public static final int TS_INDEX_CHANGE_TO_NOT_SCRAMBLED = 4; // 0x4
diff --git a/media/java/android/media/tv/tuner/filter/AvSettings.java b/media/java/android/media/tv/tuner/filter/AvSettings.java
index 15811d2..9144087 100644
--- a/media/java/android/media/tv/tuner/filter/AvSettings.java
+++ b/media/java/android/media/tv/tuner/filter/AvSettings.java
@@ -38,7 +38,8 @@
VIDEO_STREAM_TYPE_MPEG1, VIDEO_STREAM_TYPE_MPEG2,
VIDEO_STREAM_TYPE_MPEG4P2, VIDEO_STREAM_TYPE_AVC, VIDEO_STREAM_TYPE_HEVC,
VIDEO_STREAM_TYPE_VC1, VIDEO_STREAM_TYPE_VP8, VIDEO_STREAM_TYPE_VP9,
- VIDEO_STREAM_TYPE_AV1, VIDEO_STREAM_TYPE_AVS, VIDEO_STREAM_TYPE_AVS2})
+ VIDEO_STREAM_TYPE_AV1, VIDEO_STREAM_TYPE_AVS, VIDEO_STREAM_TYPE_AVS2,
+ VIDEO_STREAM_TYPE_VVC})
@Retention(RetentionPolicy.SOURCE)
public @interface VideoStreamType {}
@@ -76,6 +77,10 @@
*/
public static final int VIDEO_STREAM_TYPE_HEVC = android.hardware.tv.tuner.VideoStreamType.HEVC;
/*
+ * ITU-T Rec. H.266 and ISO/IEC 23090-3
+ */
+ public static final int VIDEO_STREAM_TYPE_VVC = android.hardware.tv.tuner.VideoStreamType.VVC;
+ /*
* Microsoft VC.1
*/
public static final int VIDEO_STREAM_TYPE_VC1 = android.hardware.tv.tuner.VideoStreamType.VC1;
diff --git a/media/java/android/media/tv/tuner/filter/Filter.java b/media/java/android/media/tv/tuner/filter/Filter.java
index d0973f4..8568c43 100644
--- a/media/java/android/media/tv/tuner/filter/Filter.java
+++ b/media/java/android/media/tv/tuner/filter/Filter.java
@@ -349,6 +349,15 @@
+ mMainType + ", filter subtype=" + mSubtype + ". config main type="
+ config.getType() + ", config subtype=" + subType);
}
+ // Tuner only support VVC after tuner 3.0
+ if (s instanceof RecordSettings
+ && ((RecordSettings) s).getScIndexType() == RecordSettings.INDEX_TYPE_SC_VVC
+ && !TunerVersionChecker.isHigherOrEqualVersionTo(
+ TunerVersionChecker.TUNER_VERSION_3_0)) {
+ Log.e(TAG, "Tuner version " + TunerVersionChecker.getTunerVersion()
+ + " does not support VVC");
+ return Tuner.RESULT_UNAVAILABLE;
+ }
return nativeConfigureFilter(config.getType(), subType, config);
}
}
diff --git a/media/java/android/media/tv/tuner/filter/RecordSettings.java b/media/java/android/media/tv/tuner/filter/RecordSettings.java
index b16d9fb..698bbba 100644
--- a/media/java/android/media/tv/tuner/filter/RecordSettings.java
+++ b/media/java/android/media/tv/tuner/filter/RecordSettings.java
@@ -23,8 +23,10 @@
import android.hardware.tv.tuner.DemuxScAvcIndex;
import android.hardware.tv.tuner.DemuxScHevcIndex;
import android.hardware.tv.tuner.DemuxScIndex;
+import android.hardware.tv.tuner.DemuxScVvcIndex;
import android.hardware.tv.tuner.DemuxTsIndex;
import android.media.tv.tuner.TunerUtils;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -138,7 +140,8 @@
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = "INDEX_TYPE_", value =
- {INDEX_TYPE_NONE, INDEX_TYPE_SC, INDEX_TYPE_SC_HEVC, INDEX_TYPE_SC_AVC})
+ {INDEX_TYPE_NONE, INDEX_TYPE_SC, INDEX_TYPE_SC_HEVC, INDEX_TYPE_SC_AVC,
+ INDEX_TYPE_SC_VVC})
public @interface ScIndexType {}
/**
@@ -157,6 +160,10 @@
* Start Code index for AVC.
*/
public static final int INDEX_TYPE_SC_AVC = DemuxRecordScIndexType.SC_AVC;
+ /**
+ * Start Code index for VVC.
+ */
+ public static final int INDEX_TYPE_SC_VVC = DemuxRecordScIndexType.SC_VVC;
/**
* Indexes can be tagged by Start Code in PES (Packetized Elementary Stream)
@@ -253,6 +260,46 @@
public static final int SC_HEVC_INDEX_SLICE_TRAIL_CRA = DemuxScHevcIndex.SLICE_TRAIL_CRA;
/**
+ * Indexes can be tagged by NAL unit group in VVC according to ISO/IEC 23090-3.
+ *
+ * @hide
+ */
+ @IntDef(value = {SC_VVC_INDEX_SLICE_IDR_W_RADL, SC_VVC_INDEX_SLICE_IDR_N_LP,
+ SC_VVC_INDEX_SLICE_CRA, SC_VVC_INDEX_SLICE_GDR, SC_VVC_INDEX_VPS, SC_VVC_INDEX_SPS,
+ SC_VVC_INDEX_AUD})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ScVvcIndex{}
+
+ /**
+ * SC VVC index SLICE_IDR_W_RADL (nal_unit_type=IDR_W_RADL) for random access key frame.
+ */
+ public static final int SC_VVC_INDEX_SLICE_IDR_W_RADL = DemuxScVvcIndex.SLICE_IDR_W_RADL;
+ /**
+ * SC VVC index SLICE_IDR_N_LP (nal_unit_type=IDR_N_LP) for random access key frame.
+ */
+ public static final int SC_VVC_INDEX_SLICE_IDR_N_LP = DemuxScVvcIndex.SLICE_IDR_N_LP;
+ /**
+ * SC VVC index SLICE_CRA (nal_unit_type=CRA_NUT) for random access key frame.
+ */
+ public static final int SC_VVC_INDEX_SLICE_CRA = DemuxScVvcIndex.SLICE_CRA;
+ /**
+ * SC VVC index SLICE_GDR (nal_unit_type=GDR_NUT) for random access point.
+ */
+ public static final int SC_VVC_INDEX_SLICE_GDR = DemuxScVvcIndex.SLICE_GDR;
+ /**
+ * Optional SC VVC index VPS (nal_unit_type=VPS_NUT) for sequence level info.
+ */
+ public static final int SC_VVC_INDEX_VPS = DemuxScVvcIndex.VPS;
+ /**
+ * SC VVC index SPS (nal_unit_type=SPS_NUT) for sequence level info.
+ */
+ public static final int SC_VVC_INDEX_SPS = DemuxScVvcIndex.SPS;
+ /**
+ * SC VVC index AUD (nal_unit_type=AUD_NUT) for AU (frame) boundary.
+ */
+ public static final int SC_VVC_INDEX_AUD = DemuxScVvcIndex.AUD;
+
+ /**
* @hide
*/
@IntDef(prefix = "SC_",
@@ -261,6 +308,11 @@
SC_INDEX_P_FRAME,
SC_INDEX_B_FRAME,
SC_INDEX_SEQUENCE,
+ SC_INDEX_I_SLICE,
+ SC_INDEX_P_SLICE,
+ SC_INDEX_B_SLICE,
+ SC_INDEX_SI_SLICE,
+ SC_INDEX_SP_SLICE,
SC_HEVC_INDEX_SPS,
SC_HEVC_INDEX_AUD,
SC_HEVC_INDEX_SLICE_CE_BLA_W_LP,
@@ -269,6 +321,13 @@
SC_HEVC_INDEX_SLICE_IDR_W_RADL,
SC_HEVC_INDEX_SLICE_IDR_N_LP,
SC_HEVC_INDEX_SLICE_TRAIL_CRA,
+ SC_VVC_INDEX_SLICE_IDR_W_RADL,
+ SC_VVC_INDEX_SLICE_IDR_N_LP,
+ SC_VVC_INDEX_SLICE_CRA,
+ SC_VVC_INDEX_SLICE_GDR,
+ SC_VVC_INDEX_VPS,
+ SC_VVC_INDEX_SPS,
+ SC_VVC_INDEX_AUD
})
@Retention(RetentionPolicy.SOURCE)
public @interface ScIndexMask {}
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index c18edcd..6081fe0 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -655,6 +655,8 @@
sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scAvc>();
// Java uses the values defined by HIDL HAL. Left shift 4 bits.
sc = sc << 4;
+ } else if (mediaEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scVvc) {
+ sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scVvc>();
}
jobject obj = env->NewObject(eventClazz, eventInit, streamId, isPtsPresent, pts, isDtsPresent,
@@ -715,6 +717,8 @@
sc = tsRecordEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scAvc>();
// Java uses the values defined by HIDL HAL. Left shift 4 bits.
sc = sc << 4;
+ } else if (tsRecordEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scVvc) {
+ sc = tsRecordEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scVvc>();
}
jint ts = tsRecordEvent.tsIndexMask;
@@ -3727,6 +3731,8 @@
} else if (scIndexType == DemuxRecordScIndexType::SC_AVC) {
// Java uses the values defined by HIDL HAL. Right shift 4 bits.
filterRecordSettings.scIndexMask.set<DemuxFilterScIndexMask::Tag::scAvc>(scIndexMask >> 4);
+ } else if (scIndexType == DemuxRecordScIndexType::SC_VVC) {
+ filterRecordSettings.scIndexMask.set<DemuxFilterScIndexMask::Tag::scVvc>(scIndexMask);
}
return filterRecordSettings;
}