Get the offset of recorded keyframe from MMTP Packet Table in
MmtpRecordEvent

Test: atest android.media.tv.tuner.cts
Bug: 158816517
Change-Id: Ic8bafaad2cfe868bfb6a6ede1fd77de49c3d04cb
diff --git a/api/system-current.txt b/api/system-current.txt
index 115b4d8..c7e4131 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -5395,6 +5395,7 @@
     method public int getMpuSequenceNumber();
     method public long getPts();
     method public int getScHevcIndexMask();
+    method public int getTsIndexMask();
   }
 
   public class PesEvent extends android.media.tv.tuner.filter.FilterEvent {
@@ -5423,6 +5424,11 @@
     field public static final int INDEX_TYPE_NONE = 0; // 0x0
     field public static final int INDEX_TYPE_SC = 1; // 0x1
     field public static final int INDEX_TYPE_SC_HEVC = 2; // 0x2
+    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
+    field public static final int MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 524288; // 0x80000
+    field public static final int MPT_INDEX_VIDEO = 131072; // 0x20000
     field public static final int SC_HEVC_INDEX_AUD = 2; // 0x2
     field public static final int SC_HEVC_INDEX_SLICE_BLA_N_LP = 16; // 0x10
     field public static final int SC_HEVC_INDEX_SLICE_BLA_W_RADL = 8; // 0x8
@@ -5446,6 +5452,7 @@
     field public static final int TS_INDEX_CHANGE_TO_ODD_SCRAMBLED = 16; // 0x10
     field public static final int TS_INDEX_DISCONTINUITY_INDICATOR = 32; // 0x20
     field public static final int TS_INDEX_FIRST_PACKET = 1; // 0x1
+    field public static final int TS_INDEX_INVALID = 0; // 0x0
     field public static final int TS_INDEX_OPCR_FLAG = 512; // 0x200
     field public static final int TS_INDEX_PAYLOAD_UNIT_START_INDICATOR = 2; // 0x2
     field public static final int TS_INDEX_PCR_FLAG = 256; // 0x100
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 1e3a2c0..6bc3028 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -5335,6 +5335,7 @@
     method public int getMpuSequenceNumber();
     method public long getPts();
     method public int getScHevcIndexMask();
+    method public int getTsIndexMask();
   }
 
   public class PesEvent extends android.media.tv.tuner.filter.FilterEvent {
@@ -5363,6 +5364,11 @@
     field public static final int INDEX_TYPE_NONE = 0; // 0x0
     field public static final int INDEX_TYPE_SC = 1; // 0x1
     field public static final int INDEX_TYPE_SC_HEVC = 2; // 0x2
+    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
+    field public static final int MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 524288; // 0x80000
+    field public static final int MPT_INDEX_VIDEO = 131072; // 0x20000
     field public static final int SC_HEVC_INDEX_AUD = 2; // 0x2
     field public static final int SC_HEVC_INDEX_SLICE_BLA_N_LP = 16; // 0x10
     field public static final int SC_HEVC_INDEX_SLICE_BLA_W_RADL = 8; // 0x8
@@ -5386,6 +5392,7 @@
     field public static final int TS_INDEX_CHANGE_TO_ODD_SCRAMBLED = 16; // 0x10
     field public static final int TS_INDEX_DISCONTINUITY_INDICATOR = 32; // 0x20
     field public static final int TS_INDEX_FIRST_PACKET = 1; // 0x1
+    field public static final int TS_INDEX_INVALID = 0; // 0x0
     field public static final int TS_INDEX_OPCR_FLAG = 512; // 0x200
     field public static final int TS_INDEX_PAYLOAD_UNIT_START_INDICATOR = 2; // 0x2
     field public static final int TS_INDEX_PCR_FLAG = 256; // 0x100
diff --git a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
index f0abce9..1031e33 100644
--- a/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
+++ b/media/java/android/media/tv/tuner/filter/MmtpRecordEvent.java
@@ -21,7 +21,7 @@
 import android.media.tv.tuner.filter.RecordSettings.ScHevcIndex;
 
 /**
- * Filter event sent from {@link Filter} objects with MMTP type.
+ * Filter event sent from {@link Filter} objects with MPEG media Transport Protocol(MMTP) type.
  *
  * @hide
  */
@@ -32,15 +32,17 @@
     private final int mMpuSequenceNumber;
     private final long mPts;
     private final int mFirstMbInSlice;
+    private final int mTsIndexMask;
 
     // This constructor is used by JNI code only
     private MmtpRecordEvent(int scHevcIndexMask, long dataLength, int mpuSequenceNumber, long pts,
-            int firstMbInSlice) {
+            int firstMbInSlice, int tsIndexMask) {
         mScHevcIndexMask = scHevcIndexMask;
         mDataLength = dataLength;
         mMpuSequenceNumber = mpuSequenceNumber;
         mPts = pts;
         mFirstMbInSlice = firstMbInSlice;
+        mTsIndexMask = tsIndexMask;
     }
 
     /**
@@ -95,4 +97,17 @@
     public int getFirstMbInSlice() {
         return mFirstMbInSlice;
     }
+
+    /**
+     * Get the offset of the recorded keyframe from MMT Packet Table.
+     *
+     * <p>This field is only supported in Tuner 1.1 or higher version. Unsupported version will
+     * return {@link RecordSettings.TS_INDEX_INVALID}. Use
+     * {@link android.media.tv.tuner.TunerVersionChecker.getTunerVersion()} to get the
+     * version information.
+     */
+    @RecordSettings.TsIndexMask
+    public int getTsIndexMask() {
+        return mTsIndexMask;
+    }
 }
diff --git a/media/java/android/media/tv/tuner/filter/RecordSettings.java b/media/java/android/media/tv/tuner/filter/RecordSettings.java
index a6fd20e..52ce208 100644
--- a/media/java/android/media/tv/tuner/filter/RecordSettings.java
+++ b/media/java/android/media/tv/tuner/filter/RecordSettings.java
@@ -38,17 +38,23 @@
      * @hide
      */
     @IntDef(flag = true,
-            prefix = "TS_INDEX_",
-            value = {TS_INDEX_FIRST_PACKET, TS_INDEX_PAYLOAD_UNIT_START_INDICATOR,
+            value = {TS_INDEX_INVALID, TS_INDEX_FIRST_PACKET, TS_INDEX_PAYLOAD_UNIT_START_INDICATOR,
                     TS_INDEX_CHANGE_TO_NOT_SCRAMBLED, TS_INDEX_CHANGE_TO_EVEN_SCRAMBLED,
                     TS_INDEX_CHANGE_TO_ODD_SCRAMBLED, TS_INDEX_DISCONTINUITY_INDICATOR,
                     TS_INDEX_RANDOM_ACCESS_INDICATOR, TS_INDEX_PRIORITY_INDICATOR,
                     TS_INDEX_PCR_FLAG, TS_INDEX_OPCR_FLAG, TS_INDEX_SPLICING_POINT_FLAG,
-                    TS_INDEX_PRIVATE_DATA, TS_INDEX_ADAPTATION_EXTENSION_FLAG})
+                    TS_INDEX_PRIVATE_DATA, TS_INDEX_ADAPTATION_EXTENSION_FLAG,
+                    MPT_INDEX_MPT, MPT_INDEX_VIDEO, MPT_INDEX_AUDIO,
+                    MPT_INDEX_TIMESTAMP_TARGET_VIDEO,
+                    MPT_INDEX_TIMESTAMP_TARGET_AUDIO})
     @Retention(RetentionPolicy.SOURCE)
     public @interface TsIndexMask {}
 
     /**
+     * Invalid TS index.
+     */
+    public static final int TS_INDEX_INVALID = 0;
+    /**
      * TS index FIRST_PACKET.
      */
     public static final int TS_INDEX_FIRST_PACKET = Constants.DemuxTsIndex.FIRST_PACKET;
@@ -108,6 +114,32 @@
      */
     public static final int TS_INDEX_ADAPTATION_EXTENSION_FLAG =
             Constants.DemuxTsIndex.ADAPTATION_EXTENSION_FLAG;
+    /**
+     * Index the address of MPEG Media Transport Packet Table(MPT).
+     */
+    public static final int MPT_INDEX_MPT =
+            android.hardware.tv.tuner.V1_1.Constants.DemuxTsIndex.MPT_INDEX_MPT;
+    /**
+     * Index the address of Video.
+     */
+    public static final int MPT_INDEX_VIDEO =
+            android.hardware.tv.tuner.V1_1.Constants.DemuxTsIndex.MPT_INDEX_VIDEO;
+    /**
+     * Index the address of Audio.
+     */
+    public static final int MPT_INDEX_AUDIO =
+            android.hardware.tv.tuner.V1_1.Constants.DemuxTsIndex.MPT_INDEX_AUDIO;
+    /**
+     * Index to indicate this is a target of timestamp extraction for video.
+     */
+    public static final int MPT_INDEX_TIMESTAMP_TARGET_VIDEO =
+            android.hardware.tv.tuner.V1_1.Constants.DemuxTsIndex.MPT_INDEX_TIMESTAMP_TARGET_VIDEO;
+    /**
+     * Index to indicate this is a target of timestamp extraction for audio.
+     */
+    public static final int MPT_INDEX_TIMESTAMP_TARGET_AUDIO =
+            android.hardware.tv.tuner.V1_1.Constants.DemuxTsIndex.MPT_INDEX_TIMESTAMP_TARGET_AUDIO;
+
 
     /** @hide */
     @Retention(RetentionPolicy.SOURCE)
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 758f015..9756099 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -639,10 +639,12 @@
         jlong firstMbInSlice = (eventsExt.size() > i)
                 ? static_cast<jint>(eventsExt[i].mmtpRecord().firstMbInSlice)
                 : static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
+        jlong tsIndexMask = (eventsExt.size() > i)
+                ? static_cast<jint>(eventsExt[i].mmtpRecord().tsIndexMask) : 0;
 
         jobject obj =
                 env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
-                        mpuSequenceNumber, pts, firstMbInSlice);
+                        mpuSequenceNumber, pts, firstMbInSlice, tsIndexMask);
         env->SetObjectArrayElement(arr, i, obj);
     }
     return arr;