Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16fcc47c authored by Lajos Molnar's avatar Lajos Molnar
Browse files

stagefright: add PREFER_SOFTWARE_CODEC flag to MediaCodecSource

Bug: 17108024
Change-Id: I553d7ccf9df9d4eb3d8bffa2f11ae32d03b9d6c3
parent 6b079500
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -21,14 +21,15 @@
#include <media/stagefright/foundation/AHandlerReflector.h>
#include <media/stagefright/MediaSource.h>

#include <gui/IGraphicBufferConsumer.h>

namespace android {

struct ALooper;
class AMessage;
struct AMessage;
struct AReplyToken;
class IGraphicBufferProducer;
class IGraphicBufferConsumer;
class MediaCodec;
struct MediaCodec;
class MetaData;

struct MediaCodecSource : public MediaSource,
@@ -36,6 +37,7 @@ struct MediaCodecSource : public MediaSource,
    enum FlagBits {
        FLAG_USE_SURFACE_INPUT      = 1,
        FLAG_USE_METADATA_INPUT     = 2,
        FLAG_PREFER_SOFTWARE_CODEC  = 4,  // used for testing only
    };

    static sp<MediaCodecSource> Create(
+29 −13
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaCodecList.h>
#include <media/stagefright/MediaCodecSource.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaSource.h>
@@ -408,11 +409,19 @@ status_t MediaCodecSource::initEncoder() {
    AString outputMIME;
    CHECK(mOutputFormat->findString("mime", &outputMIME));

    mEncoder = MediaCodec::CreateByType(
            mCodecLooper, outputMIME.c_str(), true /* encoder */);
    Vector<AString> matchingCodecs;
    MediaCodecList::findMatchingCodecs(
            outputMIME.c_str(), true /* encoder */,
            ((mFlags & FLAG_PREFER_SOFTWARE_CODEC) ? MediaCodecList::kPreferSoftwareCodecs : 0),
            &matchingCodecs);

    status_t err = NO_INIT;
    for (size_t ix = 0; ix < matchingCodecs.size(); ++ix) {
        mEncoder = MediaCodec::CreateByComponentName(
                mCodecLooper, matchingCodecs[ix]);

        if (mEncoder == NULL) {
        return NO_INIT;
            continue;
        }

        ALOGV("output format is '%s'", mOutputFormat->debugString(0).c_str());
@@ -420,12 +429,19 @@ status_t MediaCodecSource::initEncoder() {
        mEncoderActivityNotify = new AMessage(kWhatEncoderActivity, mReflector);
        mEncoder->setCallback(mEncoderActivityNotify);

    status_t err = mEncoder->configure(
        err = mEncoder->configure(
                    mOutputFormat,
                    NULL /* nativeWindow */,
                    NULL /* crypto */,
                    MediaCodec::CONFIGURE_FLAG_ENCODE);

        if (err == OK) {
            break;
        }
        mEncoder->release();
        mEncoder = NULL;
    }

    if (err != OK) {
        return err;
    }