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

Commit d8421c54 authored by Dave Burke's avatar Dave Burke Committed by Android (Google) Code Review
Browse files

Merge "Support IDR requests in wifi display, MediaCodec and ACodec." into jb-mr1-dev

parents 896adcd3 496238cc
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -58,6 +58,8 @@ struct ACodec : public AHierarchicalStateMachine {
    void initiateConfigureComponent(const sp<AMessage> &msg);
    void initiateConfigureComponent(const sp<AMessage> &msg);
    void initiateStart();
    void initiateStart();


    void signalRequestIDRFrame();

    struct PortDescription : public RefBase {
    struct PortDescription : public RefBase {
        size_t countBuffers();
        size_t countBuffers();
        IOMX::buffer_id bufferIDAt(size_t index) const;
        IOMX::buffer_id bufferIDAt(size_t index) const;
@@ -102,6 +104,7 @@ private:
        kWhatAllocateComponent       = 'allo',
        kWhatAllocateComponent       = 'allo',
        kWhatConfigureComponent      = 'conf',
        kWhatConfigureComponent      = 'conf',
        kWhatStart                   = 'star',
        kWhatStart                   = 'star',
        kWhatRequestIDRFrame         = 'ridr',
    };
    };


    enum {
    enum {
@@ -262,6 +265,8 @@ private:
            OMX_ERRORTYPE error = OMX_ErrorUndefined,
            OMX_ERRORTYPE error = OMX_ErrorUndefined,
            status_t internalError = UNKNOWN_ERROR);
            status_t internalError = UNKNOWN_ERROR);


    status_t requestIDRFrame();

    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
};
};


+3 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,8 @@ struct MediaCodec : public AHandler {
    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
    status_t getInputBuffers(Vector<sp<ABuffer> > *buffers) const;
    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;
    status_t getOutputBuffers(Vector<sp<ABuffer> > *buffers) const;


    status_t requestIDRFrame();

protected:
protected:
    virtual ~MediaCodec();
    virtual ~MediaCodec();
    virtual void onMessageReceived(const sp<AMessage> &msg);
    virtual void onMessageReceived(const sp<AMessage> &msg);
@@ -145,6 +147,7 @@ private:
        kWhatDequeueInputTimedOut       = 'dITO',
        kWhatDequeueInputTimedOut       = 'dITO',
        kWhatDequeueOutputTimedOut      = 'dOTO',
        kWhatDequeueOutputTimedOut      = 'dOTO',
        kWhatCodecNotify                = 'codc',
        kWhatCodecNotify                = 'codc',
        kWhatRequestIDRFrame            = 'ridr',
    };
    };


    enum {
    enum {
+41 −0
Original line number Original line Diff line number Diff line
@@ -34,6 +34,8 @@


#include <OMX_Component.h>
#include <OMX_Component.h>


#include "include/avc_utils.h"

namespace android {
namespace android {


template<class T>
template<class T>
@@ -401,6 +403,10 @@ void ACodec::initiateShutdown(bool keepComponentAllocated) {
    msg->post();
    msg->post();
}
}


void ACodec::signalRequestIDRFrame() {
    (new AMessage(kWhatRequestIDRFrame, id()))->post();
}

status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
status_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) {
    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);


@@ -2284,6 +2290,24 @@ error:
ACodec::PortDescription::PortDescription() {
ACodec::PortDescription::PortDescription() {
}
}


status_t ACodec::requestIDRFrame() {
    if (!mIsEncoder) {
        return ERROR_UNSUPPORTED;
    }

    OMX_CONFIG_INTRAREFRESHVOPTYPE params;
    InitOMXParams(&params);

    params.nPortIndex = kPortIndexOutput;
    params.IntraRefreshVOP = OMX_TRUE;

    return mOMX->setConfig(
            mNode,
            OMX_IndexConfigVideoIntraVOPRefresh,
            &params,
            sizeof(params));
}

void ACodec::PortDescription::addBuffer(
void ACodec::PortDescription::addBuffer(
        IOMX::buffer_id id, const sp<ABuffer> &buffer) {
        IOMX::buffer_id id, const sp<ABuffer> &buffer) {
    mBufferIDs.push_back(id);
    mBufferIDs.push_back(id);
@@ -2737,6 +2761,12 @@ bool ACodec::BaseState::onOMXFillBufferDone(


            if (mCodec->mNativeWindow == NULL) {
            if (mCodec->mNativeWindow == NULL) {
                info->mData->setRange(rangeOffset, rangeLength);
                info->mData->setRange(rangeOffset, rangeLength);

#if 0
                if (IsIDR(info->mData)) {
                    ALOGI("IDR frame");
                }
#endif
            }
            }


            if (mCodec->mSkipCutBuffer != NULL) {
            if (mCodec->mSkipCutBuffer != NULL) {
@@ -3400,6 +3430,17 @@ bool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatRequestIDRFrame:
        {
            status_t err = mCodec->requestIDRFrame();
            if (err != OK) {
                ALOGW("Requesting an IDR frame failed.");
            }

            handled = true;
            break;
        }

        default:
        default:
            handled = BaseState::onMessageReceived(msg);
            handled = BaseState::onMessageReceived(msg);
            break;
            break;
+12 −0
Original line number Original line Diff line number Diff line
@@ -327,6 +327,12 @@ status_t MediaCodec::flush() {
    return PostAndAwaitResponse(msg, &response);
    return PostAndAwaitResponse(msg, &response);
}
}


status_t MediaCodec::requestIDRFrame() {
    (new AMessage(kWhatRequestIDRFrame, id()))->post();

    return OK;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////


void MediaCodec::cancelPendingDequeueOperations() {
void MediaCodec::cancelPendingDequeueOperations() {
@@ -1133,6 +1139,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatRequestIDRFrame:
        {
            mCodec->signalRequestIDRFrame();
            break;
        }

        default:
        default:
            TRESPASS();
            TRESPASS();
    }
    }
+21 −0
Original line number Original line Diff line number Diff line
@@ -40,7 +40,15 @@ Converter::Converter(
      mNotify(notify),
      mNotify(notify),
      mCodecLooper(codecLooper),
      mCodecLooper(codecLooper),
      mInputFormat(format),
      mInputFormat(format),
      mIsVideo(false),
      mDoMoreWorkPending(false) {
      mDoMoreWorkPending(false) {
    AString mime;
    CHECK(mInputFormat->findString("mime", &mime));

    if (!strncasecmp("video/", mime.c_str(), 6)) {
        mIsVideo = true;
    }

    mInitCheck = initEncoder();
    mInitCheck = initEncoder();
}
}


@@ -202,6 +210,15 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatRequestIDRFrame:
        {
            if (mIsVideo) {
                ALOGI("requesting IDR frame");
                mEncoder->requestIDRFrame();
            }
            break;
        }

        default:
        default:
            TRESPASS();
            TRESPASS();
    }
    }
@@ -306,5 +323,9 @@ status_t Converter::doMoreWork() {
    return err;
    return err;
}
}


void Converter::requestIDRFrame() {
    (new AMessage(kWhatRequestIDRFrame, id()))->post();
}

}  // namespace android
}  // namespace android
Loading