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

Commit cc4f3424 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 22092 into eclair

* changes:
  Dynamically allocate a pair of MemoryHeaps according buffer count/sizes required by the OMX component, respect JPEG compressed size.
parents e0616ffb 5c0a9133
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ JPEGSource::JPEGSource(const sp<DataSource> &source)
      mHeight(0),
      mOffset(0) {
    CHECK_EQ(parseJPEG(), OK);
    CHECK(mSource->getSize(&mSize) == OK);
}

JPEGSource::~JPEGSource() {
@@ -73,10 +74,6 @@ status_t JPEGSource::start(MetaData *) {
        return UNKNOWN_ERROR;
    }

    if (mSource->getSize(&mSize) != OK) {
        return UNKNOWN_ERROR;
    }

    mGroup = new MediaBufferGroup;
    mGroup->add_buffer(new MediaBuffer(mSize));

@@ -105,6 +102,7 @@ sp<MetaData> JPEGSource::getFormat() {
    meta->setCString(kKeyMIMEType, "image/jpeg");
    meta->setInt32(kKeyWidth, mWidth);
    meta->setInt32(kKeyHeight, mHeight);
    meta->setInt32(kKeyCompressedSize, mSize);

    return meta;
}
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ enum {
    kKeyPlatformPrivate   = 'priv',
    kKeyDecoderComponent  = 'decC',
    kKeyBufferID          = 'bfID',
    kKeyCompressedSize    = 'cmpS',
};

enum {
+4 −1
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ private:
    Vector<CodecSpecificData *> mCodecSpecificData;
    size_t mCodecSpecificDataIndex;

    sp<MemoryDealer> mDealer;
    sp<MemoryDealer> mDealer[2];

    State mState;
    Vector<BufferInfo> mPortBuffers[2];
@@ -148,6 +148,9 @@ private:
    void setImageOutputFormat(
            OMX_COLOR_FORMATTYPE format, OMX_U32 width, OMX_U32 height);

    void setJPEGInputFormat(
            OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize);

    status_t allocateBuffers();
    status_t allocateBuffersOnPort(OMX_U32 portIndex);

+29 −10
Original line number Diff line number Diff line
@@ -302,7 +302,7 @@ sp<OMXCodec> OMXCodec::Create(
        int32_t width, height;
        bool success = meta->findInt32(kKeyWidth, &width);
        success = success && meta->findInt32(kKeyHeight, &height);
        assert(success);
        CHECK(success);

        if (createEncoder) {
            codec->setVideoInputFormat(mime, width, height);
@@ -321,9 +321,16 @@ sp<OMXCodec> OMXCodec::Create(
        int32_t width, height;
        bool success = meta->findInt32(kKeyWidth, &width);
        success = success && meta->findInt32(kKeyHeight, &height);
        assert(success);

        int32_t compressedSize;
        success = success && meta->findInt32(
                kKeyCompressedSize, &compressedSize);

        CHECK(success);
        CHECK(compressedSize > 0);

        codec->setImageOutputFormat(format, width, height);
        codec->setJPEGInputFormat(width, height, (OMX_U32)compressedSize);
    }

    codec->initOutputFormat(meta);
@@ -355,7 +362,7 @@ status_t OMXCodec::setVideoPortFormatType(
        }

        // The following assertion is violated by TI's video decoder.
        // assert(format.nIndex == index);
        // CHECK_EQ(format.nIndex, index);

#if 1
        LOGI("portIndex: %ld, index: %ld, eCompressionFormat=%d eColorFormat=%d",
@@ -618,7 +625,6 @@ OMXCodec::OMXCodec(
      mComponentName(strdup(componentName)),
      mSource(source),
      mCodecSpecificDataIndex(0),
      mDealer(new MemoryDealer(5 * 1024 * 1024)),
      mState(LOADED),
      mSignalledEOS(false),
      mNoMoreOutputData(false),
@@ -716,8 +722,11 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
        return err;
    }

    size_t totalSize = def.nBufferCountActual * def.nBufferSize;
    mDealer[portIndex] = new MemoryDealer(totalSize);

    for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) {
        sp<IMemory> mem = mDealer->allocate(def.nBufferSize);
        sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize);
        CHECK(mem.get() != NULL);

        IOMX::buffer_id buffer;
@@ -1491,23 +1500,33 @@ void OMXCodec::setImageOutputFormat(
            break;
    }

    def.nBufferCountActual = def.nBufferCountMin;

    err = mOMX->set_parameter(
            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
    CHECK_EQ(err, OK);
}

    ////

void OMXCodec::setJPEGInputFormat(
        OMX_U32 width, OMX_U32 height, OMX_U32 compressedSize) {
    OMX_PARAM_PORTDEFINITIONTYPE def;
    def.nSize = sizeof(def);
    def.nVersion.s.nVersionMajor = 1;
    def.nVersion.s.nVersionMinor = 1;
    def.nPortIndex = kPortIndexInput;

    err = mOMX->get_parameter(
    status_t err = mOMX->get_parameter(
            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
    CHECK_EQ(err, OK);

    CHECK_EQ(def.eDomain, OMX_PortDomainImage);
    OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image;

    CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingJPEG);
    imageDef->nFrameWidth = width;
    imageDef->nFrameHeight = height;

    def.nBufferSize = 128 * 1024;
    def.nBufferSize = compressedSize;
    def.nBufferCountActual = def.nBufferCountMin;

    err = mOMX->set_parameter(
@@ -1558,7 +1577,7 @@ status_t OMXCodec::start(MetaData *) {
}

status_t OMXCodec::stop() {
    LOGI("stop");
    LOGV("stop");

    Mutex::Autolock autoLock(mLock);