Loading services/camera/libcameraservice/Android.mk +3 −1 Original line number Diff line number Diff line Loading @@ -25,10 +25,12 @@ LOCAL_SRC_FILES:= \ camera2/JpegCompressor.cpp \ camera2/CaptureSequencer.cpp \ camera2/ProFrameProcessor.cpp \ camera2/ZslProcessor3.cpp \ camera3/Camera3Stream.cpp \ camera3/Camera3InputStream.cpp \ camera3/Camera3OutputStream.cpp \ camera3/Camera3ZslStream.cpp camera3/Camera3ZslStream.cpp \ gui/RingBufferConsumer.cpp \ LOCAL_SHARED_LIBRARIES:= \ libui \ Loading services/camera/libcameraservice/Camera2Client.cpp +28 −7 Original line number Diff line number Diff line Loading @@ -28,6 +28,9 @@ #include "Camera2Device.h" #include "Camera3Device.h" #include "camera2/ZslProcessor.h" #include "camera2/ZslProcessor3.h" #define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); #define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); Loading @@ -51,12 +54,13 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService, int deviceVersion): Camera2ClientBase(cameraService, cameraClient, clientPackageName, cameraId, cameraFacing, clientPid, clientUid, servicePid), mParameters(cameraId, cameraFacing) mParameters(cameraId, cameraFacing), mDeviceVersion(deviceVersion) { ATRACE_CALL(); ALOGI("Camera %d: Opened", cameraId); switch (deviceVersion) { switch (mDeviceVersion) { case CAMERA_DEVICE_API_VERSION_2_0: mDevice = new Camera2Device(cameraId); break; Loading @@ -65,7 +69,7 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService, break; default: ALOGE("Camera %d: Unknown HAL device version %d", cameraId, deviceVersion); cameraId, mDeviceVersion); mDevice = NULL; break; } Loading Loading @@ -114,10 +118,27 @@ status_t Camera2Client::initialize(camera_module_t *module) mCameraId); mJpegProcessor->run(threadName.string()); mZslProcessor = new ZslProcessor(this, mCaptureSequencer); switch (mDeviceVersion) { case CAMERA_DEVICE_API_VERSION_2_0: { sp<ZslProcessor> zslProc = new ZslProcessor(this, mCaptureSequencer); mZslProcessor = zslProc; mZslProcessorThread = zslProc; break; } case CAMERA_DEVICE_API_VERSION_3_0:{ sp<ZslProcessor3> zslProc = new ZslProcessor3(this, mCaptureSequencer); mZslProcessor = zslProc; mZslProcessorThread = zslProc; break; } default: break; } threadName = String8::format("C2-%d-ZslProc", mCameraId); mZslProcessor->run(threadName.string()); mZslProcessorThread->run(threadName.string()); mCallbackProcessor = new CallbackProcessor(this); threadName = String8::format("C2-%d-CallbkProc", Loading Loading @@ -393,7 +414,7 @@ void Camera2Client::disconnect() { mFrameProcessor->requestExit(); mCaptureSequencer->requestExit(); mJpegProcessor->requestExit(); mZslProcessor->requestExit(); mZslProcessorThread->requestExit(); mCallbackProcessor->requestExit(); ALOGV("Camera %d: Waiting for threads", mCameraId); Loading @@ -401,7 +422,7 @@ void Camera2Client::disconnect() { mFrameProcessor->join(); mCaptureSequencer->join(); mJpegProcessor->join(); mZslProcessor->join(); mZslProcessorThread->join(); mCallbackProcessor->join(); ALOGV("Camera %d: Disconnecting device", mCameraId); Loading services/camera/libcameraservice/Camera2Client.h +4 −2 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ #include "camera2/FrameProcessor.h" #include "camera2/StreamingProcessor.h" #include "camera2/JpegProcessor.h" #include "camera2/ZslProcessor.h" #include "camera2/ZslProcessorInterface.h" #include "camera2/CaptureSequencer.h" #include "camera2/CallbackProcessor.h" #include "Camera2ClientBase.h" Loading Loading @@ -154,6 +154,7 @@ private: void setPreviewCallbackFlagL(Parameters ¶ms, int flag); status_t updateRequests(Parameters ¶ms); int mDeviceVersion; // Used with stream IDs static const int NO_STREAM = -1; Loading @@ -173,7 +174,8 @@ private: sp<camera2::CaptureSequencer> mCaptureSequencer; sp<camera2::JpegProcessor> mJpegProcessor; sp<camera2::ZslProcessor> mZslProcessor; sp<camera2::ZslProcessorInterface> mZslProcessor; sp<Thread> mZslProcessorThread; /** Notification-related members */ Loading services/camera/libcameraservice/Camera3Device.cpp +170 −4 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ #include <utils/Timers.h> #include "Camera3Device.h" #include "camera3/Camera3OutputStream.h" #include "camera3/Camera3InputStream.h" using namespace android::camera3; Loading Loading @@ -392,6 +393,144 @@ status_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t time return mRequestThread->waitUntilRequestProcessed(requestId, timeout); } status_t Camera3Device::createInputStream( uint32_t width, uint32_t height, int format, int *id) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res; bool wasActive = false; switch (mStatus) { case STATUS_ERROR: ALOGE("%s: Device has encountered a serious error", __FUNCTION__); return INVALID_OPERATION; case STATUS_UNINITIALIZED: ALOGE("%s: Device not initialized", __FUNCTION__); return INVALID_OPERATION; case STATUS_IDLE: // OK break; case STATUS_ACTIVE: ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); mRequestThread->setPaused(true); res = waitUntilDrainedLocked(); if (res != OK) { ALOGE("%s: Can't pause captures to reconfigure streams!", __FUNCTION__); mStatus = STATUS_ERROR; return res; } wasActive = true; break; default: ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); return INVALID_OPERATION; } assert(mStatus == STATUS_IDLE); if (mInputStream != 0) { ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); return INVALID_OPERATION; } sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId, width, height, format); mInputStream = newStream; *id = mNextStreamId++; // Continue captures if active at start if (wasActive) { ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); res = configureStreamsLocked(); if (res != OK) { ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", __FUNCTION__, mNextStreamId, strerror(-res), res); return res; } mRequestThread->setPaused(false); } return OK; } status_t Camera3Device::createZslStream( uint32_t width, uint32_t height, int depth, /*out*/ int *id, sp<Camera3ZslStream>* zslStream) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res; bool wasActive = false; switch (mStatus) { case STATUS_ERROR: ALOGE("%s: Device has encountered a serious error", __FUNCTION__); return INVALID_OPERATION; case STATUS_UNINITIALIZED: ALOGE("%s: Device not initialized", __FUNCTION__); return INVALID_OPERATION; case STATUS_IDLE: // OK break; case STATUS_ACTIVE: ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); mRequestThread->setPaused(true); res = waitUntilDrainedLocked(); if (res != OK) { ALOGE("%s: Can't pause captures to reconfigure streams!", __FUNCTION__); mStatus = STATUS_ERROR; return res; } wasActive = true; break; default: ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); return INVALID_OPERATION; } assert(mStatus == STATUS_IDLE); if (mInputStream != 0) { ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); return INVALID_OPERATION; } sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId, width, height, depth); res = mOutputStreams.add(mNextStreamId, newStream); if (res < 0) { ALOGE("%s: Can't add new stream to set: %s (%d)", __FUNCTION__, strerror(-res), res); return res; } mInputStream = newStream; *id = mNextStreamId++; *zslStream = newStream; // Continue captures if active at start if (wasActive) { ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); res = configureStreamsLocked(); if (res != OK) { ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", __FUNCTION__, mNextStreamId, strerror(-res), res); return res; } mRequestThread->setPaused(false); } return OK; } status_t Camera3Device::createStream(sp<ANativeWindow> consumer, uint32_t width, uint32_t height, int format, size_t size, int *id) { ATRACE_CALL(); Loading Loading @@ -545,7 +684,7 @@ status_t Camera3Device::deleteStream(int id) { return INVALID_OPERATION; } sp<Camera3Stream> deletedStream; sp<Camera3StreamInterface> deletedStream; if (mInputStream != NULL && id == mInputStream->getId()) { deletedStream = mInputStream; mInputStream.clear(); Loading Loading @@ -836,7 +975,8 @@ sp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( streams.data.u8[i]); return NULL; } sp<Camera3OutputStream> stream = mOutputStreams.editValueAt(idx); sp<Camera3OutputStreamInterface> stream = mOutputStreams.editValueAt(idx); // Lazy completion of stream configuration (allocation/registration) // on first use Loading Loading @@ -885,6 +1025,15 @@ status_t Camera3Device::configureStreamsLocked() { } for (size_t i = 0; i < mOutputStreams.size(); i++) { // Don't configure bidi streams twice, nor add them twice to the list if (mOutputStreams[i].get() == static_cast<Camera3StreamInterface*>(mInputStream.get())) { config.num_streams--; continue; } camera3_stream_t *outputStream; outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); if (outputStream == NULL) { Loading Loading @@ -1471,7 +1620,7 @@ bool Camera3Device::RequestThread::threadLoop() { if (nextRequest->mInputStream != NULL) { request.input_buffer = &inputBuffer; res = nextRequest->mInputStream->getBuffer(&inputBuffer); res = nextRequest->mInputStream->getInputBuffer(&inputBuffer); if (res != OK) { SET_ERR("RequestThread: Can't get input buffer, skipping request:" " %s (%d)", strerror(-res), res); Loading Loading @@ -1558,6 +1707,23 @@ bool Camera3Device::RequestThread::threadLoop() { mLatestRequestSignal.signal(); } // Return input buffer back to framework if (request.input_buffer != NULL) { Camera3Stream *stream = Camera3Stream::cast(request.input_buffer->stream); res = stream->returnInputBuffer(*(request.input_buffer)); // Note: stream may be deallocated at this point, if this buffer was the // last reference to it. if (res != OK) { ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" " its stream:%s (%d)", __FUNCTION__, request.frame_number, strerror(-res), res); // TODO: Report error upstream } } return true; } Loading @@ -1571,7 +1737,7 @@ void Camera3Device::RequestThread::cleanUpFailedRequest( } if (request.input_buffer != NULL) { request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR; nextRequest->mInputStream->returnBuffer(*(request.input_buffer), 0); nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer)); } for (size_t i = 0; i < request.num_output_buffers; i++) { outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; Loading services/camera/libcameraservice/Camera3Device.h +15 −3 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include "CameraDeviceBase.h" #include "camera3/Camera3Stream.h" #include "camera3/Camera3OutputStream.h" #include "camera3/Camera3ZslStream.h" #include "hardware/camera3.h" Loading Loading @@ -82,6 +83,15 @@ class Camera3Device : virtual status_t createStream(sp<ANativeWindow> consumer, uint32_t width, uint32_t height, int format, size_t size, int *id); virtual status_t createInputStream( uint32_t width, uint32_t height, int format, int *id); virtual status_t createZslStream( uint32_t width, uint32_t height, int depth, /*out*/ int *id, sp<camera3::Camera3ZslStream>* zslStream); virtual status_t createReprocessStreamFromStream(int outputId, int *id); virtual status_t getStreamInfo(int id, Loading Loading @@ -133,14 +143,15 @@ class Camera3Device : String8 mErrorCause; // Mapping of stream IDs to stream instances typedef KeyedVector<int, sp<camera3::Camera3OutputStream> > StreamSet; typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > StreamSet; StreamSet mOutputStreams; sp<camera3::Camera3Stream> mInputStream; int mNextStreamId; // Need to hold on to stream references until configure completes. Vector<sp<camera3::Camera3Stream> > mDeletedStreams; Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; /**** End scope for mLock ****/ Loading @@ -148,7 +159,8 @@ class Camera3Device : public: CameraMetadata mSettings; sp<camera3::Camera3Stream> mInputStream; Vector<sp<camera3::Camera3Stream> > mOutputStreams; Vector<sp<camera3::Camera3OutputStreamInterface> > mOutputStreams; }; typedef List<sp<CaptureRequest> > RequestList; Loading Loading
services/camera/libcameraservice/Android.mk +3 −1 Original line number Diff line number Diff line Loading @@ -25,10 +25,12 @@ LOCAL_SRC_FILES:= \ camera2/JpegCompressor.cpp \ camera2/CaptureSequencer.cpp \ camera2/ProFrameProcessor.cpp \ camera2/ZslProcessor3.cpp \ camera3/Camera3Stream.cpp \ camera3/Camera3InputStream.cpp \ camera3/Camera3OutputStream.cpp \ camera3/Camera3ZslStream.cpp camera3/Camera3ZslStream.cpp \ gui/RingBufferConsumer.cpp \ LOCAL_SHARED_LIBRARIES:= \ libui \ Loading
services/camera/libcameraservice/Camera2Client.cpp +28 −7 Original line number Diff line number Diff line Loading @@ -28,6 +28,9 @@ #include "Camera2Device.h" #include "Camera3Device.h" #include "camera2/ZslProcessor.h" #include "camera2/ZslProcessor3.h" #define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__); #define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__); Loading @@ -51,12 +54,13 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService, int deviceVersion): Camera2ClientBase(cameraService, cameraClient, clientPackageName, cameraId, cameraFacing, clientPid, clientUid, servicePid), mParameters(cameraId, cameraFacing) mParameters(cameraId, cameraFacing), mDeviceVersion(deviceVersion) { ATRACE_CALL(); ALOGI("Camera %d: Opened", cameraId); switch (deviceVersion) { switch (mDeviceVersion) { case CAMERA_DEVICE_API_VERSION_2_0: mDevice = new Camera2Device(cameraId); break; Loading @@ -65,7 +69,7 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService, break; default: ALOGE("Camera %d: Unknown HAL device version %d", cameraId, deviceVersion); cameraId, mDeviceVersion); mDevice = NULL; break; } Loading Loading @@ -114,10 +118,27 @@ status_t Camera2Client::initialize(camera_module_t *module) mCameraId); mJpegProcessor->run(threadName.string()); mZslProcessor = new ZslProcessor(this, mCaptureSequencer); switch (mDeviceVersion) { case CAMERA_DEVICE_API_VERSION_2_0: { sp<ZslProcessor> zslProc = new ZslProcessor(this, mCaptureSequencer); mZslProcessor = zslProc; mZslProcessorThread = zslProc; break; } case CAMERA_DEVICE_API_VERSION_3_0:{ sp<ZslProcessor3> zslProc = new ZslProcessor3(this, mCaptureSequencer); mZslProcessor = zslProc; mZslProcessorThread = zslProc; break; } default: break; } threadName = String8::format("C2-%d-ZslProc", mCameraId); mZslProcessor->run(threadName.string()); mZslProcessorThread->run(threadName.string()); mCallbackProcessor = new CallbackProcessor(this); threadName = String8::format("C2-%d-CallbkProc", Loading Loading @@ -393,7 +414,7 @@ void Camera2Client::disconnect() { mFrameProcessor->requestExit(); mCaptureSequencer->requestExit(); mJpegProcessor->requestExit(); mZslProcessor->requestExit(); mZslProcessorThread->requestExit(); mCallbackProcessor->requestExit(); ALOGV("Camera %d: Waiting for threads", mCameraId); Loading @@ -401,7 +422,7 @@ void Camera2Client::disconnect() { mFrameProcessor->join(); mCaptureSequencer->join(); mJpegProcessor->join(); mZslProcessor->join(); mZslProcessorThread->join(); mCallbackProcessor->join(); ALOGV("Camera %d: Disconnecting device", mCameraId); Loading
services/camera/libcameraservice/Camera2Client.h +4 −2 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ #include "camera2/FrameProcessor.h" #include "camera2/StreamingProcessor.h" #include "camera2/JpegProcessor.h" #include "camera2/ZslProcessor.h" #include "camera2/ZslProcessorInterface.h" #include "camera2/CaptureSequencer.h" #include "camera2/CallbackProcessor.h" #include "Camera2ClientBase.h" Loading Loading @@ -154,6 +154,7 @@ private: void setPreviewCallbackFlagL(Parameters ¶ms, int flag); status_t updateRequests(Parameters ¶ms); int mDeviceVersion; // Used with stream IDs static const int NO_STREAM = -1; Loading @@ -173,7 +174,8 @@ private: sp<camera2::CaptureSequencer> mCaptureSequencer; sp<camera2::JpegProcessor> mJpegProcessor; sp<camera2::ZslProcessor> mZslProcessor; sp<camera2::ZslProcessorInterface> mZslProcessor; sp<Thread> mZslProcessorThread; /** Notification-related members */ Loading
services/camera/libcameraservice/Camera3Device.cpp +170 −4 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ #include <utils/Timers.h> #include "Camera3Device.h" #include "camera3/Camera3OutputStream.h" #include "camera3/Camera3InputStream.h" using namespace android::camera3; Loading Loading @@ -392,6 +393,144 @@ status_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t time return mRequestThread->waitUntilRequestProcessed(requestId, timeout); } status_t Camera3Device::createInputStream( uint32_t width, uint32_t height, int format, int *id) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res; bool wasActive = false; switch (mStatus) { case STATUS_ERROR: ALOGE("%s: Device has encountered a serious error", __FUNCTION__); return INVALID_OPERATION; case STATUS_UNINITIALIZED: ALOGE("%s: Device not initialized", __FUNCTION__); return INVALID_OPERATION; case STATUS_IDLE: // OK break; case STATUS_ACTIVE: ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); mRequestThread->setPaused(true); res = waitUntilDrainedLocked(); if (res != OK) { ALOGE("%s: Can't pause captures to reconfigure streams!", __FUNCTION__); mStatus = STATUS_ERROR; return res; } wasActive = true; break; default: ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); return INVALID_OPERATION; } assert(mStatus == STATUS_IDLE); if (mInputStream != 0) { ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); return INVALID_OPERATION; } sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId, width, height, format); mInputStream = newStream; *id = mNextStreamId++; // Continue captures if active at start if (wasActive) { ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); res = configureStreamsLocked(); if (res != OK) { ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", __FUNCTION__, mNextStreamId, strerror(-res), res); return res; } mRequestThread->setPaused(false); } return OK; } status_t Camera3Device::createZslStream( uint32_t width, uint32_t height, int depth, /*out*/ int *id, sp<Camera3ZslStream>* zslStream) { ATRACE_CALL(); Mutex::Autolock l(mLock); status_t res; bool wasActive = false; switch (mStatus) { case STATUS_ERROR: ALOGE("%s: Device has encountered a serious error", __FUNCTION__); return INVALID_OPERATION; case STATUS_UNINITIALIZED: ALOGE("%s: Device not initialized", __FUNCTION__); return INVALID_OPERATION; case STATUS_IDLE: // OK break; case STATUS_ACTIVE: ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__); mRequestThread->setPaused(true); res = waitUntilDrainedLocked(); if (res != OK) { ALOGE("%s: Can't pause captures to reconfigure streams!", __FUNCTION__); mStatus = STATUS_ERROR; return res; } wasActive = true; break; default: ALOGE("%s: Unexpected status: %d", __FUNCTION__, mStatus); return INVALID_OPERATION; } assert(mStatus == STATUS_IDLE); if (mInputStream != 0) { ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__); return INVALID_OPERATION; } sp<Camera3ZslStream> newStream = new Camera3ZslStream(mNextStreamId, width, height, depth); res = mOutputStreams.add(mNextStreamId, newStream); if (res < 0) { ALOGE("%s: Can't add new stream to set: %s (%d)", __FUNCTION__, strerror(-res), res); return res; } mInputStream = newStream; *id = mNextStreamId++; *zslStream = newStream; // Continue captures if active at start if (wasActive) { ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__); res = configureStreamsLocked(); if (res != OK) { ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)", __FUNCTION__, mNextStreamId, strerror(-res), res); return res; } mRequestThread->setPaused(false); } return OK; } status_t Camera3Device::createStream(sp<ANativeWindow> consumer, uint32_t width, uint32_t height, int format, size_t size, int *id) { ATRACE_CALL(); Loading Loading @@ -545,7 +684,7 @@ status_t Camera3Device::deleteStream(int id) { return INVALID_OPERATION; } sp<Camera3Stream> deletedStream; sp<Camera3StreamInterface> deletedStream; if (mInputStream != NULL && id == mInputStream->getId()) { deletedStream = mInputStream; mInputStream.clear(); Loading Loading @@ -836,7 +975,8 @@ sp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest( streams.data.u8[i]); return NULL; } sp<Camera3OutputStream> stream = mOutputStreams.editValueAt(idx); sp<Camera3OutputStreamInterface> stream = mOutputStreams.editValueAt(idx); // Lazy completion of stream configuration (allocation/registration) // on first use Loading Loading @@ -885,6 +1025,15 @@ status_t Camera3Device::configureStreamsLocked() { } for (size_t i = 0; i < mOutputStreams.size(); i++) { // Don't configure bidi streams twice, nor add them twice to the list if (mOutputStreams[i].get() == static_cast<Camera3StreamInterface*>(mInputStream.get())) { config.num_streams--; continue; } camera3_stream_t *outputStream; outputStream = mOutputStreams.editValueAt(i)->startConfiguration(); if (outputStream == NULL) { Loading Loading @@ -1471,7 +1620,7 @@ bool Camera3Device::RequestThread::threadLoop() { if (nextRequest->mInputStream != NULL) { request.input_buffer = &inputBuffer; res = nextRequest->mInputStream->getBuffer(&inputBuffer); res = nextRequest->mInputStream->getInputBuffer(&inputBuffer); if (res != OK) { SET_ERR("RequestThread: Can't get input buffer, skipping request:" " %s (%d)", strerror(-res), res); Loading Loading @@ -1558,6 +1707,23 @@ bool Camera3Device::RequestThread::threadLoop() { mLatestRequestSignal.signal(); } // Return input buffer back to framework if (request.input_buffer != NULL) { Camera3Stream *stream = Camera3Stream::cast(request.input_buffer->stream); res = stream->returnInputBuffer(*(request.input_buffer)); // Note: stream may be deallocated at this point, if this buffer was the // last reference to it. if (res != OK) { ALOGE("%s: RequestThread: Can't return input buffer for frame %d to" " its stream:%s (%d)", __FUNCTION__, request.frame_number, strerror(-res), res); // TODO: Report error upstream } } return true; } Loading @@ -1571,7 +1737,7 @@ void Camera3Device::RequestThread::cleanUpFailedRequest( } if (request.input_buffer != NULL) { request.input_buffer->status = CAMERA3_BUFFER_STATUS_ERROR; nextRequest->mInputStream->returnBuffer(*(request.input_buffer), 0); nextRequest->mInputStream->returnInputBuffer(*(request.input_buffer)); } for (size_t i = 0; i < request.num_output_buffers; i++) { outputBuffers.editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR; Loading
services/camera/libcameraservice/Camera3Device.h +15 −3 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include "CameraDeviceBase.h" #include "camera3/Camera3Stream.h" #include "camera3/Camera3OutputStream.h" #include "camera3/Camera3ZslStream.h" #include "hardware/camera3.h" Loading Loading @@ -82,6 +83,15 @@ class Camera3Device : virtual status_t createStream(sp<ANativeWindow> consumer, uint32_t width, uint32_t height, int format, size_t size, int *id); virtual status_t createInputStream( uint32_t width, uint32_t height, int format, int *id); virtual status_t createZslStream( uint32_t width, uint32_t height, int depth, /*out*/ int *id, sp<camera3::Camera3ZslStream>* zslStream); virtual status_t createReprocessStreamFromStream(int outputId, int *id); virtual status_t getStreamInfo(int id, Loading Loading @@ -133,14 +143,15 @@ class Camera3Device : String8 mErrorCause; // Mapping of stream IDs to stream instances typedef KeyedVector<int, sp<camera3::Camera3OutputStream> > StreamSet; typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> > StreamSet; StreamSet mOutputStreams; sp<camera3::Camera3Stream> mInputStream; int mNextStreamId; // Need to hold on to stream references until configure completes. Vector<sp<camera3::Camera3Stream> > mDeletedStreams; Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams; /**** End scope for mLock ****/ Loading @@ -148,7 +159,8 @@ class Camera3Device : public: CameraMetadata mSettings; sp<camera3::Camera3Stream> mInputStream; Vector<sp<camera3::Camera3Stream> > mOutputStreams; Vector<sp<camera3::Camera3OutputStreamInterface> > mOutputStreams; }; typedef List<sp<CaptureRequest> > RequestList; Loading