Merge "Get offset of recorded keyframe from MTP table"
diff --git a/tv/tuner/1.1/default/Filter.cpp b/tv/tuner/1.1/default/Filter.cpp
index 4c37729..139e98a 100644
--- a/tv/tuner/1.1/default/Filter.cpp
+++ b/tv/tuner/1.1/default/Filter.cpp
@@ -209,6 +209,7 @@
 
     if (mSharedAvMemHandle.getNativeHandle() != nullptr) {
         _hidl_cb(Result::SUCCESS, mSharedAvMemHandle, BUFFER_SIZE_16M);
+        mUsingSharedAvMem = true;
         return Void();
     }
 
@@ -225,6 +226,7 @@
     ::close(av_fd);
 
     _hidl_cb(Result::SUCCESS, mSharedAvMemHandle, BUFFER_SIZE_16M);
+    mUsingSharedAvMem = true;
     return Void();
 }
 
@@ -678,11 +680,10 @@
     recordEvent = {
             .byteNumber = mRecordFilterOutput.size(),
     };
-    V1_1::DemuxFilterRecordEventExt recordEventExt;
+    V1_1::DemuxFilterTsRecordEventExt recordEventExt;
     recordEventExt = {
             .pts = (mPts == 0) ? time(NULL) * 900000 : mPts,
             .firstMbInSlice = 0,     // random address
-            .mpuSequenceNumber = 1,  // random sequence number
     };
 
     int size;
diff --git a/tv/tuner/1.1/default/Filter.h b/tv/tuner/1.1/default/Filter.h
index 522db35..a7b3fd2 100644
--- a/tv/tuner/1.1/default/Filter.h
+++ b/tv/tuner/1.1/default/Filter.h
@@ -227,7 +227,7 @@
 
     // Shared A/V memory handle
     hidl_handle mSharedAvMemHandle;
-    bool mUsingSharedAvMem = true;
+    bool mUsingSharedAvMem = false;
     uint32_t mSharedAvMemOffset = 0;
 
     uint32_t mAudioStreamType;
diff --git a/tv/tuner/1.1/types.hal b/tv/tuner/1.1/types.hal
index 3ff795a..006e597 100644
--- a/tv/tuner/1.1/types.hal
+++ b/tv/tuner/1.1/types.hal
@@ -20,6 +20,7 @@
 import @1.0::DemuxFilterMmtpRecordEvent;
 import @1.0::DemuxFilterTsRecordEvent;
 import @1.0::DemuxScIndex;
+import @1.0::DemuxTsIndex;
 import @1.0::FrontendIsdbs3Rolloff;
 import @1.0::FrontendAtsc3Bandwidth;
 import @1.0::FrontendAtsc3Modulation;
@@ -51,11 +52,11 @@
 @export
 enum Constant : @1.0::Constant {
     /**
-     * An invalid mpuSequenceNumber in DemuxFilterRecordEventExt.
+     * An invalid mpuSequenceNumber.
      */
     INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM = 0xFFFFFFFF,
     /**
-     * An invalid first macroblock address in DemuxFilterRecordEventExt.
+     * An invalid first macroblock address.
      */
     INVALID_FIRST_MACROBLOCK_IN_SLICE = 0xFFFFFFFF,
     /**
@@ -103,9 +104,25 @@
 };
 
 /**
- * Extended Demux Filter Record Event.
+ * Extended Demux Filter TS Record Event.
  */
-struct DemuxFilterRecordEventExt {
+struct DemuxFilterTsRecordEventExt {
+    /**
+     * 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.
+     */
+    uint64_t pts;
+
+    /**
+     * Specifies the address of the first macroblock in the slice defined in ITU-T Rec. H.264.
+     */
+    uint32_t firstMbInSlice;
+};
+
+/**
+ * Extended Demux Filter MMTP Record Event.
+ */
+struct DemuxFilterMmtpRecordEventExt {
     /**
      * 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.
@@ -121,6 +138,11 @@
      * Specifies the address of the first macroblock in the slice defined in ITU-T Rec. H.264.
      */
     uint32_t firstMbInSlice;
+
+    /**
+     * TS index mask.
+     */
+    bitfield<@1.1::DemuxTsIndex> tsIndexMask;
 };
 
 /**
@@ -130,13 +152,13 @@
     safe_union Event {
         /**
          * No extended record filter Event. This is used by the tsRecord or mmtpRecord filter event
-         * that does not contain the DemuxFilterRecordEventExt information.
+         * that does not contain the DemuxFilterTs/MmtpRecordEventExt information.
          */
         Monostate noinit;
 
-        DemuxFilterRecordEventExt tsRecord;
+        DemuxFilterTsRecordEventExt tsRecord;
 
-        DemuxFilterRecordEventExt mmtpRecord;
+        DemuxFilterMmtpRecordEventExt mmtpRecord;
 
         ScramblingStatus scramblingStatus;
     };
@@ -828,3 +850,27 @@
      */
     SP_SLICE = 1 << 8,
 };
+
+@export
+enum DemuxTsIndex : @1.0::DemuxTsIndex {
+    /**
+     * Index the address of MMT Packet Table(MPT).
+     */
+    MPT_INDEX_MPT = 1 << 16,
+    /**
+     * Index the address of Video.
+     */
+    MPT_INDEX_VIDEO = 1 << 17,
+    /**
+     * Index the address of Audio.
+     */
+    MPT_INDEX_AUDIO = 1 << 18,
+    /**
+     * Index to indicate this is a target of timestamp extraction for video.
+     */
+    MPT_INDEX_TIMESTAMP_TARGET_VIDEO = 1 << 19,
+    /**
+     * Index to indicate this is a target of timestamp extraction for audio.
+     */
+    MPT_INDEX_TIMESTAMP_TARGET_AUDIO = 1 << 20,
+};
diff --git a/tv/tuner/1.1/vts/functional/FilterTests.cpp b/tv/tuner/1.1/vts/functional/FilterTests.cpp
index f114a66..d2535e5 100644
--- a/tv/tuner/1.1/vts/functional/FilterTests.cpp
+++ b/tv/tuner/1.1/vts/functional/FilterTests.cpp
@@ -64,9 +64,9 @@
                 break;
             case DemuxFilterEventExt::Event::hidl_discriminator::mmtpRecord:
                 ALOGD("[vts] Extended MMTP record filter event, pts=%" PRIu64
-                      ", firstMbInSlice=%d, mpuSequenceNumber=%d",
+                      ", firstMbInSlice=%d, mpuSequenceNumber=%d, tsIndexMask=%d",
                       eventExt.mmtpRecord().pts, eventExt.mmtpRecord().firstMbInSlice,
-                      eventExt.mmtpRecord().mpuSequenceNumber);
+                      eventExt.mmtpRecord().mpuSequenceNumber, eventExt.mmtpRecord().tsIndexMask);
                 break;
             case DemuxFilterEventExt::Event::hidl_discriminator::scramblingStatus:
                 mScramblingStatusEvent++;