13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel//#define ALOG_NDEBUG 0
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ALOG_NIDEBUG 0
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCameraUsbParm"
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Log.h>
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Errors.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/threads.h>
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/String16.h>
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/types.h>
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/stat.h>
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <unistd.h>
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h>
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <cutils/properties.h>
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <math.h>
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#if HAVE_ANDROID_OS
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <linux/android_pmem.h>
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <linux/ioctl.h>
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <camera/QCameraParameters.h>
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <media/mediarecorder.h>
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <gralloc_priv.h>
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "linux/msm_mdp.h"
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <linux/fb.h>
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <limits.h>
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h>
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <time.h>
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <pthread.h>
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdio.h>
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <string.h>
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <unistd.h>
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <termios.h>
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <assert.h>
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h>
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <ctype.h>
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <signal.h>
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <errno.h>
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/mman.h>
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/system_properties.h>
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/time.h>
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h>
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <linux/msm_ion.h>
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <camera.h>
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <cam_fifo.h>
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <jpege.h>
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} // extern "C"
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraHWI.h"
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QualcommUsbCamera.h"
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraUsbPriv.h"
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraUsbParm.h"
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace android {
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/********************************************************************/
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic const str_map preview_formats[] = {
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {QCameraParameters::PIXEL_FORMAT_YUV420SP, HAL_PIXEL_FORMAT_YCrCb_420_SP},
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic const preview_format_info_t preview_format_info_list[] = {
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {HAL_PIXEL_FORMAT_YV12, CAMERA_YUV_420_YV12, CAMERA_PAD_TO_WORD, 3}
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic struct camera_size_type previewSizes[] = {
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 1920, 1088}, //1080p
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 1280, 720}, // 720P,
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 640, 480}, // VGA
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 512, 384},
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 480, 320},
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 320, 240}, // QVGA
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// All fps ranges which can be supported. This list will be filtered according
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// to the min and max fps supported by hardware
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// this list must be sorted first by max_fps and then min_fps
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// fps values are multiplied by 1000
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic android::FPSRange prevFpsRanges[] = {
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    android::FPSRange(5000, 121000),
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* TBR: Is frame rate mode mandatory */
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic const str_map frame_rate_modes[] = {
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE, FPS_MODE_AUTO},
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {QCameraParameters::KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE, FPS_MODE_FIXED}
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic const str_map picture_formats[] = {
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {QCameraParameters::PIXEL_FORMAT_JPEG, PICTURE_FORMAT_JPEG},
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //{QCameraParameters::PIXEL_FORMAT_RAW, PICTURE_FORMAT_RAW}
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic camera_size_type picture_sizes[] = {
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 1920, 1088}, //HD1080
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 1280, 720}, //HD720
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 640, 480}, // VGA
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 320, 240}, // QVGA
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* aspect ratio removed */
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic camera_size_type thumbnail_sizes[] = {
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 512, 288 }, //1.777778
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 480, 288 }, //1.666667
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 256, 154 }, //1.66233
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 432, 288 }, //1.5
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 512, 384 }, //1.333333
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 352, 288 }, //1.222222
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 320, 240 }, //1.33333
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    { 176, 144 }, //1.222222
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic const str_map recording_Hints[] = {
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {"false", FALSE},
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {"true",  TRUE}
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Static functions list */
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_sizes_str(const camera_size_type *sizes, int len);
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_values_str(const str_map *values, int len);
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_fps_str(const android:: FPSRange* fps, int len);
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_values_range_str(int min, int max);
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetPrvwSize(   camera_hardware_t           *camHal,
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                const QCameraParameters&    params);
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetPictSize(   camera_hardware_t           *camHal,
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                const QCameraParameters&    params);
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetThumbnailSize(  camera_hardware_t           *camHal,
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    const QCameraParameters&    params);
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetJpegQlty(   camera_hardware_t           *camHal,
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                const QCameraParameters&    params);
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamInitDefaultParameters
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function sets default parameters to camera HAL context
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   camHal              - camera HAL handle
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      None
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint usbCamInitDefaultParameters(camera_hardware_t *camHal)
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0;
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char tempStr[FILENAME_LENGTH];
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Default initializations */
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prevFormat          = DEFAULT_USBCAM_PRVW_FMT;
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prevWidth           = DEFAULT_USBCAM_PRVW_WD;
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prevHeight          = DEFAULT_USBCAM_PRVW_HT;
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->dispFormat          = camHal->prevFormat;
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->dispWidth           = camHal->prevWidth;
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->dispHeight          = camHal->prevHeight;
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->pictFormat          = DEFAULT_USBCAM_PICT_FMT;
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->pictWidth           = DEFAULT_USBCAM_PICT_WD;
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->pictHeight          = DEFAULT_USBCAM_PICT_HT;
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->pictJpegQlty        = DEFAULT_USBCAM_PICT_QLTY;
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->thumbnailWidth      = DEFAULT_USBCAM_THUMBNAIL_WD;
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->thumbnailHeight     = DEFAULT_USBCAM_THUMBNAIL_HT;
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->thumbnailJpegQlty   = DEFAULT_USBCAM_THUMBNAIL_QLTY;
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->previewEnabledFlag  = 0;
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prvwStoppedForPicture = 0;
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prvwCmdPending      = 0;
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->takePictInProgress  = 0;
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set picture size values
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->pictSizeValues = create_sizes_str(
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        picture_sizes, sizeof(picture_sizes) / sizeof(camera_size_type));
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->pictSizeValues.string());
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.setPictureSize(camHal->pictWidth, camHal->pictHeight);
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set picture format
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->pictFormatValues = create_values_str(
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        picture_formats, sizeof(picture_formats) / sizeof(str_map));
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    camHal->pictFormatValues.string());
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(PICTURE_FORMAT_JPEG == camHal->pictFormat)
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->qCamParams.setPictureFormat(QCameraParameters::PIXEL_FORMAT_JPEG);
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set picture quality
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    sprintf(tempStr, "%d", camHal->pictJpegQlty);
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_JPEG_QUALITY, tempStr);
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set Thumbnail size
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->thumbnailSizeValues = create_sizes_str(
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        thumbnail_sizes, sizeof(thumbnail_sizes) /sizeof(camera_size_type));
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    camHal->thumbnailSizeValues.string());
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    sprintf(tempStr, "%d", camHal->thumbnailWidth);
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                tempStr);
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    sprintf(tempStr, "%d", camHal->thumbnailHeight);
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                tempStr);
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set Thumbnail quality
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    sprintf(tempStr, "%d", camHal->thumbnailJpegQlty);
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                tempStr);
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set Preview Format
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prevFormatValues = create_values_str(
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        preview_formats, sizeof(preview_formats) / sizeof(str_map));
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->prevFormatValues.string());
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(HAL_PIXEL_FORMAT_YCrCb_420_SP == camHal->prevFormat)
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->qCamParams.setPreviewFormat(QCameraParameters::PIXEL_FORMAT_YUV420SP);
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set Preview size
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prevSizeValues = create_sizes_str(
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        previewSizes,  sizeof(previewSizes) / sizeof(camera_size_type));
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(QCameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    camHal->prevSizeValues.string());
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.setPreviewSize(camHal->prevWidth, camHal->prevHeight);
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Set Preivew fps range
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->prevFpsRangesValues = create_fps_str(
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        prevFpsRanges, sizeof(prevFpsRanges) / sizeof(android::FPSRange));
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        camHal->prevFpsRangesValues);
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camHal->qCamParams.setPreviewFpsRange(MIN_PREV_FPS, MAX_PREV_FPS);
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamInitDefaultParameters */
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamSetParameters
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function parses the parameter string and stores the
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              parameters in the camera HAL handle
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  camHal              - camera HAL handle
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  params              - pointer to parameter string
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   Success
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  Error
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint usbCamSetParameters(camera_hardware_t *camHal, const char *params)
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int             rc      = 0;
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8         str     = String8(params);
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraParameters qParam;
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(params)
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        PRINT_PARAM_STR(params);
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qParam.unflatten(str);
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(usbCamSetPrvwSize(camHal, qParam))
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(usbCamSetPictSize(camHal, qParam))
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(usbCamSetThumbnailSize(camHal, qParam))
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(usbCamSetJpegQlty(camHal, qParam))
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamSetParameters */
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamGetParameters
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function allocates memory for parameter string,
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              composes and returns the parameter string
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   camHal             - camera HAL handle
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      Address to the parameter string
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelchar* usbCamGetParameters(camera_hardware_t *camHal)
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char *parms = NULL;
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char* rc = NULL;
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8 str;
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraParameters qParam = camHal->qCamParams;
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //qParam.dump();
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    str = qParam.flatten( );
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = (char *)malloc(sizeof(char)*(str.length()+1));
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(rc != NULL){
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(rc, 0, sizeof(char)*(str.length()+1));
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        strncpy(rc, str.string(), str.length());
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc[str.length()] = 0;
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    parms = rc;
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    PRINT_PARAM_STR(parms);
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return (parms);
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamGetParameters */
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamPutParameters
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function frees the memory allocated for parameter string
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  camHal              - camera HAL handle
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  parms               - Parameter string
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      None
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid usbCamPutParameters(camera_hardware_t *camHal, char *parms)
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(parms)
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        free(parms);
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    parms = NULL;
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamPutParameters */
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: create_sizes_str
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function loops through /dev/video entries and probes with
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              UVCIOC query. If the device responds to the query, then it is
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              detected as UVC webcam
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   devname             - String pointer. The function return dev entry
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                          name in this string
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   Success
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  Error
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_sizes_str(const camera_size_type *sizes, int len) {
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8 str;
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char buffer[32];
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (len > 0) {
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buffer, sizeof(buffer), "%dx%d", sizes[0].width, sizes[0].height);
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(buffer);
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (int i = 1; i < len; i++) {
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buffer, sizeof(buffer), ",%dx%d", sizes[i].width, sizes[i].height);
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(buffer);
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return str;
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: create_values_str
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function loops through /dev/video entries and probes with
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              UVCIOC query. If the device responds to the query, then it is
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              detected as UVC webcam
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   devname             - String pointer. The function return dev entry
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                          name in this string
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   Success
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  Error
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_values_str(const str_map *values, int len) {
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8 str;
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (len > 0) {
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(values[0].desc);
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (int i = 1; i < len; i++) {
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(",");
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(values[i].desc);
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return str;
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: create_fps_str
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function loops through /dev/video entries and probes with
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              UVCIOC query. If the device responds to the query, then it is
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              detected as UVC webcam
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   devname             - String pointer. The function return dev entry
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                          name in this string
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   Success
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  Error
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_fps_str(const android:: FPSRange* fps, int len) {
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8 str;
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char buffer[32];
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (len > 0) {
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buffer, sizeof(buffer), "(%d,%d)", fps[0].minFPS, fps[0].maxFPS);
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(buffer);
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (int i = 1; i < len; i++) {
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buffer, sizeof(buffer), ",(%d,%d)", fps[i].minFPS, fps[i].maxFPS);
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(buffer);
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return str;
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: create_values_range_str
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function loops through /dev/video entries and probes with
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              UVCIOC query. If the device responds to the query, then it is
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              detected as UVC webcam
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   devname             - String pointer. The function return dev entry
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                          name in this string
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   Success
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  Error
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic String8 create_values_range_str(int min, int max){
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    String8 str;
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char buffer[32];
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(min <= max){
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buffer, sizeof(buffer), "%d", min);
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        str.append(buffer);
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (int i = min + 1; i <= max; i++) {
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            snprintf(buffer, sizeof(buffer), ",%d", i);
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            str.append(buffer);
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return str;
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamSetPrvwSize
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function parses preview width and height from the input
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              parameters and stores into the context
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  camHal              - camera HAL handle
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  params              - QCameraParameters reference
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   If parameters are valid
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  If parameters are invalid
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetPrvwSize(   camera_hardware_t           *camHal,
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                const QCameraParameters&    params)
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0, width, height, i, numPrvwSizes, validSize;
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    params.getPreviewSize(&width, &height);
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGI("%s: Requested preview size %d x %d", __func__, width, height);
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Validate the preview size
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    numPrvwSizes = sizeof(previewSizes) / sizeof(camera_size_type);
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0, validSize = 0; i <  numPrvwSizes; i++) {
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (width ==  previewSizes[i].width
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           && height ==  previewSizes[i].height) {
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            validSize = 1;
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->qCamParams.setPreviewSize(width, height);
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ALOGD("%s: setPreviewSize:  width: %d   height: %d",
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                __func__, width, height);
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->prevWidth   = width;
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->prevHeight  = height;
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->dispWidth   = width;
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->dispHeight  = height;
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            /* TBD: restrict pictures size and video to preview size */
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!validSize)
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ALOGE("%s: Invalid preview size %dx%d requested", __func__,
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            width, height);
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = (validSize == 0)? -1:0;
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamSetPrvwSize */
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamSetPictSize
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function parses picture width and height from the input
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              parameters and stores into the context
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  camHal              - camera HAL handle
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  params              - QCameraParameters reference
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   If parameters are valid
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  If parameters are invalid
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetPictSize(   camera_hardware_t           *camHal,
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                const QCameraParameters&    params)
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0, width, height, i, numPictSizes, validSize;
5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* parse for picture width and height */
5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    params.getPictureSize(&width, &height);
5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGI("%s: Requested picture size %d x %d", __func__, width, height);
5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Validate the picture size
5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    numPictSizes = sizeof(picture_sizes) / sizeof(camera_size_type);
5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0, validSize = 0; i <  numPictSizes; i++) {
5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (width ==  picture_sizes[i].width
5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           && height ==  picture_sizes[i].height) {
5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            validSize = 1;
5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->qCamParams.setPictureSize(width, height);
5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ALOGD("%s: setPictureSize:  width: %d   height: %d",
5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                __func__, width, height);
5613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            /* TBD: If new pictSize is different from old size, restart prvw */
5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->pictWidth   = width;
5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->pictHeight  = height;
5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!validSize)
5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ALOGE("%s: Invalid picture size %dx%d requested", __func__,
5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            width, height);
5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = (validSize == 0)? -1:0;
5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamSetPictSize */
5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamSetThumbnailSize
5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function parses picture width and height from the input
5793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              parameters and stores into the context
5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  camHal              - camera HAL handle
5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  params              - QCameraParameters reference
5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   If parameters are valid
5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  If parameters are invalid
5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetThumbnailSize(  camera_hardware_t           *camHal,
5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    const QCameraParameters&    params)
5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0, width, height, i, numThumbnailSizes, validSize;
5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char tempStr[FILENAME_LENGTH];
5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* parse for thumbnail width and height */
5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    width = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    height = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGI("%s: Requested thumbnail size %d x %d", __func__, width, height);
6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Validate the thumbnail size
6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    numThumbnailSizes = sizeof(thumbnail_sizes) / sizeof(camera_size_type);
6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0, validSize = 0; i <  numThumbnailSizes; i++) {
6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (width ==  thumbnail_sizes[i].width
6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           && height ==  thumbnail_sizes[i].height) {
6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            validSize = 1;
6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->thumbnailWidth   = width;
6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->thumbnailHeight  = height;
6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            sprintf(tempStr, "%d", camHal->thumbnailWidth);
6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->qCamParams.set(QCameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                        width);
6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            sprintf(tempStr, "%d", camHal->thumbnailHeight);
6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->qCamParams.set(QCameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                        height);
6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!validSize)
6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ALOGE("%s: Invalid picture size %dx%d requested", __func__,
6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            width, height);
6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = (validSize == 0)? -1:0;
6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X", __func__);
6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} /* usbCamSetThumbnailSize */
6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/******************************************************************************
6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: usbCamSetJpegQlty
6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: This function parses picture and thumbnail JPEG quality and
6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              validates before storing in the context
6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  camHal              - camera HAL handle
6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  params              - QCameraParameters reference
6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      0   If parameters are valid
6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      -1  If parameters are invalid
6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *****************************************************************************/
6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic int usbCamSetJpegQlty(   camera_hardware_t           *camHal,
6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                const QCameraParameters&    params)
6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0, quality = 0;
6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char tempStr[FILENAME_LENGTH];
6503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: E", __func__);
6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /**/
6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    quality = params.getInt(QCameraParameters::KEY_JPEG_QUALITY);
6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGI("%s: Requested picture qlty %d", __func__, quality);
6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (quality >= 0 && quality <= 100) {
6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->pictJpegQlty = quality;
6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        sprintf(tempStr, "%d", camHal->pictJpegQlty);
6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->qCamParams.set(QCameraParameters::KEY_JPEG_QUALITY, quality);
6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ALOGE("Invalid jpeg quality=%d", quality);
6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    quality = params.getInt(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGI("%s: Requested thumbnail qlty %d", __func__, quality);
6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (quality >= 0 && quality <= 100) {
6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->thumbnailJpegQlty = quality;
6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        sprintf(tempStr, "%d", camHal->thumbnailJpegQlty);
6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->qCamParams.set(QCameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    tempStr);
6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ALOGE("Invalid jpeg thumbnail quality=%d", quality);
6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGD("%s: X rc:%d", __func__, rc);
6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; /*namespace android */
684