Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9db798d0 authored by James Dong's avatar James Dong
Browse files

Audio/video initial recording time synchronization

Change-Id: Iac58b63d474fe09c1d36ba6ecde91dafbb7fef9a
parent 1824486e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -68,12 +68,16 @@ private:
    bool mStreamableFile;
    off_t mEstimatedMoovBoxSize;
    uint32_t mInterleaveDurationUs;
    int64_t mStartTimestampUs;
    Mutex mLock;

    List<Track *> mTracks;

    List<off_t> mBoxes;

    void setStartTimestamp(int64_t timeUs);
    int64_t getStartTimestamp();  // Not const

    void lock();
    void unlock();

+34 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ private:
    bool mGotAllCodecSpecificData;

    bool mReachedEOS;
    int64_t mStartTimestampUs;

    static void *ThreadWrapper(void *me);
    void threadEntry();
@@ -152,6 +153,7 @@ status_t MPEG4Writer::start() {
        return UNKNOWN_ERROR;
    }

    mStartTimestampUs = 0;
    mStreamableFile = true;
    mWriteMoovBoxToMemory = false;
    mMoovBoxBuffer = NULL;
@@ -500,6 +502,21 @@ bool MPEG4Writer::reachedEOS() {
    return allDone;
}

void MPEG4Writer::setStartTimestamp(int64_t timeUs) {
    LOGI("setStartTimestamp: %lld", timeUs);
    Mutex::Autolock autoLock(mLock);
    if (mStartTimestampUs != 0) {
        return;  // Sorry, too late
    }
    mStartTimestampUs = timeUs;
}

int64_t MPEG4Writer::getStartTimestamp() {
    LOGI("getStartTimestamp: %lld", mStartTimestampUs);
    Mutex::Autolock autoLock(mLock);
    return mStartTimestampUs;
}

////////////////////////////////////////////////////////////////////////////////

MPEG4Writer::Track::Track(
@@ -836,6 +853,10 @@ void MPEG4Writer::Track::threadEntry() {

        int64_t timestampUs;
        CHECK(buffer->meta_data()->findInt64(kKeyTime, &timestampUs));
        if (mSampleInfos.empty()) {
            mOwner->setStartTimestamp(timestampUs);
            mStartTimestampUs = (timestampUs - mOwner->getStartTimestamp());
        }

        if (timestampUs > mMaxTimeStampUs) {
            mMaxTimeStampUs = timestampUs;
@@ -1005,6 +1026,19 @@ void MPEG4Writer::Track::writeTrackHeader(int32_t trackID) {
        }
      mOwner->endBox();  // tkhd

      if (mStartTimestampUs != 0) {
        mOwner->beginBox("edts");
          mOwner->writeInt32(0);             // version=0, flags=0
          mOwner->beginBox("elst");
            mOwner->writeInt32(0);           // version=0, flags=0
            mOwner->writeInt32(1);           // a single entry
            mOwner->writeInt32(mStartTimestampUs / 1000);  // edit duration
            mOwner->writeInt32(0);           // edit media starting time
            mOwner->writeInt32(1);           // x1 rate
          mOwner->endBox();
        mOwner->endBox();
      }

      mOwner->beginBox("mdia");

        mOwner->beginBox("mdhd");