diff options
author | Lajos Molnar <lajos@google.com> | 2015-06-25 17:04:09 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2015-06-26 17:09:42 -0700 |
commit | c93a13669ce1b5a9e6527b4c86c9d8f5e92be828 (patch) | |
tree | 5fb41cc9ed232bdf147470e50d6411bfe435f2d4 /media/libstagefright/MediaCodecSource.cpp | |
parent | 064b2bf712788d30928b9a8bafecd0f3308d7aa4 (diff) | |
download | frameworks_av-c93a13669ce1b5a9e6527b4c86c9d8f5e92be828.zip frameworks_av-c93a13669ce1b5a9e6527b4c86c9d8f5e92be828.tar.gz frameworks_av-c93a13669ce1b5a9e6527b4c86c9d8f5e92be828.tar.bz2 |
stagefright: ask for flex-YUV camera buffers for software encoders
Bug: 13222807
Change-Id: I854b73a63cf9239311729598241725d84e8513aa
Diffstat (limited to 'media/libstagefright/MediaCodecSource.cpp')
-rw-r--r-- | media/libstagefright/MediaCodecSource.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp index e089c46..7f9f824 100644 --- a/media/libstagefright/MediaCodecSource.cpp +++ b/media/libstagefright/MediaCodecSource.cpp @@ -39,6 +39,9 @@ namespace android { +const int kDefaultSwVideoEncoderFormat = HAL_PIXEL_FORMAT_YCbCr_420_888; +const int kDefaultSwVideoEncoderDataSpace = HAL_DATASPACE_BT709; + struct MediaCodecSource::Puller : public AHandler { Puller(const sp<MediaSource> &source); @@ -341,6 +344,9 @@ MediaCodecSource::MediaCodecSource( mStarted(false), mStopping(false), mDoMoreWorkPending(false), + mSetEncoderFormat(false), + mEncoderFormat(0), + mEncoderDataSpace(0), mGraphicBufferConsumer(consumer), mFirstSampleTimeUs(-1ll), mEncoderReachedEOS(false), @@ -438,6 +444,18 @@ status_t MediaCodecSource::initEncoder() { } } + sp<AMessage> inputFormat; + int32_t usingSwReadOften; + mSetEncoderFormat = false; + if (mEncoder->getInputFormat(&inputFormat) == OK + && inputFormat->findInt32("using-sw-read-often", &usingSwReadOften) + && usingSwReadOften) { + // this is a SW encoder; signal source to allocate SW readable buffers + mSetEncoderFormat = true; + mEncoderFormat = kDefaultSwVideoEncoderFormat; + mEncoderDataSpace = kDefaultSwVideoEncoderDataSpace; + } + err = mEncoder->start(); if (err != OK) { @@ -632,8 +650,17 @@ status_t MediaCodecSource::onStart(MetaData *params) { resume(startTimeUs); } else { CHECK(mPuller != NULL); + sp<MetaData> meta = params; + if (mSetEncoderFormat) { + if (meta == NULL) { + meta = new MetaData; + } + meta->setInt32(kKeyPixelFormat, mEncoderFormat); + meta->setInt32(kKeyColorSpace, mEncoderDataSpace); + } + sp<AMessage> notify = new AMessage(kWhatPullerNotify, mReflector); - err = mPuller->start(params, notify); + err = mPuller->start(meta.get(), notify); if (err != OK) { return err; } |