aboutsummaryrefslogtreecommitdiffstats
path: root/android/camera/camera-service.c
diff options
context:
space:
mode:
authorVladimir Chtchetkine <vchtchetkine@google.com>2011-11-23 13:03:37 -0800
committerVladimir Chtchetkine <vchtchetkine@google.com>2011-12-05 09:17:35 -0800
commit37fb84f8b26e3061c1ccb404bf4c962eed5e6057 (patch)
treeb60e5b1f69a291c9396c665ee6556a059f481fc4 /android/camera/camera-service.c
parent4e61742d4f26cefb1baf8d2dc5e7dc8b85a78549 (diff)
downloadexternal_qemu-37fb84f8b26e3061c1ccb404bf4c962eed5e6057.zip
external_qemu-37fb84f8b26e3061c1ccb404bf4c962eed5e6057.tar.gz
external_qemu-37fb84f8b26e3061c1ccb404bf4c962eed5e6057.tar.bz2
Implements white balance and exposure compensation for emulated webcam
Change-Id: Id2dbb227280f0c0e1b5708ef78b9f19b087f92d5
Diffstat (limited to 'android/camera/camera-service.c')
-rw-r--r--android/camera/camera-service.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/android/camera/camera-service.c b/android/camera/camera-service.c
index e551dca..8f0e2ec 100644
--- a/android/camera/camera-service.c
+++ b/android/camera/camera-service.c
@@ -1167,10 +1167,15 @@ _camera_client_query_stop(CameraClient* cc, QemudClient* qc, const char* param)
* Param:
* cc - Queried camera client descriptor.
* qc - Qemu client for the emulated camera.
- * param - Query parameters. Parameters for this query must contain a 'video',
- * and a 'preview' parameters, both must be decimal values, defining size of
- * requested video, and preview frames respectively. Zero value for any of
- * the parameters means that this particular frame is not requested.
+ * param - Query parameters. Parameters for this query are formatted as such:
+ * video=<size> preview=<size> whiteb=<red>,<green>,<blue> expcomp=<comp>
+ * where:
+ * - 'video', and 'preview' both must be decimal values, defining size of
+ * requested video, and preview frames respectively. Zero value for any
+ * of these parameters means that this particular frame is not requested.
+ * - whiteb contains float values required to calculate whilte balance.
+ * - expcomp contains a float value required to calculate exposure
+ * compensation.
*/
static void
_camera_client_query_frame(CameraClient* cc, QemudClient* qc, const char* param)
@@ -1182,6 +1187,8 @@ _camera_client_query_frame(CameraClient* cc, QemudClient* qc, const char* param)
int fbs_num = 0;
size_t payload_size;
uint64_t tick;
+ float r_scale = 1.0f, g_scale = 1.0f, b_scale = 1.0f, exp_comp = 1.0f;
+ char tmp[256];
/* Sanity check. */
if (cc->video_frame == NULL) {
@@ -1201,6 +1208,22 @@ _camera_client_query_frame(CameraClient* cc, QemudClient* qc, const char* param)
return;
}
+ /* Pull white balance values. */
+ if (!_get_param_value(param, "whiteb", tmp, sizeof(tmp))) {
+ if (sscanf(tmp, "%g,%g,%g", &r_scale, &g_scale, &b_scale) != 3) {
+ D("Invalid value '%s' for parameter 'whiteb'", tmp);
+ r_scale = g_scale = b_scale = 1.0f;
+ }
+ }
+
+ /* Pull exposure compensation. */
+ if (!_get_param_value(param, "expcomp", tmp, sizeof(tmp))) {
+ if (sscanf(tmp, "%g", &exp_comp) != 1) {
+ D("Invalid value '%s' for parameter 'whiteb'", tmp);
+ exp_comp = 1.0f;
+ }
+ }
+
/* Verify that framebuffer sizes match the ones that the started camera
* operates with. */
if ((video_size != 0 && cc->video_frame_size != video_size) ||
@@ -1231,7 +1254,8 @@ _camera_client_query_frame(CameraClient* cc, QemudClient* qc, const char* param)
/* Capture new frame. */
tick = _get_timestamp();
- repeat = camera_device_read_frame(cc->camera, fbs, fbs_num);
+ repeat = camera_device_read_frame(cc->camera, fbs, fbs_num,
+ r_scale, g_scale, b_scale, exp_comp);
/* Note that there is no (known) way how to wait on next frame being
* available, so we could dequeue frame buffer from the device only when we
@@ -1248,7 +1272,8 @@ _camera_client_query_frame(CameraClient* cc, QemudClient* qc, const char* param)
(_get_timestamp() - tick) < 2000000LL) {
/* Sleep for 10 millisec before repeating the attempt. */
_camera_sleep(10);
- repeat = camera_device_read_frame(cc->camera, fbs, fbs_num);
+ repeat = camera_device_read_frame(cc->camera, fbs, fbs_num,
+ r_scale, g_scale, b_scale, exp_comp);
}
if (repeat == 1 && !cc->frames_cached) {
/* Waited too long for the first frame. */