OSDN Git Service

Dynamically allocate a pair of MemoryHeaps according buffer count/sizes required...
authorAndreas Huber <andih@google.com>
Thu, 20 Aug 2009 18:16:40 +0000 (11:16 -0700)
committerAndreas Huber <andih@google.com>
Thu, 20 Aug 2009 18:16:40 +0000 (11:16 -0700)
cmds/stagefright/JPEGSource.cpp
include/media/stagefright/MetaData.h
include/media/stagefright/OMXCodec.h
media/libstagefright/OMXCodec.cpp

index 338a3d5..a7994ed 100644 (file)
@@ -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;
 }
index 6ce2581..be60565 100644 (file)
@@ -45,6 +45,7 @@ enum {
     kKeyPlatformPrivate   = 'priv',
     kKeyDecoderComponent  = 'decC',
     kKeyBufferID          = 'bfID',
+    kKeyCompressedSize    = 'cmpS',
 };
 
 enum {
index c8ee255..0b94118 100644 (file)
@@ -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);
 
index 1774eaf..ec9f6d3 100644 (file)
@@ -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);