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

Commit 8480835b authored by James Dong's avatar James Dong
Browse files

Use meta data in the media recording framework

o This patch allows us to do 720p video recording

Change-Id: I2ea37e80a59630145396b08ebcdc6ee71df53333
parent a3d7a317
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -44,6 +44,9 @@ struct OMXCodec : public MediaSource,
        // can not be fullfilled, Create() returns NULL.
        kSoftwareCodecsOnly      = 8,
        kHardwareCodecsOnly      = 16,

        // Store meta data in video buffers
        kStoreMetaDataInVideoBuffers = 32,
    };
    static sp<MediaSource> Create(
            const sp<IOMX> &omx,
@@ -178,6 +181,8 @@ private:
    List<size_t> mFilledBuffers;
    Condition mBufferFilled;

    bool mIsMetaDataStoredInVideoBuffers;

    OMXCodec(const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks,
             bool isEncoder, const char *mime, const char *componentName,
             const sp<MediaSource> &source,
+12 −2
Original line number Diff line number Diff line
@@ -1035,7 +1035,8 @@ void StagefrightRecorder::clipVideoFrameHeight() {
    }
}

status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource) {
status_t StagefrightRecorder::setupCameraSource(
        sp<CameraSource> *cameraSource) {
    status_t err = OK;
    if ((err = checkVideoEncoderCapabilities()) != OK) {
        return err;
@@ -1051,7 +1052,8 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource)
        *cameraSource = mCameraSourceTimeLapse;
    } else {
        *cameraSource = CameraSource::CreateFromCamera(
                mCamera, mCameraId, videoSize, mFrameRate, mPreviewSurface);
                mCamera, mCameraId, videoSize, mFrameRate,
                mPreviewSurface, true /*storeMetaDataInVideoBuffers*/);
    }
    CHECK(*cameraSource != NULL);

@@ -1067,6 +1069,10 @@ status_t StagefrightRecorder::setupCameraSource(sp<CameraSource> *cameraSource)
    }

    CHECK(mFrameRate != -1);

    mIsMetaDataStoredInVideoBuffers =
        (*cameraSource)->isMetaDataStoredInVideoBuffers();

    return OK;
}

@@ -1135,6 +1141,9 @@ status_t StagefrightRecorder::setupVideoEncoder(

    // Use software codec for time lapse
    uint32_t encoder_flags = (mCaptureTimeLapse) ? OMXCodec::kPreferSoftwareCodecs : 0;
    if (mIsMetaDataStoredInVideoBuffers) {
        encoder_flags |= OMXCodec::kStoreMetaDataInVideoBuffers;
    }
    sp<MediaSource> encoder = OMXCodec::Create(
            client.interface(), enc_meta,
            true /* createEncoder */, cameraSource,
@@ -1412,6 +1421,7 @@ status_t StagefrightRecorder::reset() {
    mCaptureAuxVideo = false;
    mCameraSourceSplitter = NULL;
    mCameraSourceTimeLapse = NULL;
    mIsMetaDataStoredInVideoBuffers = false;
    mEncoderProfiles = MediaProfiles::getInstance();

    mOutputFd = -1;
+1 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ private:
    String8 mParams;
    int mOutputFd, mOutputFdAux;

    bool mIsMetaDataStoredInVideoBuffers;
    MediaProfiles *mEncoderProfiles;

    status_t setupMPEG4Recording(
+32 −3
Original line number Diff line number Diff line
@@ -548,6 +548,10 @@ sp<MediaSource> OMXCodec::Create(
}

status_t OMXCodec::configureCodec(const sp<MetaData> &meta, uint32_t flags) {
    mIsMetaDataStoredInVideoBuffers = false;
    if (flags & kStoreMetaDataInVideoBuffers) {
        mIsMetaDataStoredInVideoBuffers = true;
    }
    if (!(flags & kIgnoreCodecSpecificData)) {
        uint32_t type;
        const void *data;
@@ -1616,6 +1620,14 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
        return err;
    }

    if (mIsMetaDataStoredInVideoBuffers && portIndex == kPortIndexInput) {
        err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE);
        if (err != OK) {
            LOGE("Storing meta data in video buffers is not supported");
            return err;
        }
    }

    CODEC_LOGI("allocating %lu buffers of size %lu on %s port",
            def.nBufferCountActual, def.nBufferSize,
            portIndex == kPortIndexInput ? "input" : "output");
@@ -1896,7 +1908,14 @@ void OMXCodec::on_message(const omx_message &msg) {
                     "an EMPTY_BUFFER_DONE.", buffer);
            }

            buffers->editItemAt(i).mOwnedByComponent = false;
            BufferInfo* info = &buffers->editItemAt(i);
            info->mOwnedByComponent = false;

            // Buffer could not be released until empty buffer done is called.
            if (info->mMediaBuffer != NULL) {
                info->mMediaBuffer->release();
                info->mMediaBuffer = NULL;
            }

            if (mPortStatus[kPortIndexInput] == DISABLING) {
                CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
@@ -2691,11 +2710,19 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
            break;
        }

        bool releaseBuffer = true;
        if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
            CHECK(mOMXLivesLocally && offset == 0);
            OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
            header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset();
            releaseBuffer = false;
            info->mMediaBuffer = srcBuffer;
            // FIXME: we are leaking memory
        } else {
            if (mIsMetaDataStoredInVideoBuffers) {
                releaseBuffer = false;
                info->mMediaBuffer = srcBuffer;
            }
            memcpy((uint8_t *)info->mData + offset,
                    (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
                    srcBuffer->range_length());
@@ -2711,8 +2738,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {

        offset += srcBuffer->range_length();

        if (releaseBuffer) {
            srcBuffer->release();
            srcBuffer = NULL;
        }

        ++n;