diff options
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/ACodec.cpp | 7 | ||||
-rw-r--r-- | media/libstagefright/omx/OMXNodeInstance.cpp | 36 |
2 files changed, 24 insertions, 19 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 71cb194..a57d4cf 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -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", diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 7e92da8..692667f 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -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); } |