From 5835cc46a2f06dbfa5fbdab70e091896ef2fb438 Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Wed, 20 Feb 2013 19:29:53 -0800 Subject: Camera: ProCamera - add createStreamCpu and unit test Change-Id: I468172dbfdd78510b273bf9d119c950cbeda7ea3 --- camera/ProCamera.cpp | 111 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 88 insertions(+), 23 deletions(-) (limited to 'camera/ProCamera.cpp') diff --git a/camera/ProCamera.cpp b/camera/ProCamera.cpp index 8fd08f4..5ee0e4d 100644 --- a/camera/ProCamera.cpp +++ b/camera/ProCamera.cpp @@ -246,19 +246,16 @@ status_t ProCamera::cancelRequest(int requestId) return c->cancelRequest(requestId); } -status_t ProCamera::requestStream(int streamId) +status_t ProCamera::deleteStream(int streamId) { sp c = mCamera; if (c == 0) return NO_INIT; - return c->requestStream(streamId); -} -status_t ProCamera::cancelStream(int streamId) -{ - sp c = mCamera; - if (c == 0) return NO_INIT; + status_t s = c->cancelStream(streamId); + + mStreams.removeItem(streamId); - return c->cancelStream(streamId); + return s; } status_t ProCamera::createStream(int width, int height, int format, @@ -275,38 +272,76 @@ status_t ProCamera::createStream(int width, int height, int format, return BAD_VALUE; } - sp c = mCamera; - if (c == 0) return NO_INIT; - - return c->createStream(width, height, format, surface->getIGraphicBufferProducer(), - streamId); + return createStream(width, height, format, surface->getIGraphicBufferProducer(), + streamId); } status_t ProCamera::createStream(int width, int height, int format, const sp& bufferProducer, /*out*/ int* streamId) { + *streamId = -1; ALOGV("%s: createStreamT %dx%d (fmt=0x%x)", __FUNCTION__, width, height, format); - sp binder; - status_t stat = INVALID_OPERATION; + if (bufferProducer == 0) { + return BAD_VALUE; + } - if (bufferProducer != 0) { - sp c = mCamera; - if (c == 0) return NO_INIT; + sp c = mCamera; + status_t stat = c->createStream(width, height, format, bufferProducer, + streamId); - return c->createStream(width, height, format, bufferProducer, streamId); - } - else { - *streamId = -1; - return BAD_VALUE; + if (stat == OK) { + StreamInfo s(*streamId); + + mStreams.add(*streamId, s); } return stat; } +status_t ProCamera::createStreamCpu(int width, int height, int format, + int heapCount, + /*out*/ + int* streamId) +{ + ALOGV("%s: createStreamW %dx%d (fmt=0x%x)", __FUNCTION__, width, height, + format); + + sp c = mCamera; + if (c == 0) return NO_INIT; + + sp cc = new CpuConsumer(heapCount); + cc->setName(String8("ProCamera::mCpuConsumer")); + + sp stc = new Surface( + cc->getProducerInterface()); + + status_t s = createStream(width, height, format, stc->getIGraphicBufferProducer(), + streamId); + + if (s != OK) { + ALOGE("%s: Failure to create stream %dx%d (fmt=0x%x)", __FUNCTION__, + width, height, format); + return s; + } + + sp frameAvailableListener = + new ProFrameListener(this, *streamId); + + getStreamInfo(*streamId).cpuStream = true; + getStreamInfo(*streamId).cpuConsumer = cc; + getStreamInfo(*streamId).stc = stc; + // for lifetime management + getStreamInfo(*streamId).frameAvailableListener = frameAvailableListener; + + cc->setFrameAvailableListener(frameAvailableListener); + + return s; +} + int ProCamera::getNumberOfCameras() { ALOGE("%s: not implemented yet", __FUNCTION__); return 1; @@ -329,4 +364,34 @@ status_t ProCamera::createDefaultRequest(int templateId, return c->createDefaultRequest(templateId, request); } +void ProCamera::onFrameAvailable(int streamId) { + ALOGV("%s: streamId = %d", __FUNCTION__, streamId); + + sp listener = mListener; + if (listener.get() != NULL) { + StreamInfo& stream = getStreamInfo(streamId); + + CpuConsumer::LockedBuffer buf; + + status_t stat = stream.cpuConsumer->lockNextBuffer(&buf); + if (stat != OK) { + ALOGE("%s: Failed to lock buffer, error code = %d", __FUNCTION__, + stat); + return; + } + + listener->onBufferReceived(streamId, buf); + stat = stream.cpuConsumer->unlockBuffer(buf); + + if (stat != OK) { + ALOGE("%s: Failed to unlock buffer, error code = %d", __FUNCTION__, + stat); + } + } +} + +ProCamera::StreamInfo& ProCamera::getStreamInfo(int streamId) { + return mStreams.editValueFor(streamId); +} + }; // namespace android -- cgit v1.1