diff options
| author | Lajos Molnar <lajos@google.com> | 2015-07-01 12:06:40 -0700 | 
|---|---|---|
| committer | Lajos Molnar <lajos@google.com> | 2015-07-01 12:08:07 -0700 | 
| commit | 49605e8ab171a2b1f474645d632d3982f5f7b8e6 (patch) | |
| tree | 003d3960bddc796b438873a4d41c0c02b0cf6eee | |
| parent | 2065710591ebb59b76df8b34866d53d3ae022c2b (diff) | |
| download | frameworks_av-49605e8ab171a2b1f474645d632d3982f5f7b8e6.zip frameworks_av-49605e8ab171a2b1f474645d632d3982f5f7b8e6.tar.gz frameworks_av-49605e8ab171a2b1f474645d632d3982f5f7b8e6.tar.bz2  | |
stagefright: fix deadlock and NPE in GraphicBufferSource
Bug: 22202388
Change-Id: I04f2f783ecc0e0c50adf16a666f6d7ab4221e285
| -rw-r--r-- | media/libstagefright/omx/GraphicBufferSource.cpp | 13 | ||||
| -rw-r--r-- | media/libstagefright/omx/GraphicBufferSource.h | 1 | ||||
| -rw-r--r-- | media/libstagefright/omx/OMXNodeInstance.cpp | 11 | 
3 files changed, 15 insertions, 10 deletions
diff --git a/media/libstagefright/omx/GraphicBufferSource.cpp b/media/libstagefright/omx/GraphicBufferSource.cpp index 19f0a37..a424819 100644 --- a/media/libstagefright/omx/GraphicBufferSource.cpp +++ b/media/libstagefright/omx/GraphicBufferSource.cpp @@ -111,6 +111,7 @@ GraphicBufferSource::GraphicBufferSource(          uint32_t bufferWidth,          uint32_t bufferHeight,          uint32_t bufferCount, +        uint32_t consumerUsage,          const sp<IGraphicBufferConsumer> &consumer) :      mInitCheck(UNKNOWN_ERROR),      mNodeInstance(nodeInstance), @@ -154,16 +155,10 @@ GraphicBufferSource::GraphicBufferSource(          BufferQueue::createBufferQueue(&mProducer, &mConsumer);          mConsumer->setConsumerName(name); -        // query consumer usage bits from encoder, but always add HW_VIDEO_ENCODER +        // use consumer usage bits queried from encoder, but always add HW_VIDEO_ENCODER          // for backward compatibility. -        uint32_t usageBits; -        status_t err = mNodeInstance->getParameter( -                (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits, sizeof(usageBits)); -        if (err != OK) { -            usageBits = 0; -        } -        usageBits |= GRALLOC_USAGE_HW_VIDEO_ENCODER; -        mConsumer->setConsumerUsageBits(usageBits); +        consumerUsage |= GRALLOC_USAGE_HW_VIDEO_ENCODER; +        mConsumer->setConsumerUsageBits(consumerUsage);          mInitCheck = mConsumer->setMaxAcquiredBufferCount(bufferCount);          if (mInitCheck != NO_ERROR) { diff --git a/media/libstagefright/omx/GraphicBufferSource.h b/media/libstagefright/omx/GraphicBufferSource.h index 3f64088..2f929d9 100644 --- a/media/libstagefright/omx/GraphicBufferSource.h +++ b/media/libstagefright/omx/GraphicBufferSource.h @@ -55,6 +55,7 @@ public:              uint32_t bufferWidth,              uint32_t bufferHeight,              uint32_t bufferCount, +            uint32_t consumerUsage,              const sp<IGraphicBufferConsumer> &consumer = NULL      ); diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 95549a4..9f1c5d8 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -834,7 +834,8 @@ status_t OMXNodeInstance::updateGraphicBufferInMeta_l(      }      CLOG_BUFFER(updateGraphicBufferInMeta, "%s:%u, %#x := %p", -            portString(portIndex), portIndex, buffer, graphicBuffer->handle); +            portString(portIndex), portIndex, buffer, +            graphicBuffer == NULL ? NULL : graphicBuffer->handle);      return OK;  } @@ -885,10 +886,18 @@ status_t OMXNodeInstance::createGraphicBufferSource(          return INVALID_OPERATION;      } +    uint32_t usageBits; +    oerr = OMX_GetParameter( +            mHandle, (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits, &usageBits); +    if (oerr != OMX_ErrorNone) { +        usageBits = 0; +    } +      sp<GraphicBufferSource> bufferSource = new GraphicBufferSource(this,              def.format.video.nFrameWidth,              def.format.video.nFrameHeight,              def.nBufferCountActual, +            usageBits,              bufferConsumer);      if ((err = bufferSource->initCheck()) != OK) {  | 
