Add end of recording summary track info

Change-Id: I2fcf589e70db225776ef7c8d0f28505ceb824c45
related-to-bug: 1854633
diff --git a/include/media/mediarecorder.h b/include/media/mediarecorder.h
index 18a3c6a..089577d 100644
--- a/include/media/mediarecorder.h
+++ b/include/media/mediarecorder.h
@@ -159,6 +159,10 @@
     MEDIA_RECORDER_TRACK_INFO_LIST_START           = 1000,
     MEDIA_RECORDER_TRACK_INFO_COMPLETION_STATUS    = 1000,
     MEDIA_RECORDER_TRACK_INFO_PROGRESS_IN_TIME     = 1001,
+    MEDIA_RECORDER_TRACK_INFO_TYPE                 = 1002,
+    MEDIA_RECORDER_TRACK_INFO_DURATION_MS          = 1003,
+    MEDIA_RECORDER_TRACK_INFO_MAX_CHUNK_DUR_MS     = 1004,
+    MEDIA_RECORDER_TRACK_INFO_ENCODED_FRAMES       = 1005,
     MEDIA_RECORDER_TRACK_INFO_LIST_END             = 2000,
 };
 
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index fafac0e..e3c7eb9 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -84,6 +84,7 @@
     bool mIsMPEG4;
     int32_t mTrackId;
     int64_t mTrackDurationUs;
+    int64_t mMaxChunkDurationUs;
 
     // For realtime applications, we need to adjust the media clock
     // for video track based on the audio media clock
@@ -211,6 +212,7 @@
     void addOneStscTableEntry(size_t chunkId, size_t sampleId);
     void addOneStssTableEntry(size_t sampleId);
     void addOneSttsTableEntry(size_t sampleCount, int64_t durationUs);
+    void sendTrackSummary(bool hasMultipleTracks);
 
     // Write the boxes
     void writeStcoBox(bool use32BitOffset);
@@ -1359,6 +1361,7 @@
     mPrevMediaTimeAdjustSample = 0;
     mTotalDriftTimeToAdjustUs = 0;
     mPrevTotalAccumDriftTimeUs = 0;
+    mMaxChunkDurationUs = 0;
 
     pthread_create(&mThread, &attr, ThreadWrapper, this);
     pthread_attr_destroy(&attr);
@@ -1796,6 +1799,7 @@
 status_t MPEG4Writer::Track::threadEntry() {
     int32_t count = 0;
     const int64_t interleaveDurationUs = mOwner->interleaveDuration();
+    const bool hasMultipleTracks = (mOwner->numTracks() > 1);
     int64_t chunkTimestampUs = 0;
     int32_t nChunks = 0;
     int32_t nZeroLengthFrames = 0;
@@ -2028,7 +2032,7 @@
             }
             trackProgressStatus(timestampUs);
         }
-        if (mOwner->numTracks() == 1) {
+        if (!hasMultipleTracks) {
             off64_t offset = mIsAvc? mOwner->addLengthPrefixedSample_l(copy)
                                  : mOwner->addSample_l(copy);
             if (mChunkOffsets.empty()) {
@@ -2047,7 +2051,11 @@
             if (chunkTimestampUs == 0) {
                 chunkTimestampUs = timestampUs;
             } else {
-                if (timestampUs - chunkTimestampUs > interleaveDurationUs) {
+                int64_t chunkDurationUs = timestampUs - chunkTimestampUs;
+                if (chunkDurationUs > interleaveDurationUs) {
+                    if (chunkDurationUs > mMaxChunkDurationUs) {
+                        mMaxChunkDurationUs = chunkDurationUs;
+                    }
                     ++nChunks;
                     if (nChunks == 1 ||  // First chunk
                         (--(mStscTableEntries.end()))->samplesPerChunk !=
@@ -2070,7 +2078,7 @@
     mOwner->trackProgressStatus(mTrackId, -1, err);
 
     // Last chunk
-    if (mOwner->numTracks() == 1) {
+    if (!hasMultipleTracks) {
         addOneStscTableEntry(1, mNumSamples);
     } else if (!mChunkSamples.empty()) {
         addOneStscTableEntry(++nChunks, mChunkSamples.size());
@@ -2097,6 +2105,9 @@
 
     mTrackDurationUs += lastDurationUs;
     mReachedEOS = true;
+
+    sendTrackSummary(hasMultipleTracks);
+
     LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s",
             count, nZeroLengthFrames, mNumSamples, mIsAudio? "audio": "video");
     if (mIsAudio) {
@@ -2109,6 +2120,28 @@
     return err;
 }
 
+void MPEG4Writer::Track::sendTrackSummary(bool hasMultipleTracks) {
+    int trackNum = (mTrackId << 28);
+
+    mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
+                    trackNum | MEDIA_RECORDER_TRACK_INFO_TYPE,
+                    mIsAudio? 0: 1);
+
+    mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
+                    trackNum | MEDIA_RECORDER_TRACK_INFO_DURATION_MS,
+                    mTrackDurationUs / 1000);
+
+    mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
+                    trackNum | MEDIA_RECORDER_TRACK_INFO_ENCODED_FRAMES,
+                    mNumSamples);
+
+    if (hasMultipleTracks) {
+        mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO,
+                    trackNum | MEDIA_RECORDER_TRACK_INFO_MAX_CHUNK_DUR_MS,
+                    mMaxChunkDurationUs / 1000);
+    }
+}
+
 void MPEG4Writer::Track::trackProgressStatus(int64_t timeUs, status_t err) {
     LOGV("trackProgressStatus: %lld us", timeUs);
     if (mTrackEveryTimeDurationUs > 0 &&