diff options
author | Shivaprasad Hongal <shongal@codeaurora.org> | 2015-09-18 15:17:14 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-10-29 21:27:02 -0700 |
commit | 2e02d0c9f3eb685b92551312068aa687b2c45be5 (patch) | |
tree | db0aa423abc901f351085828cc2b8aefaec2b493 /media/libstagefright/MPEG4Writer.cpp | |
parent | 340367bd65dddf420a9187ce4b5b4e6bc1ce7ed2 (diff) | |
download | frameworks_av-2e02d0c9f3eb685b92551312068aa687b2c45be5.zip frameworks_av-2e02d0c9f3eb685b92551312068aa687b2c45be5.tar.gz frameworks_av-2e02d0c9f3eb685b92551312068aa687b2c45be5.tar.bz2 |
stagefright: Remove additional deep-copy of encoder buffers
MPEG4Writer makes a copy of encoded buffer to avoid holding on
to the read buffer. This is not needed with MediaCodecSource,
as the encoded-output buffer is already copied to a heap buffer.
This saves a copy and some power.
However, cloning the buffer is still needed for upstream sources
that cannot afford to keep the buffers with writer up until they
are released.
So, pass a hint in buffer's metadata to indicate if it is OK
to delay the release and not copy the buffer
Change-Id: Ib59ac29ebc6ce4afd6fc272688a8260438ab1517
Diffstat (limited to 'media/libstagefright/MPEG4Writer.cpp')
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 94f40b4..cb9df29 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -2284,15 +2284,23 @@ status_t MPEG4Writer::Track::threadEntry() { continue; } - // Make a deep copy of the MediaBuffer and Metadata and release - // the original as soon as we can - MediaBuffer *copy = new MediaBuffer(buffer->range_length()); - memcpy(copy->data(), (uint8_t *)buffer->data() + buffer->range_offset(), - buffer->range_length()); - copy->set_range(0, buffer->range_length()); - meta_data = new MetaData(*buffer->meta_data().get()); - buffer->release(); - buffer = NULL; + MediaBuffer *copy = NULL; + // Check if the upstream source hints it is OK to hold on to the + // buffer without releasing immediately and avoid cloning the buffer + if (AVUtils::get()->canDeferRelease(buffer->meta_data())) { + copy = buffer; + meta_data = new MetaData(*buffer->meta_data().get()); + } else { + // Make a deep copy of the MediaBuffer and Metadata and release + // the original as soon as we can + copy = new MediaBuffer(buffer->range_length()); + memcpy(copy->data(), (uint8_t *)buffer->data() + buffer->range_offset(), + buffer->range_length()); + copy->set_range(0, buffer->range_length()); + meta_data = new MetaData(*buffer->meta_data().get()); + buffer->release(); + buffer = NULL; + } if (mIsAvc || mIsHEVC) StripStartcode(copy); |