camera_test_menu.cpp revision c322989ae6ff6769490828de1b5eda12b749cce9
1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdlib.h>
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <unistd.h>
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/types.h>
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/stat.h>
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <fcntl.h>
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <time.h>
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <semaphore.h>
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <pthread.h>
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <surfaceflinger/Surface.h>
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <surfaceflinger/ISurface.h>
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <surfaceflinger/ISurfaceComposer.h>
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <surfaceflinger/ISurfaceComposerClient.h>
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <surfaceflinger/SurfaceComposerClient.h>
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <camera/Camera.h>
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <camera/ICamera.h>
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <media/mediarecorder.h>
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <binder/IPCThreadState.h>
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <binder/ProcessState.h>
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <binder/IServiceManager.h>
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <cutils/properties.h>
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <camera/CameraParameters.h>
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <system/audio.h>
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <system/camera.h>
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <cutils/memory.h>
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <utils/Log.h>
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <sys/wait.h>
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "camera_test.h"
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevusing namespace android;
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint camera_index = 0;
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint print_menu;
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsp<Camera> camera;
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsp<MediaRecorder> recorder;
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsp<SurfaceComposerClient> client;
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsp<SurfaceControl> surfaceControl;
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsp<Surface> previewSurface;
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraParameters params;
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevfloat compensation = 0.0;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevdouble latitude = 0.0;
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevdouble longitude = 0.0;
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevdouble degree_by_step = 17.5609756;//..0975609756097;
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevdouble altitude = 0.0;
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint awb_mode = 0;
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint effects_mode = 0;
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint scene_mode = 0;
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint caf_mode = 0;
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint vnf_mode = 0;
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint vstab_mode = 0;
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint tempBracketRange = 1;
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint tempBracketIdx = 0;
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint measurementIdx = 0;
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint expBracketIdx = 0;
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint AutoConvergenceModeIDX = 0;
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ManualConvergenceValuesIDX = 0;
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ManualConvergenceDefaultValueIDX = 2;
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint gbceIDX = 0;
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint rotation = 0;
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool reSizePreview = true;
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool hardwareActive = false;
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool recordingMode = false;
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool previewRunning = false;
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint saturation = 0;
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint zoomIDX = 0;
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint videoCodecIDX = 0;
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint audioCodecIDX = 0;
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint outputFormatIDX = 0;
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint contrast = 0;
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint brightness = 0;
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevunsigned int burst = 0;
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint sharpness = 0;
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint iso_mode = 0;
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint capture_mode = 0;
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint exposure_mode = 0;
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ippIDX = 0;
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ippIDX_old = 0;
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint previewFormat = 0;
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint jpegQuality = 85;
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint thumbQuality = 85;
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint flashIdx = 0;
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint fpsRangeIdx = 0;
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevtimeval autofocus_start, picture_start;
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar script_name[80];
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint prevcnt = 0;
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint videoFd = -1;
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint elockidx = 0;
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint wblockidx = 0;
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar dir_path[80] = SDCARD_PATH;
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *cameras[] = {"Primary Camera", "Secondary Camera 1", "Stereo Camera", "USB Camera", "Fake Camera"};
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *measurement[] = {"disable", "enable"};
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *expBracketing[] = {"disable", "enable"};
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *expBracketingRange[] = {"", "-30,0,30,0,-30"};
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *tempBracketing[] = {"disable", "enable"};
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *faceDetection[] = {"disable", "enable"};
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *lock[] = {"false", "true"};
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *ipp_mode[] = { "off", "Chroma Suppression", "Edge Enhancement" };
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *ipp_mode[] = { "off", "ldc", "nsf", "ldc-nsf" };
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *iso [] = { "auto", "100", "200", "400", "800", "1200", "1600"};
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *effects [] = {
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "none",
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "mono",
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "negative",
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "solarize",
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "sepia",
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "whiteboard",
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "blackboard",
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "cool",
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "emboss"
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "none",
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "mono",
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "negative",
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "solarize",
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "sepia",
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "vivid",
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "whiteboard",
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "blackboard",
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "cool",
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "emboss",
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "blackwhite",
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "aqua",
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "posterize"
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char CameraParameters::FLASH_MODE_OFF[] = "off";
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char CameraParameters::FLASH_MODE_AUTO[] = "auto";
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char CameraParameters::FLASH_MODE_ON[] = "on";
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char CameraParameters::FLASH_MODE_RED_EYE[] = "red-eye";
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char CameraParameters::FLASH_MODE_TORCH[] = "torch";
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *flashModes[] = {
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "off",
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "auto",
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "on",
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "red-eye",
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "torch",
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "fill-in",
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *caf [] = { "Off", "On" };
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *vnf [] = { "Off", "On" };
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *vstab [] = { "Off", "On" };
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *scene [] = {
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "auto",
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "portrait",
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "landscape",
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "night",
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "night-portrait",
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "fireworks",
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "snow",
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "action",
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "auto",
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "portrait",
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "landscape",
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "night",
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "night-portrait",
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "night-indoor",
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "fireworks",
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "sport",
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "cine",
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "beach",
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "snow",
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "mood",
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "closeup",
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "underwater",
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "document",
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "barcode",
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "oldfilm",
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "candlelight",
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "party",
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "steadyphoto",
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "sunset",
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "action",
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "theatre"
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *strawb_mode[] = {
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "auto",
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "incandescent",
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "fluorescent",
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "daylight",
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "horizon",
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "shadow",
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "tungsten",
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "shade",
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "twilight",
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "warm-fluorescent",
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "facepriority",
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "sunset"
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_cam =  ARRAY_SIZE(cameras);
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpreview_size previewSize [] = {
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 0,   0,  "NULL"},
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 128, 96, "SQCIF" },
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 176, 144, "QCIF" },
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 352, 288, "CIF" },
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 320, 240, "QVGA" },
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 352, 288, "CIF" },
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 640, 480, "VGA" },
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 720, 480, "NTSC" },
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 720, 576, "PAL" },
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 800, 480, "WVGA" },
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 848, 480, "WVGA2"},
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 864, 480, "WVGA3"},
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 992, 560, "WVGA4"},
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1280, 720, "HD" },
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1920, 1080, "FULLHD"},
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_previewSize =  ARRAY_SIZE(previewSize);
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevVcapture_size VcaptureSize [] = {
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 128, 96, "SQCIF" },
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 176, 144, "QCIF" },
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 352, 288, "CIF" },
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 320, 240, "QVGA" },
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 640, 480, "VGA" },
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 704, 480, "TVNTSC" },
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 704, 576, "TVPAL" },
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 720, 480, "D1NTSC" },
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 720, 576, "D1PAL" },
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 800, 480, "WVGA" },
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  #if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 848, 480, "WVGA2"},
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 864, 480, "WVGA3"},
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 992, 560, "WVGA4"},
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  #endif
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1280, 720, "HD" },
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1920, 1080, "FULLHD"},
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t lenght_Vcapture_size = ARRAY_SIZE(VcaptureSize);
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevcapture_Size captureSize[] = {
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  320, 240,  "QVGA" },
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  640, 480,  "VGA" },
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  800, 600,  "SVGA" },
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1152, 864,  "1MP" },
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1280, 1024, "1.3MP" },
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 1600, 1200,  "2MP" },
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 2048, 1536,  "3MP" },
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 2592, 1944,  "5MP" },
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 2608, 1960,  "5MP" },
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 3264, 2448,  "8MP" },
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 3648, 2736, "10MP"},
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 4032, 3024, "12MP"},
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_capture_Size = ARRAY_SIZE(captureSize);
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevoutformat outputFormat[] = {
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        { OUTPUT_FORMAT_THREE_GPP, "3gp" },
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        { OUTPUT_FORMAT_MPEG_4, "mp4" },
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    };
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_outformat = ARRAY_SIZE(outputFormat);
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvideo_Codecs videoCodecs[] = {
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { VIDEO_ENCODER_H263, "H263" },
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { VIDEO_ENCODER_H264, "H264" },
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { VIDEO_ENCODER_MPEG_4_SP, "MPEG4"}
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_video_Codecs = ARRAY_SIZE(videoCodecs);
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevaudio_Codecs audioCodecs[] = {
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { AUDIO_ENCODER_AMR_NB, "AMR_NB" },
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { AUDIO_ENCODER_AMR_WB, "AMR_WB" },
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { AUDIO_ENCODER_AAC, "AAC" },
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { AUDIO_ENCODER_AAC_PLUS, "AAC+" },
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { AUDIO_ENCODER_EAAC_PLUS, "EAAC+" }
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_audio_Codecs = ARRAY_SIZE(audioCodecs);
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevV_bitRate VbitRate[] = {
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {    64000, "64K"  },
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   128000, "128K" },
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   192000, "192K" },
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   240000, "240K" },
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   320000, "320K" },
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   360000, "360K" },
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   384000, "384K" },
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   420000, "420K" },
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {   768000, "768K" },
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  1000000, "1M"   },
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  1500000, "1.5M" },
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  2000000, "2M"   },
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  4000000, "4M"   },
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  6000000, "6M"   },
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {  8000000, "8M"   },
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 10000000, "10M"  },
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_V_bitRate = ARRAY_SIZE(VbitRate);
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevZoom zoom[] = {
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 0,  "1x"  },
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 12, "1.5x"},
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 20, "2x"  },
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 27, "2.5x"},
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 32, "3x"  },
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 36, "3.5x"},
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 40, "4x"  },
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { 60, "8x"  },
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_Zoom = ARRAY_SIZE(zoom);
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevfps_ranges fpsRanges[] = {
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "5000,30000", "[5:30]" },
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "5000,10000", "[5:10]" },
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "5000,15000", "[5:15]" },
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "5000,20000", "[5:20]" },
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_fps_ranges = ARRAY_SIZE(fpsRanges);
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevfpsConst_Ranges fpsConstRanges[] = {
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "5000,5000", "[5:5]", 5 },
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "10000,10000", "[10:10]", 10 },
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "15000,15000", "[15:15]", 15 },
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "20000,20000", "[20:20]", 20 },
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "25000,25000", "[25:25]", 25 },
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "30000,30000", "[30:30]", 30 },
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_fpsConst_Ranges = ARRAY_SIZE(fpsConstRanges);
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevfpsConst_RangesSec fpsConstRangesSec[] = {
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "5000,5000", "[5:5]", 5 },
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "10000,10000", "[10:10]", 10 },
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "15000,15000", "[15:15]", 15 },
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "20000,20000", "[20:20]", 20 },
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "25000,25000", "[25:25]", 25 },
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { "27000,27000", "[27:27]", 27 },
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevsize_t length_fpsConst_RangesSec = ARRAY_SIZE(fpsConstRangesSec);
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *antibanding[] = {
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "off",
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "auto",
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "50hz",
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "60hz",
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint antibanding_mode = 0;
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *focus[] = {
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "auto",
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "infinity",
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "macro",
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "continuous-video",
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "extended",
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "portrait",
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint focus_mode = 0;
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpixel_format pixelformat[] = {
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { HAL_PIXEL_FORMAT_YCbCr_422_I, CameraParameters::PIXEL_FORMAT_YUV422I },
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { HAL_PIXEL_FORMAT_YCrCb_420_SP, CameraParameters::PIXEL_FORMAT_YUV420SP },
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { HAL_PIXEL_FORMAT_RGB_565, CameraParameters::PIXEL_FORMAT_RGB565 },
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { -1, CameraParameters::PIXEL_FORMAT_JPEG },
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  { -1, "raw" },
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  };
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *codingformat[] = {"yuv422i-yuyv", "yuv420sp", "rgb565", "jpeg", "raw", "jps", "mpo", "raw+jpeg", "raw+mpo"};
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *gbce[] = {"disable", "enable"};
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint pictureFormat = 3; // jpeg
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *exposure[] = {"auto", "macro", "portrait", "landscape", "sports", "night", "night-portrait", "backlighting", "manual"};
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *capture[] = { "high-performance", "high-quality", "video-mode" };
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *autoconvergencemode[] = { "mode-disable", "mode-frame", "mode-center", "mode-fft", "mode-manual" };
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *manualconvergencevalues[] = { "-100", "-50", "-30", "-25", "0", "25", "50", "100" };
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst struct {
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int fps;
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} frameRate[] = {
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {0},
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {5},
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {10},
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {15},
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {20},
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {25},
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {30}
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint thumbSizeIDX =  3;
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint previewSizeIDX = ARRAY_SIZE(previewSize) - 1;
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint captureSizeIDX = ARRAY_SIZE(captureSize) - 1;
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1;
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint frameRateIDXSec = ARRAY_SIZE(fpsConstRangesSec) - 1;
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 1;
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint VbitRateIDX = ARRAY_SIZE(VbitRate) - 1;
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic unsigned int recording_counter = 1;
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint dump_preview = 0;
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint bufferStarvationTest = 0;
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool showfps = false;
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char *metering[] = {
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "center",
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    "average",
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint meter_mode = 0;
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool bLogSysLinkTrace = true;
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool stressTest = false;
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool stopScript = false;
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint restartCount = 0;
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Calculate delay from a reference time */
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevunsigned long long timeval_delay(const timeval *ref) {
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned long long st, end, delay;
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    timeval current_time;
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&current_time, 0);
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    st = ref->tv_sec * 1000000 + ref->tv_usec;
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    end = current_time.tv_sec * 1000000 + current_time.tv_usec;
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    delay = end - st;
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return delay;
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Callback for takePicture() */
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid my_raw_callback(const sp<IMemory>& mem) {
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static int      counter = 1;
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned char   *buff = NULL;
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int             size;
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int             fd = -1;
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char            fn[256];
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mem == NULL)
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Start preview after capture.
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->startPreview();
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fn[0] = 0;
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sprintf(fn, "/sdcard/img%03d.raw", counter);
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (fd < 0)
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size = mem->size();
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (size <= 0)
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    buff = (unsigned char *)mem->pointer();
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!buff)
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (size != write(fd, buff, size))
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    counter++;
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("%s: buffer=%08X, size=%d stored at %s\n",
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           __FUNCTION__, (int)buff, size, fn);
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevout:
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (fd >= 0)
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(fd);
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid saveFile(const sp<IMemory>& mem) {
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static int      counter = 1;
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned char   *buff = NULL;
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int             size;
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int             fd = -1;
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char            fn[256];
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mem == NULL)
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fn[0] = 0;
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sprintf(fn, "/sdcard/preview%03d.yuv", counter);
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(fd < 0) {
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOGE("Unable to open file %s: %s", fn, strerror(fd));
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size = mem->size();
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (size <= 0) {
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOGE("IMemory object is of zero size");
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    buff = (unsigned char *)mem->pointer();
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!buff) {
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOGE("Buffer pointer is invalid");
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (size != write(fd, buff, size))
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    counter++;
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("%s: buffer=%08X, size=%d\n",
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           __FUNCTION__, (int)buff, size);
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevout:
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (fd >= 0)
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(fd);
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid debugShowFPS()
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static int mFrameCount = 0;
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static int mLastFrameCount = 0;
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static nsecs_t mLastFpsTime = 0;
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static float mFps = 0;
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFrameCount++;
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mFrameCount % 30 ) == 0 ) {
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        nsecs_t now = systemTime();
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        nsecs_t diff = now - mLastFpsTime;
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mFps =  ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff;
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mLastFpsTime = now;
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mLastFrameCount = mFrameCount;
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("####### [%d] Frames, %f FPS", mFrameCount, mFps);
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Callback for startPreview() */
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid my_preview_callback(const sp<IMemory>& mem) {
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("PREVIEW Callback 0x%x", ( unsigned int ) mem->pointer());
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (dump_preview) {
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(prevcnt==50)
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        saveFile(mem);
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        prevcnt++;
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        uint8_t *ptr = (uint8_t*) mem->pointer();
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9]);
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    debugShowFPS();
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Callback for takePicture() */
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid my_jpeg_callback(const sp<IMemory>& mem) {
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static int  counter = 1;
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned char   *buff = NULL;
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int     size;
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int     fd = -1;
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char        fn[256];
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Start preview after capture.
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->startPreview();
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mem == NULL)
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fn[0] = 0;
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sprintf(fn, "%s/img%03d.jpg", dir_path,counter);
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(fd < 0) {
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOGE("Unable to open file %s: %s", fn, strerror(fd));
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    size = mem->size();
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (size <= 0) {
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOGE("IMemory object is of zero size");
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    buff = (unsigned char *)mem->pointer();
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!buff) {
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOGE("Buffer pointer is invalid");
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto out;
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (size != write(fd, buff, size))
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Bad Write int a %s error (%d)%s\n", fn, errno, strerror(errno));
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    counter++;
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("%s: buffer=%08X, size=%d stored at %s\n",
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           __FUNCTION__, (int)buff, size, fn);
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevout:
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (fd >= 0)
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(fd);
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid my_face_callback(camera_frame_metadata_t *metadata) {
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int idx;
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == metadata ) {
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    for ( idx = 0 ; idx < metadata->number_of_faces ; idx++ ) {
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Face %d at %d,%d %d,%d \n",
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               idx,
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               metadata->faces[idx].rect[0],
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               metadata->faces[idx].rect[1],
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               metadata->faces[idx].rect[2],
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               metadata->faces[idx].rect[3]);
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHandler::notify(int32_t msgType, int32_t ext1, int32_t ext2) {
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("Notify cb: %d %d %d\n", msgType, ext1, ext2);
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( msgType & CAMERA_MSG_FOCUS )
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("AutoFocus %s in %llu us\n", (ext1) ? "OK" : "FAIL", timeval_delay(&autofocus_start));
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( msgType & CAMERA_MSG_SHUTTER )
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Shutter done in %llu us\n", timeval_delay(&picture_start));
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( msgType & CAMERA_MSG_ERROR && (ext1 == 1))
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Camera Test CAMERA_MSG_ERROR.....\n");
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (stressTest)
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          {
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Camera Test Notified of Error Restarting.....\n");
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopScript = true;
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          {
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Camera Test Notified of Error Stopping.....\n");
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopScript =false;
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopPreview();
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (recordingMode)
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              {
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                stopRecording();
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                closeRecorder();
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                recordingMode = false;
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              }
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHandler::postData(int32_t msgType,
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             const sp<IMemory>& dataPtr,
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             camera_frame_metadata_t *metadata) {
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("Data cb: %d\n", msgType);
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( msgType & CAMERA_MSG_PREVIEW_FRAME )
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        my_preview_callback(dataPtr);
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( msgType & CAMERA_MSG_RAW_IMAGE ) {
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("RAW done in %llu us\n", timeval_delay(&picture_start));
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        my_raw_callback(dataPtr);
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (msgType & CAMERA_MSG_POSTVIEW_FRAME) {
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Postview frame %llu us\n", timeval_delay(&picture_start));
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) {
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("JPEG done in %llu us\n", timeval_delay(&picture_start));
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        my_jpeg_callback(dataPtr);
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( msgType & CAMERA_MSG_PREVIEW_METADATA ) &&
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ( NULL != metadata ) ) {
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Face detected %d \n", metadata->number_of_faces);
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        my_face_callback(metadata);
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHandler::postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("Recording cb: %d %lld %p\n", msgType, timestamp, dataPtr.get());
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    static uint32_t count = 0;
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //if(count==100)
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //saveFile(dataPtr);
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    count++;
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint8_t *ptr = (uint8_t*) dataPtr->pointer();
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("VID_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9]);
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->releaseRecordingFrame(dataPtr);
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint createPreviewSurface(unsigned int width, unsigned int height, int32_t pixFormat) {
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int previewWidth, previewHeight;
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( MAX_PREVIEW_SURFACE_WIDTH < width ) {
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewWidth = MAX_PREVIEW_SURFACE_WIDTH;
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewWidth = width;
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( MAX_PREVIEW_SURFACE_HEIGHT < height ) {
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewHeight = MAX_PREVIEW_SURFACE_HEIGHT;
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewHeight = height;
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    client = new SurfaceComposerClient();
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == client.get() ) {
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Unable to establish connection to Surface Composer \n");
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    surfaceControl = client->createSurface(0,
759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                           previewWidth,
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                           previewHeight,
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                           pixFormat);
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    previewSurface = surfaceControl->getSurface();
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    client->openGlobalTransaction();
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    surfaceControl->setLayer(100000);
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    surfaceControl->setPosition(0, 0);
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    surfaceControl->setSize(previewWidth, previewHeight);
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    surfaceControl->show();
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    client->closeGlobalTransaction();
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid printSupportedParams()
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Cameras: %s", params.get("camera-indexes"));
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Picture Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES));
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Picture Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS));
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Preview Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES));
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Preview Formats: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS));
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Preview Frame Rates: %s", params.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES));
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Thumbnail Sizes: %s", params.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES));
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Whitebalance Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE));
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Effects: %s", params.get(CameraParameters::KEY_SUPPORTED_EFFECTS));
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Scene Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES));
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Focus Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES));
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Antibanding Options: %s", params.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING));
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Flash Modes: %s", params.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES));
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("\n\r\tSupported Focus Areas: %d", params.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS));
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != params.get(CameraParameters::KEY_FOCUS_DISTANCES) ) {
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("\n\r\tFocus Distances: %s \n", params.get(CameraParameters::KEY_FOCUS_DISTANCES));
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint destroyPreviewSurface() {
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != previewSurface.get() ) {
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewSurface.clear();
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != surfaceControl.get() ) {
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        surfaceControl->clear();
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        surfaceControl.clear();
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != client.get() ) {
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        client->dispose();
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        client.clear();
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint openRecorder() {
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    recorder = new MediaRecorder();
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == recorder.get() ) {
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Error while creating MediaRecorder\n");
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint closeRecorder() {
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == recorder.get() ) {
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("invalid recorder reference\n");
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->init() < 0 ) {
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("recorder failed to initialize\n");
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->close() < 0 ) {
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("recorder failed to close\n");
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->release() < 0 ) {
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while releasing recorder\n");
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    recorder.clear();
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint configureRecorder() {
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char videoFile[256],vbit_string[50];
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    videoFd = -1;
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NULL == recorder.get() ) || ( NULL == camera.get() ) ) {
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("invalid recorder and/or camera references\n");
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->unlock();
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sprintf(vbit_string,"video-param-encoding-bitrate=%u", VbitRate[VbitRateIDX].bit_rate);
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 bit_rate(vbit_string);
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setParameters(bit_rate) < 0 ) {
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring bit rate\n");
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setCamera(camera->remote(), camera->getRecordingProxy()) < 0 ) {
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while setting the camera\n");
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setVideoSource(VIDEO_SOURCE_CAMERA) < 0 ) {
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring camera video source\n");
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setAudioSource(AUDIO_SOURCE_MIC) < 0 ) {
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring camera audio source\n");
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setOutputFormat(outputFormat[outputFormatIDX].type) < 0 ) {
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring output format\n");
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mkdir("/mnt/sdcard/videos",0777) == -1)
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         printf("\n Directory --videos-- was not created \n");
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sprintf(videoFile, "/mnt/sdcard/videos/video%d.%s", recording_counter,outputFormat[outputFormatIDX].desc);
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    videoFd = open(videoFile, O_CREAT | O_RDWR);
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(videoFd < 0){
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Error while creating video filename\n");
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setOutputFile(videoFd, 0, 0) < 0 ) {
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring video filename\n");
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    recording_counter++;
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (camera_index == 0) {
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( recorder->setVideoFrameRate(fpsConstRanges[frameRateIDX].constFramerate) < 0 ) {
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("error while configuring video framerate\n");
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else  {
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( recorder->setVideoFrameRate(fpsConstRangesSec[frameRateIDXSec].constFramerate) < 0 ) {
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("error while configuring video framerate\n");
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setVideoSize(VcaptureSize[VcaptureSizeIDX].width, VcaptureSize[VcaptureSizeIDX].height) < 0 ) {
941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring video size\n");
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setVideoEncoder(videoCodecs[videoCodecIDX].type) < 0 ) {
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring video codec\n");
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setAudioEncoder(audioCodecs[audioCodecIDX].type) < 0 ) {
953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring audio codec\n");
954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->setPreviewSurface( surfaceControl->getSurface() ) < 0 ) {
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("error while configuring preview surface\n");
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint startRecording() {
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NULL == recorder.get() ) || ( NULL == camera.get() ) ) {
969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("invalid recorder and/or camera references\n");
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->unlock();
975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->prepare() < 0 ) {
977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("recorder prepare failed\n");
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->start() < 0 ) {
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("recorder start failed\n");
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint stopRecording() {
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == recorder.get() ) {
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("invalid recorder reference\n");
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( recorder->stop() < 0 ) {
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("recorder failed to stop\n");
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 < videoFd ) {
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        close(videoFd);
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint openCamera() {
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("openCamera(camera_index=%d)\n", camera_index);
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera = Camera::connect(camera_index);
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == camera.get() ) {
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Unable to connect to CameraService\n");
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("Retrying... \n");
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sleep(1);
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera = Camera::connect(camera_index);
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == camera.get() ) {
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Giving up!! \n");
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params = camera->getParameters();
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->setParameters(params.flatten());
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->setListener(new CameraHandler());
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    hardwareActive = true;
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint closeCamera() {
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == camera.get() ) {
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("invalid camera reference\n");
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -1;
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera->disconnect();
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera.clear();
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    hardwareActive = false;
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Workaround for an issue seen with ICS SurfaceFlinger.
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//The last surface created is not getting rendered on screen,
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//in our case this is the preview surface. Here we artificially wait
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//for the preview to start and create a new temporary surface, which
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//gets destroyed immediately.
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint surfaceWorkaround(unsigned int width, unsigned int height, int32_t pixFormat) {
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sleep(1);
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == client.get() ) {
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sp<SurfaceControl> tmpSurface = client->createSurface(0,
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                          width,
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                          height,
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                          pixFormat);
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != tmpSurface.get() ) {
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        tmpSurface->clear();
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        tmpSurface.clear();
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -ENOMEM;
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint startPreview() {
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int previewWidth, previewHeight;
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (reSizePreview) {
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(recordingMode)
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewWidth = VcaptureSize[VcaptureSizeIDX].width;
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewHeight = VcaptureSize[VcaptureSizeIDX].height;
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }else
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewWidth = previewSize[previewSizeIDX].width;
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewHeight = previewSize[previewSizeIDX].height;
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( createPreviewSurface(previewWidth,
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                  previewHeight,
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                  pixelformat[previewFormat].pixelFormatDesc) < 0 ) {
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Error while creating preview surface\n");
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !hardwareActive ) {
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            openCamera();
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        params.setPreviewSize(previewWidth, previewHeight);
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->setParameters(params.flatten());
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->setPreviewDisplay(previewSurface);
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!hardwareActive) prevcnt = 0;
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->startPreview();
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewRunning = true;
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        reSizePreview = false;
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        surfaceWorkaround( previewWidth, previewHeight, pixelformat[previewFormat].pixelFormatDesc);
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid stopPreview() {
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( hardwareActive ) {
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->stopPreview();
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        destroyPreviewSurface();
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        previewRunning  = false;
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        reSizePreview = true;
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        closeCamera();
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid initDefaults() {
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    camera_index = 0;
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    antibanding_mode = 0;
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    focus_mode = 0;
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fpsRangeIdx = 0;
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    previewSizeIDX = 1;  /* Default resolution set to WVGA */
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    captureSizeIDX = 3;  /* Default capture resolution is 8MP */
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    frameRateIDX = ARRAY_SIZE(fpsConstRanges) - 1;      /* Default frame rate is 30 FPS */
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 6;/* Default video record is WVGA */
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    VcaptureSizeIDX = ARRAY_SIZE(VcaptureSize) - 2;/* Default video record is WVGA */
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    VbitRateIDX = ARRAY_SIZE(VbitRate) - 4;        /*Default video bit rate is 4M */
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    thumbSizeIDX = 0;
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    compensation = 0.0;
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    awb_mode = 0;
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    effects_mode = 0;
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    scene_mode = 0;
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    caf_mode = 0;
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    vnf_mode = 0;
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    vstab_mode = 0;
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    expBracketIdx = 0;
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    flashIdx = 0;
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    rotation = 0;
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    zoomIDX = 0;
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    videoCodecIDX = 0;
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gbceIDX = 0;
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef TARGET_OMAP4
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Temporary fix until OMAP3 and OMAP4 3A values are synced
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    contrast = 90;
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    brightness = 50;
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sharpness = 0;
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    saturation = 50;
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    contrast = 100;
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    brightness = 100;
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sharpness = 0;
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    saturation = 100;
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    iso_mode = 0;
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    capture_mode = 0;
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    exposure_mode = 0;
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ippIDX = 0;//set the ipp to ldc-nsf as the capture mode is set to HQ by default
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ippIDX_old = ippIDX;
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    jpegQuality = 85;
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bufferStarvationTest = 0;
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    meter_mode = 0;
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    previewFormat = 1;
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pictureFormat = 3; // jpeg
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height);
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(CameraParameters::KEY_ROTATION, rotation);
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_COMPENSATION, (int) (compensation * 10));
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(params.KEY_WHITE_BALANCE, strawb_mode[awb_mode]);
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_MODE, (capture[capture_mode]));
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_CAF, caf_mode);
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_ISO, iso_mode);
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_GBCE, gbce[gbceIDX]);
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_SHARPNESS, sharpness);
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_CONTRAST, contrast);
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_EXPOSURE, exposure[exposure_mode]);
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_BRIGHTNESS, brightness);
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_SATURATION, saturation);
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(params.KEY_EFFECT, effects[effects_mode]);
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.setPreviewFrameRate(frameRate[ARRAY_SIZE(frameRate) - 1].fps);
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(params.KEY_ANTIBANDING, antibanding[antibanding_mode]);
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(params.KEY_FOCUS_MODE, focus[focus_mode]);
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_IPP, ippIDX);
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(CameraParameters::KEY_JPEG_QUALITY, jpegQuality);
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.setPreviewFormat(pixelformat[previewFormat].pixformat);
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.setPictureFormat(codingformat[pictureFormat]);
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_BUFF_STARV, bufferStarvationTest); //enable buffer starvation
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_METERING_MODE, metering[meter_mode]);
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, previewSize[thumbSizeIDX].width);
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, previewSize[thumbSizeIDX].height);
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ManualConvergenceValuesIDX = ManualConvergenceDefaultValueIDX;
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_S3D2D_PREVIEW_MODE, "off");
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_STEREO_CAMERA, "false");
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_EXIF_MODEL, MODEL);
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.set(KEY_EXIF_MAKE, MAKE);
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint menu_gps() {
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char ch;
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char coord_str[100];
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (print_menu) {
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("\n\n== GPS MENU ============================\n\n");
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   e. Latitude:       %.7lf\n", latitude);
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   d. Longitude:      %.7lf\n", longitude);
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   c. Altitude:       %.7lf\n", altitude);
1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("\n");
1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   q. Return to main menu\n");
1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("\n");
1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   Choice: ");
1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ch = getchar();
1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("%c", ch);
1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    print_menu = 1;
1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch (ch) {
1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'e':
1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            latitude += degree_by_step;
1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (latitude > 90.0) {
1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                latitude -= 180.0;
1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            snprintf(coord_str, 7, "%.7lf", latitude);
1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_GPS_LATITUDE, coord_str);
1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'd':
1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            longitude += degree_by_step;
1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (longitude > 180.0) {
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                longitude -= 360.0;
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            snprintf(coord_str, 7, "%.7lf", longitude);
1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_GPS_LONGITUDE, coord_str);
1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'c':
1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            altitude += 12345.67890123456789;
1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (altitude > 100000.0) {
1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                altitude -= 200000.0;
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            snprintf(coord_str, 100, "%.20lf", altitude);
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_GPS_ALTITUDE, coord_str);
1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'Q':
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'q':
1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            print_menu = 0;
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint functional_menu() {
1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char ch;
1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (print_menu) {
1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n");
1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" \n\nSTART / STOP / GENERAL SERVICES \n");
1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" -----------------------------\n");
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   A  Select Camera %s\n", cameras[camera_index]);
1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   [. Resume Preview after capture\n");
1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   0. Reset to defaults\n");
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   q. Quit\n");
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   @. Disconnect and Reconnect to CameraService \n");
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   /. Enable/Disable showfps: %s\n", ((showfps)? "Enabled":"Disabled"));
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   a. GEO tagging settings menu\n");
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   E.  Camera Capability Dump");
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" \n\n PREVIEW SUB MENU \n");
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" -----------------------------\n");
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   1. Start Preview\n");
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   2. Stop Preview\n");
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   ~. Preview format %s\n", pixelformat[previewFormat].pixformat);
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   4. Preview size:   %4d x %4d - %s\n",previewSize[previewSizeIDX].width,  previewSize[previewSizeIDX].height, previewSize[previewSizeIDX].desc);
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   4. Preview size:   %4d x %4d - %s\n",previewSize[previewSizeIDX].width, camera_index == 2 ? previewSize[previewSizeIDX].height*2 : previewSize[previewSizeIDX].height, previewSize[previewSizeIDX].desc);
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   R. Preview framerate range: %s\n", fpsRanges[fpsRangeIdx].rangeDescription);
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   &. Dump a preview frame\n");
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   _. Auto Convergence mode: %s\n", autoconvergencemode[AutoConvergenceModeIDX]);
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   ^. Manual Convergence Value: %s\n", manualconvergencevalues[ManualConvergenceValuesIDX]);
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   {. 2D Preview in 3D Stereo Mode: %s\n", params.get(KEY_S3D2D_PREVIEW_MODE));
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" \n\n IMAGE CAPTURE SUB MENU \n");
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" -----------------------------\n");
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   p. Take picture/Full Press\n");
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   H. Exposure Bracketing: %s\n", expBracketing[expBracketIdx]);
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   U. Temporal Bracketing:   %s\n", tempBracketing[tempBracketIdx]);
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   W. Temporal Bracketing Range: [-%d;+%d]\n", tempBracketRange, tempBracketRange);
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   $. Picture Format: %s\n", codingformat[pictureFormat]);
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   3. Picture Rotation:       %3d degree\n", rotation );
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   5. Picture size:   %4d x %4d - %s\n",captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height,              captureSize[captureSizeIDX].name);
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   i. ISO mode:       %s\n", iso[iso_mode]);
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   u. Capture Mode:   %s\n", capture[capture_mode]);
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   k. IPP Mode:       %s\n", ipp_mode[ippIDX]);
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   K. GBCE: %s\n", gbce[gbceIDX]);
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   o. Jpeg Quality:   %d\n", jpegQuality);
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   #. Burst Images:  %3d\n", burst);
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   :. Thumbnail Size:  %4d x %4d - %s\n",previewSize[thumbSizeIDX].width, previewSize[thumbSizeIDX].height, previewSize[thumbSizeIDX].desc);
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   ': Thumbnail Quality %d\n", thumbQuality);
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" \n\n VIDEO CAPTURE SUB MENU \n");
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" -----------------------------\n");
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   6. Start Video Recording\n");
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   2. Stop Recording\n");
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   l. Video Capture resolution:   %4d x %4d - %s\n",VcaptureSize[VcaptureSizeIDX].width,VcaptureSize[VcaptureSizeIDX].height, VcaptureSize[VcaptureSizeIDX].desc);
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   ]. Video Bit rate :  %s\n", VbitRate[VbitRateIDX].desc);
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   9. Video Codec:    %s\n", videoCodecs[videoCodecIDX].desc);
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   D. Audio Codec:    %s\n", audioCodecs[audioCodecIDX].desc);
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   v. Output Format:  %s\n", outputFormat[outputFormatIDX].desc);
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if  (camera_index == 1) {
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("   r. Framerate:     %d\n", fpsConstRangesSec[frameRateIDXSec].constFramerate);
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else {
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("   r. Framerate:     %d\n", fpsConstRanges[frameRateIDX].constFramerate);
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   *. Start Video Recording dump ( 1 raw frame ) \n");
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   B  VNF              %s \n", vnf[vnf_mode]);
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   C  VSTAB              %s", vstab[vstab_mode]);
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" \n\n 3A SETTING SUB MENU \n");
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" -----------------------------\n");
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   M. Measurement Data: %s\n", measurement[measurementIdx]);
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   F. Start face detection \n");
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   T. Stop face detection \n");
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   G. Touch/Focus area AF\n");
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   f. Auto Focus/Half Press\n");
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   J.Flash:              %s\n", flashModes[flashIdx]);
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   7. EV offset:      %4.1f\n", compensation);
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   8. AWB mode:       %s\n", strawb_mode[awb_mode]);
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   z. Zoom            %s\n", zoom[zoomIDX].zoom_description);
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   j. Exposure        %s\n", exposure[exposure_mode]);
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   e. Effect:         %s\n", effects[effects_mode]);
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   w. Scene:          %s\n", scene[scene_mode]);
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   s. Saturation:     %d\n", saturation);
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   c. Contrast:       %d\n", contrast);
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   h. Sharpness:      %d\n", sharpness);
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   b. Brightness:     %d\n", brightness);
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   x. Antibanding:    %s\n", antibanding[antibanding_mode]);
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   g. Focus mode:     %s\n", focus[focus_mode]);
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   m. Metering mode:     %s\n" , metering[meter_mode]);
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   <. Exposure Lock:     %s\n", lock[elockidx]);
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   >. WhiteBalance Lock:  %s\n",lock[wblockidx]);
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("\n");
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   Choice: ");
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ch = getchar();
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("%c", ch);
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    print_menu = 1;
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch (ch) {
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case '_':
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        AutoConvergenceModeIDX++;
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        AutoConvergenceModeIDX %= ARRAY_SIZE(autoconvergencemode);
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        params.set(KEY_AUTOCONVERGENCE, autoconvergencemode[AutoConvergenceModeIDX]);
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], AUTOCONVERGENCE_MODE_MANUAL) == 0) {
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else {
1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceDefaultValueIDX]);
1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ManualConvergenceValuesIDX = ManualConvergenceDefaultValueIDX;
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->setParameters(params.flatten());
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        break;
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case '^':
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( strcmp (autoconvergencemode[AutoConvergenceModeIDX], AUTOCONVERGENCE_MODE_MANUAL) == 0) {
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ManualConvergenceValuesIDX++;
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ManualConvergenceValuesIDX %= ARRAY_SIZE(manualconvergencevalues);
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_MANUALCONVERGENCE_VALUES, manualconvergencevalues[ManualConvergenceValuesIDX]);
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            camera->setParameters(params.flatten());
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        break;
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case 'A':
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_index++;
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera_index %= ARRAY_SIZE(cameras);
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( camera_index == 2) {
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_STEREO_CAMERA, "true");
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_STEREO_CAMERA, "false");
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        closeCamera();
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        openCamera();
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (camera_index == 0) {
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.setPreviewFrameRate(30);
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.setPreviewFrameRate(27);
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        break;
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case '[':
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( hardwareActive ) {
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            camera->setParameters(params.flatten());
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            camera->startPreview();
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        break;
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case '0':
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        initDefaults();
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        break;
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '1':
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( startPreview() < 0 ) {
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("Error while starting preview\n");
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return -1;
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '2':
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopPreview();
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( recordingMode ) {
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->disconnect();
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera.clear();
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                stopRecording();
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                closeRecorder();
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera = Camera::connect(camera_index);
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  if ( NULL == camera.get() ) {
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                      sleep(1);
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                      camera = Camera::connect(camera_index);
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                      if ( NULL == camera.get() ) {
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                          return -1;
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                      }
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  }
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  camera->setListener(new CameraHandler());
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  camera->setParameters(params.flatten());
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  recordingMode = false;
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '3':
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rotation += 90;
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            rotation %= 360;
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_ROTATION, rotation);
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '4':
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewSizeIDX += 1;
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewSizeIDX %= ARRAY_SIZE(previewSize);
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( strcmp(params.get(KEY_STEREO_CAMERA), "false") == 0 ) {
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height);
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPreviewSize(previewSize[previewSizeIDX].width, previewSize[previewSizeIDX].height*2);
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            reSizePreview = true;
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive && previewRunning ) {
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->stopPreview();
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->startPreview();
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else if ( hardwareActive ) {
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '5':
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            captureSizeIDX += 1;
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            captureSizeIDX %= ARRAY_SIZE(captureSize);
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.setPictureSize(captureSize[captureSizeIDX].width, captureSize[captureSizeIDX].height);
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'l':
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'L':
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            VcaptureSizeIDX++;
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            VcaptureSizeIDX %= ARRAY_SIZE(VcaptureSize);
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case ']':
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            VbitRateIDX++;
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            VbitRateIDX %= ARRAY_SIZE(VbitRate);
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '6':
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( !recordingMode ) {
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                recordingMode = true;
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( startPreview() < 0 ) {
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while starting preview\n");
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( openRecorder() < 0 ) {
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while openning video recorder\n");
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( configureRecorder() < 0 ) {
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while configuring video recorder\n");
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( startRecording() < 0 ) {
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while starting video recording\n");
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '7':
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( compensation > 2.0) {
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                compensation = -2.0;
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                compensation += 0.1;
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_COMPENSATION, (int) (compensation * 10));
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '8':
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            awb_mode++;
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            awb_mode %= ARRAY_SIZE(strawb_mode);
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_WHITE_BALANCE, strawb_mode[awb_mode]);
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '9':
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            videoCodecIDX++;
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            videoCodecIDX %= ARRAY_SIZE(videoCodecs);
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '~':
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewFormat += 1;
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            previewFormat %= ARRAY_SIZE(pixelformat) - 1;
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.setPreviewFormat(pixelformat[previewFormat].pixformat);
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '$':
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pictureFormat += 1;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( strcmp(params.get(KEY_STEREO_CAMERA), "false") == 0 && pictureFormat > 4 )
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                pictureFormat = 0;
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            pictureFormat %= ARRAY_SIZE(codingformat);
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.setPictureFormat(codingformat[pictureFormat]);
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '?' :
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///Set mode=3 to select video mode
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_MODE, 3);
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_VNF, 1);
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_VSTAB, 1);
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case ':':
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            thumbSizeIDX += 1;
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            thumbSizeIDX %= ARRAY_SIZE(previewSize);
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, previewSize[thumbSizeIDX].width);
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, previewSize[thumbSizeIDX].height);
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '\'':
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( thumbQuality >= 100) {
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                thumbQuality = 0;
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                thumbQuality += 5;
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, thumbQuality);
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'B' :
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            vnf_mode++;
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            vnf_mode %= ARRAY_SIZE(vnf);
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_VNF, vnf_mode);
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'C' :
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            vstab_mode++;
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            vstab_mode %= ARRAY_SIZE(vstab);
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_VSTAB, vstab_mode);
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'E':
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if(hardwareActive)
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.unflatten(camera->getParameters());
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printSupportedParams();
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '*':
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->startRecording();
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'o':
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( jpegQuality >= 100) {
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                jpegQuality = 0;
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                jpegQuality += 5;
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_JPEG_QUALITY, jpegQuality);
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'M':
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            measurementIdx = (measurementIdx + 1)%ARRAY_SIZE(measurement);
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_MEASUREMENT, measurement[measurementIdx]);
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'm':
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            meter_mode = (meter_mode + 1)%ARRAY_SIZE(metering);
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_METERING_MODE, metering[meter_mode]);
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'k':
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ippIDX += 1;
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ippIDX %= ARRAY_SIZE(ipp_mode);
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ippIDX_old = ippIDX;
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if defined(OMAP_ENHANCEMENT) && defined(TARGET_OMAP3)
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_IPP, ipp_mode[ippIDX]);
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_IPP, ippIDX);
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'K':
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gbceIDX+= 1;
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gbceIDX %= ARRAY_SIZE(gbce);
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_GBCE, gbce[gbceIDX]);
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'F':
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->sendCommand(CAMERA_CMD_START_FACE_DETECTION, 0, 0);
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'T':
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->sendCommand(CAMERA_CMD_STOP_FACE_DETECTION, 0, 0);
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '@':
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive ) {
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                closeCamera();
1756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( 0 >= openCamera() ) {
1758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf( "Reconnected to CameraService \n");
1759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '#':
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( burst >= MAX_BURST ) {
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                burst = 0;
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                burst += BURST_INC;
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_BURST, burst);
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'J':
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            flashIdx++;
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            flashIdx %= ARRAY_SIZE(flashModes);
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_FLASH_MODE, (flashModes[flashIdx]));
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'u':
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            capture_mode++;
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            capture_mode %= ARRAY_SIZE(capture);
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // HQ should always be in ldc-nsf
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // if not HQ, then return the ipp to its previous state
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if( !strcmp(capture[capture_mode], "high-quality") ) {
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ippIDX_old = ippIDX;
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ippIDX = 3;
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.set(KEY_IPP, ipp_mode[ippIDX]);
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ippIDX = ippIDX_old;
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_MODE, (capture[capture_mode]));
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'U':
1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            tempBracketIdx++;
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            tempBracketIdx %= ARRAY_SIZE(tempBracketing);
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_TEMP_BRACKETING, tempBracketing[tempBracketIdx]);
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'H':
1820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expBracketIdx++;
1821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            expBracketIdx %= ARRAY_SIZE(expBracketing);
1822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_EXP_BRACKETING_RANGE, expBracketingRange[expBracketIdx]);
1824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'W':
1831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            tempBracketRange++;
1832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            tempBracketRange %= TEMP_BRACKETING_MAX_RANGE;
1833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( 0 == tempBracketRange ) {
1834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                tempBracketRange = 1;
1835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_TEMP_BRACKETING_NEG, tempBracketRange);
1838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_TEMP_BRACKETING_POS, tempBracketRange);
1839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'w':
1846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            scene_mode++;
1847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            scene_mode %= ARRAY_SIZE(scene);
1848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_SCENE_MODE, scene[scene_mode]);
1849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'i':
1856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            iso_mode++;
1857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            iso_mode %= ARRAY_SIZE(iso);
1858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_ISO, iso[iso_mode]);
1859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'h':
1865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( sharpness >= 100) {
1866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                sharpness = 0;
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                sharpness += 10;
1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_SHARPNESS, sharpness);
1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'D':
1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            audioCodecIDX++;
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            audioCodecIDX %= ARRAY_SIZE(audioCodecs);
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'v':
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            outputFormatIDX++;
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            outputFormatIDX %= ARRAY_SIZE(outputFormat);
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'z':
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            zoomIDX++;
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            zoomIDX %= ARRAY_SIZE(zoom);
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_ZOOM, zoom[zoomIDX].idx);
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'j':
1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            exposure_mode++;
1901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            exposure_mode %= ARRAY_SIZE(exposure);
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_EXPOSURE, exposure[exposure_mode]);
1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'c':
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if( contrast >= 200){
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                contrast = 0;
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                contrast += 10;
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_CONTRAST, contrast);
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'b':
1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( brightness >= 200) {
1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                brightness = 0;
1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                brightness += 10;
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_BRIGHTNESS, brightness);
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 's':
1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'S':
1935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( saturation >= 100) {
1936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                saturation = 0;
1937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
1938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                saturation += 10;
1939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_SATURATION, saturation);
1942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'e':
1949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            effects_mode++;
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            effects_mode %= ARRAY_SIZE(effects);
1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_EFFECT, effects[effects_mode]);
1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'r':
1959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (camera_index == 0) {
1962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                frameRateIDX += 1;
1963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                frameRateIDX %= ARRAY_SIZE(fpsConstRanges);
1964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsConstRanges[frameRateIDX].range);
1965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else
1966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                frameRateIDXSec += 1;
1968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                frameRateIDXSec %= ARRAY_SIZE(fpsConstRangesSec);
1969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsConstRangesSec[frameRateIDXSec].range);
1970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive ) {
1975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'R':
1981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            fpsRangeIdx += 1;
1982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            fpsRangeIdx %= ARRAY_SIZE(fpsRanges);
1983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, fpsRanges[fpsRangeIdx].range);
1984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive ) {
1986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
1990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'x':
1992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            antibanding_mode++;
1993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            antibanding_mode %= ARRAY_SIZE(antibanding);
1994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_ANTIBANDING, antibanding[antibanding_mode]);
1995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
1997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
1998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'g':
2002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            focus_mode++;
2003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            focus_mode %= ARRAY_SIZE(focus);
2004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(params.KEY_FOCUS_MODE, focus[focus_mode]);
2005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
2007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
2008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'G':
2012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(CameraParameters::KEY_FOCUS_AREAS, TEST_FOCUS_AREA);
2014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
2016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
2017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.remove(CameraParameters::KEY_FOCUS_AREAS);
2019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'f':
2021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&autofocus_start, 0);
2023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
2025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->autoFocus();
2026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'p':
2030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&picture_start, 0);
2032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
2034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->takePicture(CAMERA_MSG_COMPRESSED_IMAGE|CAMERA_MSG_RAW_IMAGE);
2035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '&':
2039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Enabling Preview Callback");
2040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            dump_preview = 1;
2041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
2042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
2043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '{':
2046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( strcmp(params.get(KEY_S3D2D_PREVIEW_MODE), "off") == 0 )
2047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.set(KEY_S3D2D_PREVIEW_MODE, "on");
2049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
2051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.set(KEY_S3D2D_PREVIEW_MODE, "off");
2053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive )
2055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                camera->setParameters(params.flatten());
2056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'a':
2059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            while (1) {
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( menu_gps() < 0)
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'q':
2068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopPreview();
2070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
2072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '/':
2074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (showfps)
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                property_set("debug.image.showfps", "0");
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                showfps = false;
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
2081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                property_set("debug.image.showfps", "1");
2083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                showfps = true;
2084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case '<':
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      elockidx += 1;
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      elockidx %= ARRAY_SIZE(lock);
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      params.set(KEY_AUTO_EXPOSURE_LOCK, lock[elockidx]);
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      if ( hardwareActive )
2093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->setParameters(params.flatten());
2094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      break;
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    case '>':
2097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      wblockidx += 1;
2098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      wblockidx %= ARRAY_SIZE(lock);
2099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      params.set(KEY_AUTO_WHITEBALANCE_LOCK, lock[wblockidx]);
2100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      if ( hardwareActive )
2101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->setParameters(params.flatten());
2102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      break;
2103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default:
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            print_menu = 0;
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid print_usage() {
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" USAGE: camera_test  <param>  <script>\n");
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" <param>\n-----------\n\n");
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" F or f -> Functional tests \n");
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" A or a -> API tests \n");
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" E or e -> Error scenario tests \n");
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" S or s -> Stress tests; with syslink trace \n");
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" SN or sn -> Stress tests; No syslink trace \n\n");
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf(" <script>\n----------\n");
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("Script name (Only for stress tests)\n\n");
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint error_scenario() {
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char ch;
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t stat = NO_ERROR;
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (print_menu) {
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   0. Buffer need\n");
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   1. Not enough memory\n");
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   2. Media server crash\n");
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   3. Overlay object request\n");
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   4. Pass unsupported preview&picture format\n");
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   5. Pass unsupported preview&picture resolution\n");
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   6. Pass unsupported preview framerate\n");
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   q. Quit\n");
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("   Choice: ");
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    print_menu = 1;
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ch = getchar();
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("%c\n", ch);
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    switch (ch) {
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '0': {
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Case0:Buffer need\n");
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bufferStarvationTest = 1;
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            params.set(KEY_BUFF_STARV, bufferStarvationTest); //enable buffer starvation
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( !recordingMode ) {
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                recordingMode = true;
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( startPreview() < 0 ) {
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while starting preview\n");
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( openRecorder() < 0 ) {
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while openning video recorder\n");
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
2165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( configureRecorder() < 0 ) {
2168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while configuring video recorder\n");
2169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
2171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( startRecording() < 0 ) {
2174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Error while starting video recording\n");
2175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
2177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            usleep(1000000);//1s
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopPreview();
2184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( recordingMode ) {
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                stopRecording();
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                closeRecorder();
2188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                recordingMode = false;
2190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '1': {
2196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Case1:Not enough memory\n");
2197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            int* tMemoryEater = new int[999999999];
2198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (!tMemoryEater) {
2200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("Not enough memory\n");
2201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return -1;
2202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            } else {
2203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                delete tMemoryEater;
2204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '2': {
2210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Case2:Media server crash\n");
2211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            //camera = Camera::connect();
2212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL == camera.get() ) {
2214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("Unable to connect to CameraService\n");
2215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return -1;
2216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '3': {
2222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Case3:Overlay object request\n");
2223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            int err = 0;
2224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            err = open("/dev/video5", O_RDWR);
2226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (err < 0) {
2228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("Could not open the camera device5: %d\n",  err );
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return err;
2230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( startPreview() < 0 ) {
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("Error while starting preview\n");
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return -1;
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            usleep(1000000);//1s
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopPreview();
2240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            close(err);
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '4': {
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive ) {
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPictureFormat("invalid-format");
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPreviewFormat("invalid-format");
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                stat = camera->setParameters(params.flatten());
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NO_ERROR != stat ) {
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Test passed!\n");
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                } else {
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Test failed!\n");
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                initDefaults();
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '5': {
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive ) {
2269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPictureSize(-1, -1);
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPreviewSize(-1, -1);
2272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                stat = camera->setParameters(params.flatten());
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NO_ERROR != stat ) {
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Test passed!\n");
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                } else {
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Test failed!\n");
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                initDefaults();
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case '6': {
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( hardwareActive ) {
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                params.setPreviewFrameRate(-1);
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                stat = camera->setParameters(params.flatten());
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NO_ERROR != stat ) {
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Test passed!\n");
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                } else {
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Test failed!\n");
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                initDefaults();
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        case 'q': {
2309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
2310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        default: {
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            print_menu = 0;
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            break;
2315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
2319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint restartCamera() {
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  const char dir_path_name[80] = SDCARD_PATH;
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  printf("+++Restarting Camera After Error+++\n");
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  stopPreview();
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  if (recordingMode) {
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stopRecording();
2330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    closeRecorder();
2331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    recordingMode = false;
2333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  }
2334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  sleep(3); //Wait a bit before restarting
2336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  restartCount++;
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  if (strcpy(dir_path, dir_path_name) == NULL)
2340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {
2341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("Error reseting dir name");
2342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return -1;
2343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  }
2344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  if ( openCamera() < 0 )
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  {
2347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("+++Camera Restarted Failed+++\n");
2348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    system("echo camerahal_test > /sys/power/wake_unlock");
2349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return -1;
2350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  }
2351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  initDefaults();
2353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  stopScript = false;
2355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  printf("+++Camera Restarted Successfully+++\n");
2357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  return 0;
2358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint main(int argc, char *argv[]) {
2361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *cmd;
2362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int pid;
2363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    sp<ProcessState> proc(ProcessState::self());
2364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned long long st, end, delay;
2366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    timeval current_time;
2367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&current_time, 0);
2369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    st = current_time.tv_sec * 1000000 + current_time.tv_usec;
2371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cmd = NULL;
2373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( argc < 2 ) {
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf(" Please enter atleast 1 argument\n");
2376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        print_usage();
2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return 0;
2379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    system("echo camerahal_test > /sys/power/wake_lock");
2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( argc < 3 ) {
2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch (*argv[1]) {
2383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'S':
2384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 's':
2385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("This is stress / regression tests \n");
2386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("Provide script file as 2nd argument\n");
2387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'F':
2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'f':
2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ProcessState::self()->startThreadPool();
2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( openCamera() < 0 ) {
2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Camera initialization failed\n");
2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    system("echo camerahal_test > /sys/power/wake_unlock");
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                initDefaults();
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                print_menu = 1;
2402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                while ( 1 ) {
2404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( functional_menu() < 0 )
2405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        break;
2406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                };
2407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'A':
2411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'a':
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("API level test cases coming soon ... \n");
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'E':
2417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case 'e': {
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ProcessState::self()->startThreadPool();
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( openCamera() < 0 ) {
2421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("Camera initialization failed\n");
2422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    system("echo camerahal_test > /sys/power/wake_unlock");
2423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    return -1;
2424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                initDefaults();
2427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                print_menu = 1;
2428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                while (1) {
2430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if (error_scenario() < 0) {
2431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        break;
2432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
2433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                printf("INVALID OPTION USED\n");
2440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                print_usage();
2441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else if ( ( argc == 3) && ( ( *argv[1] == 'S' ) || ( *argv[1] == 's') ) ) {
2445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if((argv[1][1] == 'N') || (argv[1][1] == 'n')) {
2447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bLogSysLinkTrace = false;
2448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ProcessState::self()->startThreadPool();
2451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( openCamera() < 0 ) {
2453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Camera initialization failed\n");
2454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            system("echo camerahal_test > /sys/power/wake_unlock");
2455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
2456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        initDefaults();
2459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        cmd = load_script(argv[2]);
2461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( cmd != NULL) {
2463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            start_logging(argv[2], pid);
2464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stressTest = true;
2465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            while (1)
2467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              {
2468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( execute_functional_script(cmd) == 0 )
2469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  {
2470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    break;
2471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  }
2472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                else
2473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  {
2474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    printf("CameraTest Restarting Camera...\n");
2475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    free(cmd);
2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    cmd = NULL;
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( (restartCamera() != 0)  || ((cmd = load_script(argv[2])) == NULL) )
2480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                      {
2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        printf("ERROR::CameraTest Restarting Camera...\n");
2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        break;
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                      }
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                  }
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              }
2486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            free(cmd);
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stop_logging(pid);
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else if ( ( argc == 3) && ( ( *argv[1] == 'E' ) || ( *argv[1] == 'e') ) ) {
2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ProcessState::self()->startThreadPool();
2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( openCamera() < 0 ) {
2494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            printf("Camera initialization failed\n");
2495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            system("echo camerahal_test > /sys/power/wake_unlock");
2496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return -1;
2497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        initDefaults();
2500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        cmd = load_script(argv[2]);
2502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( cmd != NULL) {
2504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            start_logging(argv[2], pid);
2505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            execute_error_script(cmd);
2506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            free(cmd);
2507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stop_logging(pid);
2508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } else {
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        printf("INVALID OPTION USED\n");
2512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        print_usage();
2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&current_time, 0);
2516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    end = current_time.tv_sec * 1000000 + current_time.tv_usec;
2517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    delay = end - st;
2518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    printf("Application clossed after: %llu ms\n", delay);
2519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    system("echo camerahal_test > /sys/power/wake_unlock");
2520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return 0;
2521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2523