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

Commit 412abda7 authored by James Dong's avatar James Dong Committed by Android (Google) Code Review
Browse files

Merge "Use meta data in the media recording framework"

parents c2daea21 8480835b
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;