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

Commit 5fb8b298 authored by Lajos Molnar's avatar Lajos Molnar
Browse files

stagefright: fix legacy support for CameraSource

- allocate big enough buffers for native metadata source even in
CameraSource mode
- don't check range when using native metadata mode (and converting
it to GrallocSource) as OMX buffer will be smaller than input
- log allocated vs. OMX reported sizes in OMXNodeInstance logs

Bug: 21708032
Change-Id: I7eeffc5116079e5b368f84980e8e7524260aaccf
parent 2f340651
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -777,10 +777,13 @@ status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {

            // If using gralloc or native source input metadata buffers, allocate largest
            // metadata size as we prefer to generate native source metadata, but component
            // may require gralloc source.
            // may require gralloc source. For camera source, allocate at least enough
            // size for native metadata buffers.
            int32_t allottedSize = bufSize;
            if (portIndex == kPortIndexInput && type > 0) {
            if (portIndex == kPortIndexInput && type >= kMetadataBufferTypeGrallocSource) {
                bufSize = max(sizeof(VideoGrallocMetadata), sizeof(VideoNativeMetadata));
            } else if (portIndex == kPortIndexInput && type == kMetadataBufferTypeCameraSource) {
                bufSize = max(bufSize, (int32_t)sizeof(VideoNativeMetadata));
            }

            ALOGV("[%s] Allocating %u buffers of size %d/%d (from %u using %s) on %s port",
+19 −17
Original line number Diff line number Diff line
@@ -683,7 +683,7 @@ status_t OMXNodeInstance::useBuffer(
    }

    CLOG_BUFFER(useBuffer, NEW_BUFFER_FMT(
            *buffer, portIndex, "%u@%p", allottedSize, params->pointer()));
            *buffer, portIndex, "%u(%zu)@%p", allottedSize, params->size(), params->pointer()));
    return OK;
}

@@ -1024,8 +1024,8 @@ status_t OMXNodeInstance::allocateBufferWithBackup(
        bufferSource->addCodecBuffer(header);
    }

    CLOG_BUFFER(allocateBufferWithBackup, NEW_BUFFER_FMT(*buffer, portIndex, "%u@%p :> %p",
            allottedSize, params->pointer(), header->pBuffer));
    CLOG_BUFFER(allocateBufferWithBackup, NEW_BUFFER_FMT(*buffer, portIndex, "%zu@%p :> %u@%p",
            params->size(), params->pointer(), allottedSize, header->pBuffer));

    return OK;
}
@@ -1087,18 +1087,6 @@ status_t OMXNodeInstance::emptyBuffer(
    Mutex::Autolock autoLock(mLock);

    OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer);
    // rangeLength and rangeOffset must be a subset of the allocated data in the buffer.
    // corner case: we permit rangeOffset == end-of-buffer with rangeLength == 0.
    if (rangeOffset > header->nAllocLen
            || rangeLength > header->nAllocLen - rangeOffset) {
        if (fenceFd >= 0) {
            ::close(fenceFd);
        }
        return BAD_VALUE;
    }
    header->nFilledLen = rangeLength;
    header->nOffset = rangeOffset;

    BufferMeta *buffer_meta =
        static_cast<BufferMeta *>(header->pAppPrivate);
    sp<ABuffer> backup = buffer_meta->getBuffer(header, true /* backup */);
@@ -1112,11 +1100,25 @@ status_t OMXNodeInstance::emptyBuffer(
                    == kMetadataBufferTypeANWBuffer) {
        VideoNativeMetadata &backupMeta = *(VideoNativeMetadata *)backup->base();
        VideoGrallocMetadata &codecMeta = *(VideoGrallocMetadata *)codec->base();
        ALOGV("converting ANWB %p to handle %p", backupMeta.pBuffer, backupMeta.pBuffer->handle);
        CLOG_BUFFER(emptyBuffer, "converting ANWB %p to handle %p",
                backupMeta.pBuffer, backupMeta.pBuffer->handle);
        codecMeta.pHandle = backupMeta.pBuffer->handle;
        codecMeta.eType = kMetadataBufferTypeGrallocSource;
        header->nFilledLen = sizeof(codecMeta);
        header->nFilledLen = rangeLength ? sizeof(codecMeta) : 0;
        header->nOffset = 0;
    } else {
        // rangeLength and rangeOffset must be a subset of the allocated data in the buffer.
        // corner case: we permit rangeOffset == end-of-buffer with rangeLength == 0.
        if (rangeOffset > header->nAllocLen
                || rangeLength > header->nAllocLen - rangeOffset) {
            if (fenceFd >= 0) {
                ::close(fenceFd);
            }
            return BAD_VALUE;
        }
        header->nFilledLen = rangeLength;
        header->nOffset = rangeOffset;

        buffer_meta->CopyToOMX(header);
    }