diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2015-10-29 14:01:55 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2015-10-29 14:01:55 -0700 |
commit | 082cd30aad32413c4be1acad2ddb8a29c4065cdf (patch) | |
tree | 20cd261bbe8b1f7583f895b2a583049f559f8254 /media/libstagefright | |
parent | 309c617fde8257519348f12dc65f06168e1fc4f2 (diff) | |
parent | 9be69bd990889cc942a53c22f6f8463f146fd8e7 (diff) | |
download | frameworks_av-082cd30aad32413c4be1acad2ddb8a29c4065cdf.zip frameworks_av-082cd30aad32413c4be1acad2ddb8a29c4065cdf.tar.gz frameworks_av-082cd30aad32413c4be1acad2ddb8a29c4065cdf.tar.bz2 |
Merge "stagefright: Remove additional deep-copy of encoder buffers"
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 26 | ||||
-rw-r--r-- | media/libstagefright/MediaCodecSource.cpp | 2 |
2 files changed, 19 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); diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp index dbd9cb0..925be14 100644 --- a/media/libstagefright/MediaCodecSource.cpp +++ b/media/libstagefright/MediaCodecSource.cpp @@ -759,6 +759,8 @@ void MediaCodecSource::onMessageReceived(const sp<AMessage> &msg) { MediaBuffer *mbuf = new MediaBuffer(outbuf->size()); memcpy(mbuf->data(), outbuf->data(), outbuf->size()); + sp<MetaData> meta = mbuf->meta_data(); + AVUtils::get()->setDeferRelease(meta); if (!(flags & MediaCodec::BUFFER_FLAG_CODECCONFIG)) { if (mIsVideo) { |