summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MediaCodecSource.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2015-06-25 17:04:09 -0700
committerLajos Molnar <lajos@google.com>2015-06-26 17:09:42 -0700
commitc93a13669ce1b5a9e6527b4c86c9d8f5e92be828 (patch)
tree5fb41cc9ed232bdf147470e50d6411bfe435f2d4 /media/libstagefright/MediaCodecSource.cpp
parent064b2bf712788d30928b9a8bafecd0f3308d7aa4 (diff)
downloadframeworks_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.cpp29
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;
}