am f3847e87: Merge "DO NOT MERGE" into gingerbread
* commit 'f3847e875eb1c58094a2d159a2a6f3f0b381d77a': DO NOT MERGE
This commit is contained in:
@@ -109,6 +109,7 @@ private:
|
|||||||
kAvoidMemcopyInputRecordingFrames = 2048,
|
kAvoidMemcopyInputRecordingFrames = 2048,
|
||||||
kRequiresLargerEncoderOutputBuffer = 4096,
|
kRequiresLargerEncoderOutputBuffer = 4096,
|
||||||
kOutputBuffersAreUnreadable = 8192,
|
kOutputBuffersAreUnreadable = 8192,
|
||||||
|
kStoreMetaDataInInputVideoBuffers = 16384,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BufferInfo {
|
struct BufferInfo {
|
||||||
|
|||||||
@@ -412,6 +412,13 @@ uint32_t OMXCodec::getComponentQuirks(
|
|||||||
quirks |= kOutputBuffersAreUnreadable;
|
quirks |= kOutputBuffersAreUnreadable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!strncmp(componentName, "OMX.SEC.", 8) && isEncoder) {
|
||||||
|
// These input buffers contain meta data (for instance,
|
||||||
|
// information helps locate the actual YUV data, or
|
||||||
|
// the physical address of the YUV data).
|
||||||
|
quirks |= kStoreMetaDataInInputVideoBuffers;
|
||||||
|
}
|
||||||
|
|
||||||
return quirks;
|
return quirks;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1695,7 +1702,15 @@ void OMXCodec::on_message(const omx_message &msg) {
|
|||||||
"an EMPTY_BUFFER_DONE.", buffer);
|
"an EMPTY_BUFFER_DONE.", buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
buffers->editItemAt(i).mOwnedByComponent = false;
|
{
|
||||||
|
BufferInfo *info = &buffers->editItemAt(i);
|
||||||
|
info->mOwnedByComponent = false;
|
||||||
|
if (info->mMediaBuffer != NULL) {
|
||||||
|
// It is time to release the media buffers storing meta data
|
||||||
|
info->mMediaBuffer->release();
|
||||||
|
info->mMediaBuffer = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mPortStatus[kPortIndexInput] == DISABLING) {
|
if (mPortStatus[kPortIndexInput] == DISABLING) {
|
||||||
CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
|
CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
|
||||||
@@ -2202,6 +2217,7 @@ status_t OMXCodec::freeBuffersOnPort(
|
|||||||
CHECK_EQ(info->mMediaBuffer->refcount(), 0);
|
CHECK_EQ(info->mMediaBuffer->refcount(), 0);
|
||||||
|
|
||||||
info->mMediaBuffer->release();
|
info->mMediaBuffer->release();
|
||||||
|
info->mMediaBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffers->removeAt(i);
|
buffers->removeAt(i);
|
||||||
@@ -2434,11 +2450,19 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not release the media buffer if it stores meta data
|
||||||
|
// instead of YUV data. The release is delayed until
|
||||||
|
// EMPTY_BUFFER_DONE callback is received.
|
||||||
|
bool releaseBuffer = true;
|
||||||
if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
|
if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
|
||||||
CHECK(mOMXLivesLocally && offset == 0);
|
CHECK(mOMXLivesLocally && offset == 0);
|
||||||
OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
|
OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
|
||||||
header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset();
|
header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset();
|
||||||
} else {
|
} else {
|
||||||
|
if (mQuirks & kStoreMetaDataInInputVideoBuffers) {
|
||||||
|
releaseBuffer = false;
|
||||||
|
info->mMediaBuffer = srcBuffer;
|
||||||
|
}
|
||||||
memcpy((uint8_t *)info->mData + offset,
|
memcpy((uint8_t *)info->mData + offset,
|
||||||
(const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
|
(const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
|
||||||
srcBuffer->range_length());
|
srcBuffer->range_length());
|
||||||
@@ -2454,8 +2478,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
|
|||||||
|
|
||||||
offset += srcBuffer->range_length();
|
offset += srcBuffer->range_length();
|
||||||
|
|
||||||
srcBuffer->release();
|
if (releaseBuffer) {
|
||||||
srcBuffer = NULL;
|
srcBuffer->release();
|
||||||
|
srcBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
++n;
|
++n;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user