summaryrefslogtreecommitdiffstats
path: root/camera/ProCamera.cpp
diff options
context:
space:
mode:
authorIgor Murashkin <iam@google.com>2013-02-20 19:29:53 -0800
committerIgor Murashkin <iam@google.com>2013-02-22 10:50:15 -0800
commit5835cc46a2f06dbfa5fbdab70e091896ef2fb438 (patch)
treef303abd135f649d5beb940a238b906b4027564f5 /camera/ProCamera.cpp
parent76f8b43909817179b317880202360863b8f976d0 (diff)
downloadframeworks_av-5835cc46a2f06dbfa5fbdab70e091896ef2fb438.zip
frameworks_av-5835cc46a2f06dbfa5fbdab70e091896ef2fb438.tar.gz
frameworks_av-5835cc46a2f06dbfa5fbdab70e091896ef2fb438.tar.bz2
Camera: ProCamera - add createStreamCpu and unit test
Change-Id: I468172dbfdd78510b273bf9d119c950cbeda7ea3
Diffstat (limited to 'camera/ProCamera.cpp')
-rw-r--r--camera/ProCamera.cpp111
1 files changed, 88 insertions, 23 deletions
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 <IProCameraUser> c = mCamera;
if (c == 0) return NO_INIT;
- return c->requestStream(streamId);
-}
-status_t ProCamera::cancelStream(int streamId)
-{
- sp <IProCameraUser> 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 <IProCameraUser> 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<IGraphicBufferProducer>& bufferProducer,
/*out*/
int* streamId) {
+ *streamId = -1;
ALOGV("%s: createStreamT %dx%d (fmt=0x%x)", __FUNCTION__, width, height,
format);
- sp<IBinder> binder;
- status_t stat = INVALID_OPERATION;
+ if (bufferProducer == 0) {
+ return BAD_VALUE;
+ }
- if (bufferProducer != 0) {
- sp <IProCameraUser> c = mCamera;
- if (c == 0) return NO_INIT;
+ sp <IProCameraUser> 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 <IProCameraUser> c = mCamera;
+ if (c == 0) return NO_INIT;
+
+ sp<CpuConsumer> cc = new CpuConsumer(heapCount);
+ cc->setName(String8("ProCamera::mCpuConsumer"));
+
+ sp<Surface> 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<ProFrameListener> 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<ProCameraListener> 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