summaryrefslogtreecommitdiffstats
path: root/camera/AppCallbackNotifier.cpp
diff options
context:
space:
mode:
authorTyler Luu <tluu@ti.com>2011-10-07 11:57:42 -0500
committerIliyan Malchev <malchev@google.com>2011-10-07 11:10:18 -0700
commit8e52e3bcc31f65a699c25557cf3026d324e631b4 (patch)
tree4db79a52ddae9de67f789094584fde1e66670c17 /camera/AppCallbackNotifier.cpp
parentc160a1f85c70e49a7613d774e2d99035f3cb4851 (diff)
downloadhardware_ti_omap4xxx-8e52e3bcc31f65a699c25557cf3026d324e631b4.zip
hardware_ti_omap4xxx-8e52e3bcc31f65a699c25557cf3026d324e631b4.tar.gz
hardware_ti_omap4xxx-8e52e3bcc31f65a699c25557cf3026d324e631b4.tar.bz2
omap4xxx: camera: cancel and flush for SW JPEG encoder
Fixes b/5378650 1. Add method to externally cancel Encoder class while in the middle of encoding. 2. Add queue in AppCallbackNotifier to track all the encoding sessions. When stopping AppCallbackNotifier if any encoding sessions are still ongoing, cancel and wait for the threads to return. Previously, it was possible for Encoder threads to still be running when the preview and images buffers were freed. Change-Id: Ib123d1644dfa7058a6f50f0001b4d05359853827 Signed-off-by: Tyler Luu <tluu@ti.com> Signed-off-by: Iliyan Malchev <malchev@google.com>
Diffstat (limited to 'camera/AppCallbackNotifier.cpp')
-rw-r--r--camera/AppCallbackNotifier.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp
index f88cc3f..a69cfc0 100644
--- a/camera/AppCallbackNotifier.cpp
+++ b/camera/AppCallbackNotifier.cpp
@@ -31,6 +31,7 @@
namespace android {
const int AppCallbackNotifier::NOTIFIER_TIMEOUT = -1;
+KeyedVector<void*, sp<Encoder_libjpeg> > gEncoderQueue;
void AppCallbackNotifierEncoderCallback(void* main_jpeg,
void* thumb_jpeg,
@@ -53,6 +54,7 @@ void AppCallbackNotifier::EncoderDoneCb(void* main_jpeg, void* thumb_jpeg, Camer
Encoder_libjpeg::params *main_param = NULL, *thumb_param = NULL;
size_t jpeg_size;
uint8_t* src = NULL;
+ sp<Encoder_libjpeg> encoder = NULL;
LOG_FUNCTION_NAME;
@@ -144,7 +146,14 @@ void AppCallbackNotifier::EncoderDoneCb(void* main_jpeg, void* thumb_jpeg, Camer
delete (ExifElementsTable*) cookie2;
}
- mFrameProvider->returnFrame(src, type);
+ if (mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) {
+ encoder = gEncoderQueue.valueFor(src);
+ if (encoder.get()) {
+ gEncoderQueue.removeItem(src);
+ encoder.clear();
+ }
+ mFrameProvider->returnFrame(src, type);
+ }
LOG_FUNCTION_NAME_EXIT;
}
@@ -868,6 +877,7 @@ void AppCallbackNotifier::notifyFrame()
raw_picture,
exif_data);
encoder->run();
+ gEncoderQueue.add(frame->mBuffer, encoder);
encoder.clear();
}
else if ( ( CameraFrame::IMAGE_FRAME == frame->mFrameType ) &&
@@ -1668,6 +1678,8 @@ status_t AppCallbackNotifier::start()
mNotifierState = AppCallbackNotifier::NOTIFIER_STARTED;
CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STARTED \n");
+ gEncoderQueue.clear();
+
LOG_FUNCTION_NAME_EXIT;
return NO_ERROR;
@@ -1691,6 +1703,16 @@ status_t AppCallbackNotifier::stop()
CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STOPPED \n");
}
+ while(!gEncoderQueue.isEmpty()) {
+ sp<Encoder_libjpeg> encoder = gEncoderQueue.valueAt(0);
+ if(encoder.get()) {
+ encoder->cancel();
+ encoder->join();
+ encoder.clear();
+ }
+ gEncoderQueue.removeItemsAt(0);
+ }
+
LOG_FUNCTION_NAME_EXIT;
return NO_ERROR;
}