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

Commit f2497123 authored by Lajos Molnar's avatar Lajos Molnar Committed by Gerrit Code Review
Browse files

Merge changes I3aa5872e,I914bcc88,Icc6d023f,Ic262482a

* changes:
  stagefright: use small timeout for input buffer in SimpleDecodingSource
  stagefright: CodecCapabilities: fix missing capabilities
  stagefright: ACodec: remove infinite loops
  stagefright: ACodec: query color format support on specific port
parents a888e63c f4d7011d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -122,8 +122,8 @@ private:
    void addQuirk(const char *name);
    status_t addMime(const char *mime);
    status_t updateMime(const char *mime);
    // after this call Capabilities will be owned by MediaCodecInfo
    status_t setCapabilities(const sp<Capabilities> &caps);

    status_t initializeCapabilities(const sp<Capabilities> &caps);
    void addDetail(const AString &key, const AString &value);
    void addFeature(const AString &key, int32_t value);
    void addFeature(const AString &key, const char *value);
+9 −2
Original line number Diff line number Diff line
@@ -238,8 +238,15 @@ void MediaCodecInfo::removeMime(const char *mime) {
    }
}

status_t MediaCodecInfo::setCapabilities(const sp<Capabilities> &caps) {
    mCurrentCaps = caps;
status_t MediaCodecInfo::initializeCapabilities(const sp<Capabilities> &caps) {
    // TRICKY: copy data to mCurrentCaps as it is a reference to
    // an element of the capabilites map.
    mCurrentCaps->mColorFormats.clear();
    mCurrentCaps->mColorFormats.appendVector(caps->mColorFormats);
    mCurrentCaps->mProfileLevels.clear();
    mCurrentCaps->mProfileLevels.appendVector(caps->mProfileLevels);
    mCurrentCaps->mFlags = caps->mFlags;
    mCurrentCaps->mDetails = caps->mDetails;
    return OK;
}

+45 −9
Original line number Diff line number Diff line
@@ -55,6 +55,10 @@

namespace android {

enum {
    kMaxIndicesToCheck = 32, // used when enumerating supported formats and profiles
};

// OMX errors are directly mapped into status_t range if
// there is no corresponding MediaError status code.
// Use the statusFromOMXError(int32_t omxError) function.
@@ -2278,9 +2282,8 @@ status_t ACodec::selectAudioPortFormat(
    InitOMXParams(&format);

    format.nPortIndex = portIndex;
    for (OMX_U32 index = 0;; ++index) {
    for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
        format.nIndex = index;

        status_t err = mOMX->getParameter(
                mNode, OMX_IndexParamAudioPortFormat,
                &format, sizeof(format));
@@ -2292,6 +2295,13 @@ status_t ACodec::selectAudioPortFormat(
        if (format.eEncoding == desiredFormat) {
            break;
        }

        if (index == kMaxIndicesToCheck) {
            ALOGW("[%s] stopping checking formats after %u: %s(%x)",
                    mComponentName.c_str(), index,
                    asString(format.eEncoding), format.eEncoding);
            return ERROR_UNSUPPORTED;
        }
    }

    return mOMX->setParameter(
@@ -2711,8 +2721,7 @@ status_t ACodec::setVideoPortFormatType(
    format.nIndex = 0;
    bool found = false;

    OMX_U32 index = 0;
    for (;;) {
    for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
        format.nIndex = index;
        status_t err = mOMX->getParameter(
                mNode, OMX_IndexParamVideoPortFormat,
@@ -2757,7 +2766,12 @@ status_t ACodec::setVideoPortFormatType(
            break;
        }

        ++index;
        if (index == kMaxIndicesToCheck) {
            ALOGW("[%s] stopping checking formats after %u: %s(%x)/%s(%x)",
                    mComponentName.c_str(), index,
                    asString(format.eCompressionFormat), format.eCompressionFormat,
                    asString(format.eColorFormat), format.eColorFormat);
        }
    }

    if (!found) {
@@ -3630,7 +3644,8 @@ status_t ACodec::verifySupportForProfileAndLevel(
    InitOMXParams(&params);
    params.nPortIndex = kPortIndexOutput;

    for (params.nProfileIndex = 0;; ++params.nProfileIndex) {
    for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
        params.nProfileIndex = index;
        status_t err = mOMX->getParameter(
                mNode,
                OMX_IndexParamVideoProfileLevelQuerySupported,
@@ -3647,7 +3662,14 @@ status_t ACodec::verifySupportForProfileAndLevel(
        if (profile == supportedProfile && level <= supportedLevel) {
            return OK;
        }

        if (index == kMaxIndicesToCheck) {
            ALOGW("[%s] stopping checking profiles after %u: %x/%x",
                    mComponentName.c_str(), index,
                    params.eProfile, params.eLevel);
        }
    }
    return ERROR_UNSUPPORTED;
}

status_t ACodec::configureBitrate(
@@ -6904,7 +6926,8 @@ status_t ACodec::queryCapabilities(
        InitOMXParams(&param);
        param.nPortIndex = isEncoder ? kPortIndexOutput : kPortIndexInput;

        for (param.nProfileIndex = 0;; ++param.nProfileIndex) {
        for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
            param.nProfileIndex = index;
            status_t err = omx->getParameter(
                    node, OMX_IndexParamVideoProfileLevelQuerySupported,
                    &param, sizeof(param));
@@ -6912,6 +6935,12 @@ status_t ACodec::queryCapabilities(
                break;
            }
            builder->addProfileLevel(param.eProfile, param.eLevel);

            if (index == kMaxIndicesToCheck) {
                ALOGW("[%s] stopping checking profiles after %u: %x/%x",
                        name.c_str(), index,
                        param.eProfile, param.eLevel);
            }
        }

        // Color format query
@@ -6919,9 +6948,10 @@ status_t ACodec::queryCapabilities(
        // prefix "flexible" standard ones with the flexible equivalent
        OMX_VIDEO_PARAM_PORTFORMATTYPE portFormat;
        InitOMXParams(&portFormat);
        param.nPortIndex = isEncoder ? kPortIndexInput : kPortIndexOutput;
        portFormat.nPortIndex = isEncoder ? kPortIndexInput : kPortIndexOutput;
        Vector<uint32_t> supportedColors; // shadow copy to check for duplicates
        for (portFormat.nIndex = 0;; ++portFormat.nIndex)  {
        for (OMX_U32 index = 0; index <= kMaxIndicesToCheck; ++index) {
            portFormat.nIndex = index;
            status_t err = omx->getParameter(
                    node, OMX_IndexParamVideoPortFormat,
                    &portFormat, sizeof(portFormat));
@@ -6947,6 +6977,12 @@ status_t ACodec::queryCapabilities(
            }
            supportedColors.push(portFormat.eColorFormat);
            builder->addColorFormat(portFormat.eColorFormat);

            if (index == kMaxIndicesToCheck) {
                ALOGW("[%s] stopping checking formats after %u: %s(%x)",
                        name.c_str(), index,
                        asString(portFormat.eColorFormat), portFormat.eColorFormat);
            }
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -767,7 +767,7 @@ status_t MediaCodecList::initializeCapabilities(const char *type) {
        return UNKNOWN_ERROR;
    }

    return mCurrentInfo->setCapabilities(caps);
    return mCurrentInfo->initializeCapabilities(caps);
}

status_t MediaCodecList::addQuirk(const char **attrs) {
+4 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
using namespace android;

const int64_t kTimeoutWaitForOutputUs = 500000; // 0.5 seconds
const int64_t kTimeoutWaitForInputUs = 5000; // 5 milliseconds

//static
sp<SimpleDecodingSource> SimpleDecodingSource::Create(
@@ -205,13 +206,14 @@ status_t SimpleDecodingSource::doRead(
        return ERROR_END_OF_STREAM;
    }

    for (int retries = 1; ++retries; ) {
    for (int retries = 0; ++retries; ) {
        // If we fill all available input buffers, we should expect that
        // the codec produces at least one output buffer. Also, the codec
        // should produce an output buffer in at most 1 seconds. Retry a
        // few times nonetheless.
        while (!me->mQueuedInputEOS) {
            res = mCodec->dequeueInputBuffer(&in_ix, 0);
            // allow some time to get input buffer after flush
            res = mCodec->dequeueInputBuffer(&in_ix, kTimeoutWaitForInputUs);
            if (res == -EAGAIN) {
                // no available input buffers
                break;