16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <stdlib.h>
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <unistd.h>
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <fcntl.h>
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <time.h>
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <semaphore.h>
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <pthread.h>
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/types.h>
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/stat.h>
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/wait.h>
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <ui/DisplayInfo.h>
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gui/Surface.h>
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gui/SurfaceComposerClient.h>
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gui/ISurfaceComposer.h>
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <system/camera.h>
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <camera/Camera.h>
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <camera/ICamera.h>
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <camera/CameraParameters.h>
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/RefBase.h>
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <binder/IPCThreadState.h>
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <binder/ProcessState.h>
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <binder/IServiceManager.h>
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cutils/properties.h>
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cutils/memory.h>
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "qcamera_test.h"
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera {
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevusing namespace android;
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint CameraContext::JpegIdx = 0;
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : previewCallback
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: preview callback preview mesages are enabled
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @mem : preview buffer
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::previewCallback(const sp<IMemory>& mem)
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("PREVIEW Callback 0x%x", ( unsigned int ) mem->pointer());
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t *ptr = (uint8_t*) mem->pointer();
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[0],
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[1],
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[2],
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[3],
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[4],
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[5],
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[6],
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[7],
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[8],
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           ptr[9]);
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : saveFile
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: helper function for saving buffers on filesystem
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @mem : buffer to save to filesystem
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @path: File path
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::saveFile(const sp<IMemory>& mem, String8 path)
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    unsigned char *buff = NULL;
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int size;
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int fd = -1;
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mem == NULL) {
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0655);
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(fd < 0) {
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Unable to open file %s %s\n", path.string(), strerror(fd));
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -errno;
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    size = mem->size();
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (size <= 0) {
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("IMemory object is of zero size\n");
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        close(fd);
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buff = (unsigned char *)mem->pointer();
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!buff) {
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Buffer pointer is invalid\n");
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        close(fd);
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( size != write(fd, buff, size) ) {
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Bad Write error (%d)%s\n",
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               errno,
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               strerror(errno));
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        close(fd);
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return INVALID_OPERATION;
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("%s: buffer=%08X, size=%d stored at %s\n",
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           __FUNCTION__, (int)buff, size, path.string());
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (fd >= 0)
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        close(fd);
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : notify
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: notify callback
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msgType : type of callback
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ext1: extended parameters
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ext2: extended parameters
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2)
1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("Notify cb: %d %d %d\n", msgType, ext1, ext2);
1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( msgType & CAMERA_MSG_FOCUS ) {
1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("AutoFocus %s \n",
1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev               (ext1) ? "OK" : "FAIL");
1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( msgType & CAMERA_MSG_SHUTTER ) {
1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Shutter done \n");
1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( msgType & CAMERA_MSG_ERROR) {
1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Camera Test CAMERA_MSG_ERROR\n");
1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stopPreview();
1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        closeCamera();
1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : postData
1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: handles data callbacks
1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msgType : type of callback
1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dataPtr: buffer data
1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @metadata: additional metadata where available
1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::postData(int32_t msgType,
1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             const sp<IMemory>& dataPtr,
1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             camera_frame_metadata_t *metadata)
2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("Data cb: %d\n", msgType);
2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( msgType & CAMERA_MSG_PREVIEW_FRAME ) {
2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewCallback(dataPtr);
2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( msgType & CAMERA_MSG_RAW_IMAGE ) {
2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("RAW done \n");
2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (msgType & CAMERA_MSG_POSTVIEW_FRAME) {
2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Postview frame \n");
2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) {
2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("JPEG done\n");
2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        String8 jpegPath;
2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        jpegPath = jpegPath.format("/sdcard/img_%d.jpg", JpegIdx);
2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        saveFile(dataPtr, jpegPath);
2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        JpegIdx++;
2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( ( msgType & CAMERA_MSG_PREVIEW_METADATA ) &&
2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         ( NULL != metadata ) ) {
2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Face detected %d \n", metadata->number_of_faces);
2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : postDataTimestamp
2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: handles recording callbacks
2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @timestamp : timestamp of buffer
2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msgType : type of buffer
2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dataPtr : buffer data
2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::postDataTimestamp(nsecs_t timestamp,
2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      int32_t msgType,
2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      const sp<IMemory>& dataPtr)
2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("Recording cb: %d %lld %p\n", msgType, timestamp, dataPtr.get());
2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : printSupportedParams
2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dump common supported parameters
2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::printSupportedParams()
2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Cameras: %s",
2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get("camera-indexes")? mParams.get("camera-indexes") : "NULL");
2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Picture Sizes: %s",
2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES)?
2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES) : "NULL");
2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Picture Formats: %s",
2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS)?
2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS) : "NULL");
2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Preview Sizes: %s",
2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES)?
2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES) : "NULL");
2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Preview Formats: %s",
2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS)?
2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS) : "NULL");
2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Preview Frame Rates: %s",
2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)?
2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES) : "NULL");
2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Thumbnail Sizes: %s",
2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES)?
2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES) : "NULL");
2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Whitebalance Modes: %s",
2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE)?
2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE) : "NULL");
2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Effects: %s",
2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS)?
2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS) : "NULL");
2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Scene Modes: %s",
2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES)?
2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES) : "NULL");
2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Focus Modes: %s",
2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES)?
2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES) : "NULL");
2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Antibanding Options: %s",
2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING)?
2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING) : "NULL");
2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Flash Modes: %s",
2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES)?
2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES) : "NULL");
2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported Focus Areas: %d",
2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS));
2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tSupported FPS ranges : %s",
3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE)?
3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE) : "NULL");
3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\r\tFocus Distances: %s \n",
3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_FOCUS_DISTANCES)?
3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           mParams.get(CameraParameters::KEY_FOCUS_DISTANCES) : "NULL");
3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : createPreviewSurface
3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: helper function for creating preview surfaces
3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @width : preview width
3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @height: preview height
3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @pixFormat : surface pixelformat
3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::createPreviewSurface(unsigned int width,
3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             unsigned int height,
3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             int32_t pixFormat)
3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    DisplayInfo dinfo;
3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(
3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        ISurfaceComposer::eDisplayIdMain));
3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    SurfaceComposerClient::getDisplayInfo(display, &dinfo);
3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    unsigned int previewWidth, previewHeight;
3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( dinfo.w < width ) {
3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewWidth = dinfo.w;
3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewWidth = width;
3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( dinfo.h < height ) {
3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewHeight = dinfo.h;
3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewHeight = height;
3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mClient = new SurfaceComposerClient();
3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL == mClient.get() ) {
3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Unable to establish connection to Surface Composer \n");
3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_INIT;
3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mSurfaceControl = mClient->createSurface(String8("QCamera_Test"),
3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             previewWidth,
3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             previewHeight,
3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             pixFormat,
3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             0);
3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL == mSurfaceControl.get() ) {
3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Unable to create preview surface \n");
3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_INIT;
3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mPreviewSurface = mSurfaceControl->getSurface();
3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mPreviewSurface.get() ) {
3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mClient->openGlobalTransaction();
3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mSurfaceControl->setLayer(0x7fffffff);
3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mSurfaceControl->setPosition(0, 0);
3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mSurfaceControl->setSize(previewWidth, previewHeight);
3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mSurfaceControl->show();
3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mClient->closeGlobalTransaction();
3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ( NO_ERROR != ret ) {
3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            printf("Preview surface configuration failed! \n");
3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = NO_INIT;
3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : destroyPreviewSurface
3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: closes previously open preview surface
3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::destroyPreviewSurface()
3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mPreviewSurface.get() ) {
3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mPreviewSurface.clear();
3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mSurfaceControl.get() ) {
3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mSurfaceControl->clear();
3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mSurfaceControl.clear();
4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mClient.get() ) {
4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mClient->dispose();
4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mClient.clear();
4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~CameraContext
4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: camera context destructor
4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevCameraContext::~CameraContext()
4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stopPreview();
4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    closeCamera();
4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : openCamera
4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: connects to and initializes camera
4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t  CameraContext::openCamera()
4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mCamera.get() ) {
4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Camera already open! \n");
4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_ERROR;
4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("openCamera(camera_index=%d)\n", mCameraIndex);
4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCamera = Camera::connect(mCameraIndex);
4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL == mCamera.get() ) {
4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Unable to connect to CameraService\n");
4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_INIT;
4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParams = mCamera->getParameters();
4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParams.getSupportedPreviewSizes(mSupportedPreviewSizes);
4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParams.getSupportedPictureSizes(mSupportedPictureSizes);
4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCurrentPictureSizeIdx = mSupportedPictureSizes.size() / 2;
4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCurrentPreviewSizeIdx = mSupportedPreviewSizes.size() / 2;
4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCamera->setListener(this);
4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mHardwareActive = true;
4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getNumberOfCameras
4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: returns the number of supported camera by the system
4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : supported camera count
4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint CameraContext::getNumberOfCameras()
4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = -1;
4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mCamera.get() ) {
4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mCamera->getNumberOfCameras();
4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : closeCamera
4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: closes a previously the initialized camera reference
4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::closeCamera()
4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL == mCamera.get() ) {
4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_INIT;
4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCamera->disconnect();
5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCamera.clear();
5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mHardwareActive = false;
5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mPreviewRunning = false;
5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : startPreview
5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: starts camera preview
5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::startPreview()
5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int previewWidth, previewHeight;
5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    Size currentPreviewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx);
5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    Size currentPictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx);
5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mPreviewRunning || !mHardwareActive ) {
5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        printf("Preview already running or camera not active! \n");
5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_INIT;
5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mResizePreview) {
5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewWidth = currentPreviewSize.width;
5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewHeight = currentPreviewSize.height;
5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = createPreviewSurface(previewWidth,
5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   previewHeight,
5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   HAL_PIXEL_FORMAT_YCrCb_420_SP);
5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (  NO_ERROR != ret ) {
5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            printf("Error while creating preview surface\n");
5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return ret;
5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParams.setPreviewSize(previewWidth, previewHeight);
5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParams.setPictureSize(currentPictureSize.width, currentPictureSize.height);
5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mCamera->setParameters(mParams.flatten());
5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mCamera->setPreviewDisplay(mPreviewSurface);
5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret |= mCamera->startPreview();
5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ( NO_ERROR != ret ) {
5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            printf("Preview start failed! \n");
5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return ret;
5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mPreviewRunning = true;
5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mResizePreview = false;
5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : autoFocus
5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Triggers autofocus
5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::autoFocus()
5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    status_t ret = NO_ERROR;
5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mPreviewRunning ) {
5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mCamera->autoFocus();
5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : enablePreviewCallbacks
5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Enables preview callback messages
5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::enablePreviewCallbacks()
5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : takePicture
6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: triggers image capture
6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::takePicture()
6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    status_t ret = NO_ERROR;
6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mPreviewRunning ) {
6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mCamera->takePicture(CAMERA_MSG_COMPRESSED_IMAGE|CAMERA_MSG_RAW_IMAGE);
6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stopPreview
6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stops camera preview
6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::stopPreview()
6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    status_t ret = NO_ERROR;
6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCamera->stopPreview();
6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = destroyPreviewSurface();
6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mPreviewRunning  = false;
6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mResizePreview = true;
6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : resumePreview
6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: resumes camera preview after image capture
6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::resumePreview()
6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    status_t ret = NO_ERROR;
6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mCamera->startPreview();
6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = NO_INIT;
6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : nextPreviewSize
6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Iterates through all supported preview sizes.
6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::nextPreviewSize()
6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCurrentPreviewSizeIdx += 1;
6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCurrentPreviewSizeIdx %= mSupportedPreviewSizes.size();
6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        Size previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx);
6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParams.setPreviewSize(previewSize.width,
6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               previewSize.height);
6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mResizePreview = true;
6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ( mPreviewRunning ) {
6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mCamera->stopPreview();
6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mCamera->setParameters(mParams.flatten());
6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mCamera->startPreview();
7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mCamera->setParameters(mParams.flatten());
7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getCurrentPreviewSize
7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: queries the currently configured preview size
7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @previewSize : preview size currently configured
7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::getCurrentPreviewSize(Size &previewSize)
7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx);
7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : nextPictureSize
7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Iterates through all supported picture sizes.
7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None
7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::nextPictureSize()
7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCurrentPictureSizeIdx += 1;
7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCurrentPictureSizeIdx %= mSupportedPictureSizes.size();
7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        Size pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx);
7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParams.setPictureSize(pictureSize.width,
7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               pictureSize.height);
7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mCamera->setParameters(mParams.flatten());
7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getCurrentPictureSize
7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: queries the currently configured picture size
7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @pictureSize : picture size currently configured
7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::getCurrentPictureSize(Size &pictureSize)
7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( mHardwareActive ) {
7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx);
7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; //namespace qcamera ends here
7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevusing namespace qcamera;
7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : printMenu
7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: prints the available camera options
7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @currentCamera : camera context currently being used
7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid printMenu(sp<CameraContext> currentCamera)
7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    Size currentPictureSize, currentPreviewSize;
7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    assert(currentCamera.get());
7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    currentCamera->getCurrentPictureSize(currentPictureSize);
7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    currentCamera->getCurrentPreviewSize(currentPreviewSize);
7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n");
7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf(" \n\nSTART / STOP / GENERAL SERVICES \n");
8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf(" -----------------------------\n");
8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Switch camera - Current Index: %d\n",
8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            SWITCH_CAMERA_CMD,
8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            currentCamera->getCameraIndex());
8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Resume Preview after capture \n",
8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            RESUME_PREVIEW_CMD);
8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Quit \n",
8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            EXIT_CMD);
8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Camera Capability Dump",
8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            DUMP_CAPS_CMD);
8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf(" \n\n PREVIEW SUB MENU \n");
8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf(" -----------------------------\n");
8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Start Preview\n",
8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            START_PREVIEW_CMD);
8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Stop Preview\n",
8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            STOP_PREVIEW_CMD);
8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Preview size:  %dx%d\n",
8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           CHANGE_PREVIEW_SIZE_CMD,
8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           currentPreviewSize.width,
8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           currentPreviewSize.height);
8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Enable preview frames\n",
8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ENABLE_PRV_CALLBACKS_CMD);
8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Trigger autofocus \n",
8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            AUTOFOCUS_CMD);
8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf(" \n\n IMAGE CAPTURE SUB MENU \n");
8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf(" -----------------------------\n");
8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Take picture/Full Press\n",
8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            TAKEPICTURE_CMD);
8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   %c. Picture size:  %dx%d\n",
8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           CHANGE_PICTURE_SIZE_CMD,
8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           currentPictureSize.width,
8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           currentPictureSize.height);
8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("\n");
8366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("   Choice: ");
8376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : functionalTest
8416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: queries and executes client supplied commands for testing a
8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              particular camera.
8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @availableCameras : List with all cameras supported
8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : status_t type of status
8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- continue testing
8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero -- quit test
8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t functionalTest(Vector< sp<CameraContext> > &availableCameras)
8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int cmd;
8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    status_t stat = NO_ERROR;
8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    static int currentCameraIdx = 0;
8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    assert(availableCameras.size());
8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    sp<CameraContext> currentCamera = availableCameras.itemAt(currentCameraIdx);
8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printMenu(currentCamera);
8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cmd = getchar();
8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (cmd) {
8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case SWITCH_CAMERA_CMD:
8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            currentCameraIdx++;
8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            currentCameraIdx %= availableCameras.size();
8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            currentCamera = availableCameras.itemAt(currentCameraIdx);
8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case RESUME_PREVIEW_CMD:
8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->resumePreview();
8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case START_PREVIEW_CMD:
8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->startPreview();
8826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case STOP_PREVIEW_CMD:
8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->stopPreview();
8886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CHANGE_PREVIEW_SIZE_CMD:
8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->nextPreviewSize();
8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CHANGE_PICTURE_SIZE_CMD:
8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->nextPictureSize();
9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case DUMP_CAPS_CMD:
9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            currentCamera->printSupportedParams();
9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case AUTOFOCUS_CMD:
9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->autoFocus();
9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case TAKEPICTURE_CMD:
9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->takePicture();
9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case ENABLE_PRV_CALLBACKS_CMD:
9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stat = currentCamera->enablePreviewCallbacks();
9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case EXIT_CMD:
9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            currentCamera->stopPreview();
9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return -1;
9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    printf("Command status 0x%x \n", stat);
9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint main()
9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    sp<ProcessState> proc(ProcessState::self());
9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    Vector< sp<CameraContext> > availableCameras;
9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    sp<CameraContext> camera;
9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int i = 0;
9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ProcessState::self()->startThreadPool();
9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    do {
9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera = new CameraContext(i);
9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ( NULL == camera.get() ) {
9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return NO_INIT;
9586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        status_t stat = camera->openCamera();
9616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ( NO_ERROR != stat ) {
9626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            printf("Error encountered during camera open \n");
9636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return stat;
9646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        availableCameras.add(camera);
9676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        i++;
9686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } while ( i < camera->getNumberOfCameras() ) ;
9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    while ( true ) {
9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ( NO_ERROR != functionalTest(availableCameras) ) {
9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    };
9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for ( size_t j = 0 ; j < availableCameras.size() ; j++ ) {
9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera = availableCameras.itemAt(j);
9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera->closeCamera();
9796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera.clear();
9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    availableCameras.clear();
9836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
9856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
986