aboutsummaryrefslogtreecommitdiff
path: root/camera/QCamera2/HAL/test/qcamera_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'camera/QCamera2/HAL/test/qcamera_test.cpp')
-rw-r--r--camera/QCamera2/HAL/test/qcamera_test.cpp3710
1 files changed, 0 insertions, 3710 deletions
diff --git a/camera/QCamera2/HAL/test/qcamera_test.cpp b/camera/QCamera2/HAL/test/qcamera_test.cpp
deleted file mode 100644
index dd06c67..0000000
--- a/camera/QCamera2/HAL/test/qcamera_test.cpp
+++ /dev/null
@@ -1,3710 +0,0 @@
-/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <time.h>
-#include <semaphore.h>
-#include <pthread.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-
-#include <ui/DisplayInfo.h>
-#include <gui/Surface.h>
-#include <gui/SurfaceComposerClient.h>
-#include <gui/ISurfaceComposer.h>
-
-#include <system/camera.h>
-
-#include <camera/Camera.h>
-#include <camera/ICamera.h>
-#include <camera/CameraParameters.h>
-#include <media/mediarecorder.h>
-
-#include <utils/RefBase.h>
-#include <utils/Mutex.h>
-#include <utils/Condition.h>
-#include <binder/IPCThreadState.h>
-#include <binder/ProcessState.h>
-#include <binder/IServiceManager.h>
-#include <cutils/properties.h>
-#include <cutils/memory.h>
-#include <SkImageDecoder.h>
-#include <SkImageEncoder.h>
-#include <MediaCodec.h>
-#include <OMX_IVCommon.h>
-#include <foundation/AMessage.h>
-#include <media/ICrypto.h>
-#include <MediaMuxer.h>
-#include <foundation/ABuffer.h>
-#include <MediaErrors.h>
-#include <gralloc_priv.h>
-#include <math.h>
-
-#include "qcamera_test.h"
-#include "cam_types.h"
-#include "mm_camera_dbg.h"
-
-#define VIDEO_BUF_ALLIGN(size, allign) \
- (((size) + (allign-1)) & (typeof(size))(~(allign-1)))
-
-namespace qcamera {
-
-using namespace android;
-
-int CameraContext::JpegIdx = 0;
-int CameraContext::mPiPIdx = 0;
-const char CameraContext::KEY_ZSL[] = "zsl";
-
-/*===========================================================================
- * FUNCTION : previewCallback
- *
- * DESCRIPTION: preview callback preview mesages are enabled
- *
- * PARAMETERS :
- * @mem : preview buffer
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::previewCallback(const sp<IMemory>& mem)
-{
- printf("PREVIEW Callback %p", mem->pointer());
- uint8_t *ptr = (uint8_t*) mem->pointer();
- if (NULL != ptr) {
- printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
- ptr[0],
- ptr[1],
- ptr[2],
- ptr[3],
- ptr[4],
- ptr[5],
- ptr[6],
- ptr[7],
- ptr[8],
- ptr[9]);
- } else {
- ALOGE(" no preview for NULL CB\n");
- }
-}
-
-/*===========================================================================
- * FUNCTION : useLock
- *
- * DESCRIPTION: Mutex lock for CameraContext
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void CameraContext::useLock()
-{
- Mutex::Autolock l(mLock);
- while (mInUse) {
- mCond.wait(mLock);
- }
- mInUse = true;
-}
-
-/*===========================================================================
- * FUNCTION : signalFinished
- *
- * DESCRIPTION: Mutex unlock CameraContext
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void CameraContext::signalFinished()
-{
- Mutex::Autolock l(mLock);
- mInUse = false;
- mCond.signal();
-}
-
-/*===========================================================================
- * FUNCTION : saveFile
- *
- * DESCRIPTION: helper function for saving buffers on filesystem
- *
- * PARAMETERS :
- * @mem : buffer to save to filesystem
- * @path: File path
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::saveFile(const sp<IMemory>& mem, String8 path)
-{
- unsigned char *buff = NULL;
- ssize_t size;
- int fd = -1;
-
- if (mem == NULL) {
- return BAD_VALUE;
- }
-
- fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0655);
- if(fd < 0) {
- printf("Unable to open file %s %s\n", path.string(), strerror(fd));
- return -errno;
- }
-
- size = (ssize_t)mem->size();
- if (size <= 0) {
- printf("IMemory object is of zero size\n");
- close(fd);
- return BAD_VALUE;
- }
-
- buff = (unsigned char *)mem->pointer();
- if (!buff) {
- printf("Buffer pointer is invalid\n");
- close(fd);
- return BAD_VALUE;
- }
-
- if (size != write(fd, buff, (size_t)size)) {
- printf("Bad Write error (%d)%s\n", errno, strerror(errno));
- close(fd);
- return INVALID_OPERATION;
- }
-
- printf("%s: buffer=%p, size=%lld stored at %s\n",
- __FUNCTION__, buff, (long long int) size, path.string());
-
- if (fd >= 0)
- close(fd);
-
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : PiPCopyToOneFile
- *
- * DESCRIPTION: Copy the smaller picture to the bigger one
- *
- * PARAMETERS :
- * @bitmap0 : Decoded image buffer 0
- * @bitmap1 : Decoded image buffer 1
- *
- * RETURN : decoded picture in picture in SkBitmap
- *==========================================================================*/
-SkBitmap * CameraContext::PiPCopyToOneFile(
- SkBitmap *bitmap0, SkBitmap *bitmap1)
-{
- size_t size0;
- size_t size1;
- SkBitmap *src;
- SkBitmap *dst;
- unsigned int dstOffset;
- unsigned int srcOffset;
-
- if (bitmap0 == NULL || bitmap1 == NULL) {
- ALOGE(" bitmap0 : %p, bitmap1 : %p\n", bitmap0, bitmap1);
- return NULL;
- }
-
- size0 = bitmap0->getSize();
- if (size0 <= 0) {
- printf("Decoded image 0 is of zero size\n");
- return NULL;
- }
-
- size1 = bitmap1->getSize();
- if (size1 <= 0) {
- printf("Decoded image 1 is of zero size\n");
- return NULL;
- }
-
- if (size0 > size1) {
- dst = bitmap0;
- src = bitmap1;
- } else if (size1 > size0){
- dst = bitmap1;
- src = bitmap0;
- } else {
- printf("Picture size should be with different size!\n");
- return NULL;
- }
-
- for (unsigned int i = 0; i < (unsigned int)src->height(); i++) {
- dstOffset = i * (unsigned int)dst->width() * mfmtMultiplier;
- srcOffset = i * (unsigned int)src->width() * mfmtMultiplier;
- memcpy(((unsigned char *)dst->getPixels()) + dstOffset,
- ((unsigned char *)src->getPixels()) + srcOffset,
- (unsigned int)src->width() * mfmtMultiplier);
- }
-
- return dst;
-}
-
-/*===========================================================================
- * FUNCTION : decodeJPEG
- *
- * DESCRIPTION: decode jpeg input buffer.
- *
- * PARAMETERS :
- * @mem : buffer to decode
- * @skBM : decoded buffer
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
-
- *==========================================================================*/
-status_t CameraContext::decodeJPEG(const sp<IMemory>& mem, SkBitmap *skBM)
-{
-#ifndef USE_SDK_20_OR_HIGHER
- SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config;
- const void *buff = NULL;
- size_t size;
-
- buff = (const void *)mem->pointer();
- size= mem->size();
-
- switch(prefConfig) {
- case SkBitmap::kARGB_8888_Config:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- case SkBitmap::kARGB_4444_Config:
- {
- mfmtMultiplier = 2;
- }
- break;
-
- case SkBitmap::kRGB_565_Config:
- {
- mfmtMultiplier = 2;
- }
- break;
-
- case SkBitmap::kIndex8_Config:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- case SkBitmap::kA8_Config:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- default:
- {
- mfmtMultiplier = 0;
- printf("Decode format is not correct!\n");
- }
- break;
- }
-
- if (SkImageDecoder::DecodeMemory(buff, size, skBM, prefConfig,
- SkImageDecoder::kDecodePixels_Mode) == false) {
- printf("%s():%d:: Failed during jpeg decode\n",__FUNCTION__,__LINE__);
- return BAD_VALUE;
- }
-#else
- SkColorType prefConfig = kRGBA_8888_SkColorType;
- const void *buff = NULL;
- size_t size;
-
- buff = (const void *)mem->pointer();
- size= mem->size();
-
- switch(prefConfig) {
- case kRGBA_8888_SkColorType:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- case kBGRA_8888_SkColorType:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- case kARGB_4444_SkColorType:
- {
- mfmtMultiplier = 2;
- }
- break;
-
- case kRGB_565_SkColorType:
- {
- mfmtMultiplier = 2;
- }
- break;
-
- case kIndex_8_SkColorType:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- case kAlpha_8_SkColorType:
- {
- mfmtMultiplier = 4;
- }
- break;
-
- default:
- {
- mfmtMultiplier = 0;
- printf("Decode format is not correct!\n");
- }
- break;
- }
-
- if (SkImageDecoder::DecodeMemory(buff, size, skBM, prefConfig,
- SkImageDecoder::kDecodePixels_Mode) == false) {
- printf("%s():%d:: Failed during jpeg decode\n",__FUNCTION__,__LINE__);
- return BAD_VALUE;
- }
-
-#endif
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : encodeJPEG
- *
- * DESCRIPTION: encode the decoded input buffer.
- *
- * PARAMETERS :
- * @stream : SkWStream
- * @bitmap : SkBitmap decoded image to encode
- * @path : File path
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
-
- *==========================================================================*/
-status_t CameraContext::encodeJPEG(SkWStream * stream,
- const SkBitmap *bitmap, String8 path)
-{
- int qFactor = 100;
-
- skJpegEnc = SkImageEncoder::Create(SkImageEncoder::kJPEG_Type);
- if (!skJpegEnc) {
- ALOGE(" skJpegEnc is NULL\n");
- return BAD_VALUE;
- }
-
- if (skJpegEnc->encodeStream(stream, *bitmap, qFactor) == false) {
- return BAD_VALUE;
- }
-
- FILE *fh = fopen(path.string(), "r+");
- if ( !fh ) {
- printf("Could not open file %s\n", path.string());
- return BAD_VALUE;
- }
-
- fseek(fh, 0, SEEK_END);
- size_t len = (size_t)ftell(fh);
- rewind(fh);
-
- if( !len ) {
- printf("File %s is empty !\n", path.string());
- fclose(fh);
- return BAD_VALUE;
- }
-
- unsigned char *buff = (unsigned char*)malloc(len);
- if (!buff) {
- printf("Cannot allocate memory for buffer reading!\n");
- return BAD_VALUE;
- }
-
- size_t readSize = fread(buff, 1, len, fh);
- if (readSize != len) {
- printf("Reading error\n");
- return BAD_VALUE;
- }
-
- status_t ret = ReadSectionsFromBuffer(buff, len, READ_ALL);
- if (ret != NO_ERROR) {
- printf("Cannot read sections from buffer\n");
- DiscardData();
- DiscardSections();
- return BAD_VALUE;
- }
- free(buff);
- rewind(fh);
-
- unsigned char temp = 0xff;
- size_t writeSize = fwrite(&temp, sizeof(unsigned char), 1, fh);
- if (1 != writeSize) {
- printf("Writing error\n");
- }
- temp = 0xd8;
- fwrite(&temp, sizeof(unsigned char), 1, fh);
-
- for (size_t i = 0; i < mSectionsRead; i++) {
- switch((mSections[i].Type)) {
-
- case 0x123:
- fwrite(mSections[i].Data, sizeof(unsigned char),
- mSections[i].Size, fh);
- break;
-
- case 0xe0:
- temp = 0xff;
- fwrite(&temp, sizeof(unsigned char), 1, fh);
- temp = 0xe1;
- fwrite(&temp, sizeof(unsigned char), 1, fh);
- fwrite(mJEXIFSection.Data, sizeof(unsigned char),
- mJEXIFSection.Size, fh);
- break;
-
- default:
- temp = 0xff;
- fwrite(&temp, sizeof(unsigned char), 1, fh);
- fwrite(&mSections[i].Type, sizeof(unsigned char), 1, fh);
- fwrite(mSections[i].Data, sizeof(unsigned char),
- mSections[i].Size, fh);
- break;
- }
- }
- fseek(fh, 0, SEEK_END);
- len = (size_t)ftell(fh);
- rewind(fh);
- printf("%s: buffer=%p, size=%zu stored at %s\n",
- __FUNCTION__, bitmap->getPixels(), len, path.string());
-
- free(mJEXIFSection.Data);
- DiscardData();
- DiscardSections();
- fclose(fh);
- ret = NO_ERROR;
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : readSectionsFromBuffer
- *
- * DESCRIPTION: read all jpeg sections of input buffer.
- *
- * PARAMETERS :
- * @mem : buffer to read from Metadata Sections
- * @buffer_size: buffer size
- * @ReadMode: Read mode - all, jpeg or exif
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::ReadSectionsFromBuffer (unsigned char *buffer,
- size_t buffer_size, ReadMode_t ReadMode)
-{
- int a;
- size_t pos = 0;
- int HaveCom = 0;
- mSectionsAllocated = 10;
-
- mSections = (Sections_t *)malloc(sizeof(Sections_t) * mSectionsAllocated);
- if (!mSections) {
- printf(" not enough memory\n");
- return BAD_VALUE;
- }
-
- if (!buffer) {
- printf("Input buffer is null\n");
- return BAD_VALUE;
- }
-
- if (buffer_size < 1) {
- printf("Input size is 0\n");
- return BAD_VALUE;
- }
-
- a = (int) buffer[pos++];
-
- if (a != 0xff || buffer[pos++] != M_SOI){
- printf("No valid image\n");
- return BAD_VALUE;
- }
-
- for(;;){
- size_t itemlen;
- int marker = 0;
- size_t ll,lh;
- unsigned char * Data;
-
- CheckSectionsAllocated();
-
- // The call to CheckSectionsAllocated() may reallocate mSections
- // so need to check for NULL again.
- if (mSections == NULL) {
- printf(" not enough memory\n");
- return BAD_VALUE;
- }
-
- for (a = 0; a <= 16; a++){
- marker = buffer[pos++];
- if (marker != 0xff) break;
-
- if (a >= 16){
- fprintf(stderr,"too many padding bytes\n");
- return BAD_VALUE;
- }
- }
-
- mSections[mSectionsRead].Type = marker;
-
- // Read the length of the section.
- lh = buffer[pos++];
- ll = buffer[pos++];
-
- itemlen = (lh << 8) | ll;
-
- if (itemlen < 2) {
- ALOGE("invalid marker");
- return BAD_VALUE;
- }
-
- mSections[mSectionsRead].Size = itemlen;
-
- Data = (unsigned char *)malloc(itemlen);
- if (Data == NULL) {
- ALOGE("Could not allocate memory");
- return NO_MEMORY;
- }
- mSections[mSectionsRead].Data = Data;
-
- // Store first two pre-read bytes.
- Data[0] = (unsigned char)lh;
- Data[1] = (unsigned char)ll;
-
- if (pos+itemlen-2 > buffer_size) {
- ALOGE("Premature end of file?");
- return BAD_VALUE;
- }
-
- memcpy(Data+2, buffer+pos, itemlen-2); // Read the whole section.
- pos += itemlen-2;
-
- mSectionsRead += 1;
-
- switch(marker){
-
- case M_SOS: // stop before hitting compressed data
- // If reading entire image is requested, read the rest of the
- // data.
- if (ReadMode & READ_IMAGE){
- size_t size;
- // Determine how much file is left.
- size = buffer_size - pos;
-
- if (size < 1) {
- ALOGE("could not read the rest of the image");
- return BAD_VALUE;
- }
- Data = (unsigned char *)malloc(size);
- if (Data == NULL) {
- ALOGE("%d: could not allocate data for entire "
- "image size: %d", __LINE__, size);
- return BAD_VALUE;
- }
-
- memcpy(Data, buffer+pos, size);
-
- CheckSectionsAllocated();
-
- // The call to CheckSectionsAllocated()
- // may reallocate mSections
- // so need to check for NULL again.
- if (mSections == NULL) {
- printf(" not enough memory\n");
- return BAD_VALUE;
- }
-
- mSections[mSectionsRead].Data = Data;
- mSections[mSectionsRead].Size = size;
- mSections[mSectionsRead].Type = PSEUDO_IMAGE_MARKER;
- mSectionsRead ++;
- mHaveAll = 1;
- }
- return NO_ERROR;
-
- case M_EOI: // in case it's a tables-only JPEG stream
- ALOGE("No image in jpeg!\n");
- return BAD_VALUE;
-
- case M_COM: // Comment section
- if (HaveCom || ((ReadMode & READ_METADATA) == 0)){
- // Discard this section.
- free(mSections[--mSectionsRead].Data);
- }
- break;
-
- case M_JFIF:
- // Regular jpegs always have this tag, exif images have the
- // exif marker instead, althogh ACDsee will write images
- // with both markers.
- // this program will re-create this marker on absence of exif
- // marker.
- // hence no need to keep the copy from the file.
- if (ReadMode & READ_METADATA){
- if (memcmp(Data+2, "JFIF", 4) == 0) {
- break;
- }
- free(mSections[--mSectionsRead].Data);
- }
- break;
-
- case M_EXIF:
- // There can be different section using the same marker.
- if (ReadMode & READ_METADATA){
- if (memcmp(Data+2, "Exif", 4) == 0){
- break;
- }else if (memcmp(Data+2, "http:", 5) == 0){
- // Change tag for internal purposes.
- mSections[mSectionsRead-1].Type = M_XMP;
- break;
- }
- }
- // Oterwise, discard this section.
- free(mSections[--mSectionsRead].Data);
- break;
-
- case M_IPTC:
- if (ReadMode & READ_METADATA){
- // Note: We just store the IPTC section.
- // Its relatively straightforward
- // and we don't act on any part of it,
- // so just display it at parse time.
- }else{
- free(mSections[--mSectionsRead].Data);
- }
- break;
-
- case M_SOF0:
- case M_SOF1:
- case M_SOF2:
- case M_SOF3:
- case M_SOF5:
- case M_SOF6:
- case M_SOF7:
- case M_SOF9:
- case M_SOF10:
- case M_SOF11:
- case M_SOF13:
- case M_SOF14:
- case M_SOF15:
- break;
- default:
- // Skip any other sections.
- break;
- }
- }
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : CheckSectionsAllocated
- *
- * DESCRIPTION: Check allocated jpeg sections.
- *
- * PARAMETERS : none
- *
- * RETURN : none
-
- *==========================================================================*/
-void CameraContext::CheckSectionsAllocated(void)
-{
- if (mSectionsRead > mSectionsAllocated){
- ALOGE("allocation screw up");
- }
- if (mSectionsRead >= mSectionsAllocated){
- mSectionsAllocated += mSectionsAllocated +1;
- mSections = (Sections_t *)realloc(mSections,
- sizeof(Sections_t) * mSectionsAllocated);
- if (mSections == NULL){
- ALOGE("could not allocate data for entire image");
- }
- }
-}
-
-/*===========================================================================
- * FUNCTION : findSection
- *
- * DESCRIPTION: find the desired Section of the JPEG buffer.
- *
- * PARAMETERS :
- * @SectionType: Section type
- *
- * RETURN : return the found section
-
- *==========================================================================*/
-CameraContext::Sections_t *CameraContext::FindSection(int SectionType)
-{
- for (unsigned int a = 0; a < mSectionsRead; a++) {
- if (mSections[a].Type == SectionType){
- return &mSections[a];
- }
- }
- // Could not be found.
- return NULL;
-}
-
-
-/*===========================================================================
- * FUNCTION : DiscardData
- *
- * DESCRIPTION: DiscardData
- *
- * PARAMETERS : none
- *
- * RETURN : none
-
- *==========================================================================*/
-void CameraContext::DiscardData()
-{
- for (unsigned int a = 0; a < mSectionsRead; a++) {
- free(mSections[a].Data);
- }
-
- mSectionsRead = 0;
- mHaveAll = 0;
-}
-
-/*===========================================================================
- * FUNCTION : DiscardSections
- *
- * DESCRIPTION: Discard allocated sections
- *
- * PARAMETERS : none
- *
- * RETURN : none
-
- *==========================================================================*/
-void CameraContext::DiscardSections()
-{
- free(mSections);
- mSectionsAllocated = 0;
- mHaveAll = 0;
-}
-
-/*===========================================================================
- * FUNCTION : notify
- *
- * DESCRIPTION: notify callback
- *
- * PARAMETERS :
- * @msgType : type of callback
- * @ext1: extended parameters
- * @ext2: extended parameters
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2)
-{
- printf("Notify cb: %d %d %d\n", msgType, ext1, ext2);
-
- if (( msgType & CAMERA_MSG_PREVIEW_FRAME)
-#ifndef VANILLA_HAL
- && (ext1 == CAMERA_FRAME_DATA_FD)
-#endif
- )
- {
- int fd = dup(ext2);
- printf("notify Preview Frame fd: %d dup fd: %d\n", ext2, fd);
- close(fd);
- }
-
- if ( msgType & CAMERA_MSG_FOCUS ) {
- printf("AutoFocus %s \n",
- (ext1) ? "OK" : "FAIL");
- }
-
- if ( msgType & CAMERA_MSG_SHUTTER ) {
- printf("Shutter done \n");
- }
-
- if ( msgType & CAMERA_MSG_ERROR) {
- printf("Camera Test CAMERA_MSG_ERROR\n");
- stopPreview();
- closeCamera();
- }
-}
-
-/*===========================================================================
- * FUNCTION : postData
- *
- * DESCRIPTION: handles data callbacks
- *
- * PARAMETERS :
- * @msgType : type of callback
- * @dataPtr: buffer data
- * @metadata: additional metadata where available
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::postData(int32_t msgType,
- const sp<IMemory>& dataPtr,
- camera_frame_metadata_t *metadata)
-{
- mInterpr->PiPLock();
- Size currentPictureSize = mSupportedPictureSizes.itemAt(
- mCurrentPictureSizeIdx);
- unsigned char *buff = NULL;
- size_t size;
- status_t ret = 0;
-
- memset(&mJEXIFSection, 0, sizeof(mJEXIFSection)),
-
- printf("Data cb: %d\n", msgType);
-
- if ( msgType & CAMERA_MSG_PREVIEW_FRAME ) {
- previewCallback(dataPtr);
- }
-
- if ( msgType & CAMERA_MSG_RAW_IMAGE ) {
- printf("RAW done \n");
- }
-
- if (msgType & CAMERA_MSG_POSTVIEW_FRAME) {
- printf("Postview frame \n");
- }
-
- if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) {
- String8 jpegPath;
- jpegPath = jpegPath.format(QCAMERA_DUMP_FRM_LOCATION"img_%d.jpg",
- JpegIdx);
- if (!mPiPCapture) {
- // Normal capture case
- printf("JPEG done\n");
- saveFile(dataPtr, jpegPath);
- JpegIdx++;
- } else {
- // PiP capture case
- SkFILEWStream *wStream;
- ret = decodeJPEG(dataPtr, &skBMtmp);
- if (NO_ERROR != ret) {
- printf("Error in decoding JPEG!\n");
- mInterpr->PiPUnlock();
- return;
- }
-
- mWidthTmp = currentPictureSize.width;
- mHeightTmp = currentPictureSize.height;
- PiPPtrTmp = dataPtr;
- // If there are two jpeg buffers
- if (mPiPIdx == 1) {
- printf("PiP done\n");
-
- // Find the the capture with higher width and height and read
- // its jpeg sections
- if ((mInterpr->camera[0]->mWidthTmp * mInterpr->camera[0]->mHeightTmp) >
- (mInterpr->camera[1]->mWidthTmp * mInterpr->camera[1]->mHeightTmp)) {
- buff = (unsigned char *)PiPPtrTmp->pointer();
- size= PiPPtrTmp->size();
- } else if ((mInterpr->camera[0]->mWidthTmp * mInterpr->camera[0]->mHeightTmp) <
- (mInterpr->camera[1]->mWidthTmp * mInterpr->camera[1]->mHeightTmp)) {
- buff = (unsigned char *)PiPPtrTmp->pointer();
- size= PiPPtrTmp->size();
- } else {
- printf("Cannot take PiP. Images are with the same width"
- " and height size!!!\n");
- mInterpr->PiPUnlock();
- return;
- }
-
- if (buff != NULL && size != 0) {
- ret = ReadSectionsFromBuffer(buff, size, READ_ALL);
- if (ret != NO_ERROR) {
- printf("Cannot read sections from buffer\n");
- DiscardData();
- DiscardSections();
- mInterpr->PiPUnlock();
- return;
- }
-
- mJEXIFTmp = FindSection(M_EXIF);
- if (!mJEXIFTmp) {
- ALOGE("skBMDec is null\n");
- DiscardData();
- DiscardSections();
- return;
- }
- mJEXIFSection = *mJEXIFTmp;
- mJEXIFSection.Data = (unsigned char*)malloc(mJEXIFTmp->Size);
- if (!mJEXIFSection.Data) {
- ALOGE(" Not enough memory\n");
- DiscardData();
- DiscardSections();
- return;
- }
- memcpy(mJEXIFSection.Data,
- mJEXIFTmp->Data, mJEXIFTmp->Size);
- DiscardData();
- DiscardSections();
-
- wStream = new SkFILEWStream(jpegPath.string());
- skBMDec = PiPCopyToOneFile(&mInterpr->camera[0]->skBMtmp,
- &mInterpr->camera[1]->skBMtmp);
- if (!skBMDec) {
- ALOGE("skBMDec is null\n");
- delete wStream;
- return;
- }
-
- if (encodeJPEG(wStream, skBMDec, jpegPath) != false) {
- printf("%s():%d:: Failed during jpeg encode\n",
- __FUNCTION__,__LINE__);
- mInterpr->PiPUnlock();
- return;
- }
- mPiPIdx = 0;
- JpegIdx++;
- delete wStream;
- }
- } else {
- mPiPIdx++;
- }
- disablePiPCapture();
- }
- }
-
- if ((msgType & CAMERA_MSG_PREVIEW_METADATA) && (NULL != metadata)) {
- printf("Face detected %d \n", metadata->number_of_faces);
- }
- mInterpr->PiPUnlock();
-
-}
-
-/*===========================================================================
- * FUNCTION : postDataTimestamp
- *
- * DESCRIPTION: handles recording callbacks
- *
- * PARAMETERS :
- * @timestamp : timestamp of buffer
- * @msgType : type of buffer
- * @dataPtr : buffer data
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::postDataTimestamp(nsecs_t timestamp,
- int32_t msgType,
- const sp<IMemory>& dataPtr)
-{
- printf("Recording cb: %d %lld %p\n",
- msgType, (long long int)timestamp, dataPtr.get());
-}
-
-/*===========================================================================
- * FUNCTION : dataCallbackTimestamp
- *
- * DESCRIPTION: handles recording callbacks. Used for ViV recording
- *
- * PARAMETERS :
- * @timestamp : timestamp of buffer
- * @msgType : type of buffer
- * @dataPtr : buffer data
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::dataCallbackTimestamp(nsecs_t timestamp,
- int32_t msgType,
- const sp<IMemory>& dataPtr)
-{
- mInterpr->ViVLock();
- // Not needed check. Just avoiding warnings of not used variables.
- if (timestamp > 0)
- timestamp = 0;
- // Not needed check. Just avoiding warnings of not used variables.
- if (msgType > 0)
- msgType = 0;
- size_t i = 0;
- void * srcBuff = NULL;
- void * dstBuff = NULL;
-
- size_t srcYStride = 0, dstYStride = 0;
- size_t srcUVStride = 0, dstUVStride = 0;
- size_t srcYScanLines = 0, dstYScanLines = 0;
- size_t srcUVScanLines = 0, dstUVScanLines = 0;
- size_t srcOffset = 0, dstOffset = 0;
- size_t srcBaseOffset = 0;
- size_t dstBaseOffset = 0;
- Size currentVideoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
- status_t err = NO_ERROR;
- ANativeWindowBuffer* anb = NULL;
-
- dstBuff = (void *) dataPtr->pointer();
- if (NULL == dstBuff) {
- printf("Cannot access destination buffer!!!\n");
- mInterpr->ViVUnlock();
- return;
- }
-
- if (mCameraIndex == mInterpr->mViVVid.sourceCameraID) {
- srcYStride = calcStride(currentVideoSize.width);
- srcUVStride = calcStride(currentVideoSize.width);
- srcYScanLines = calcYScanLines(currentVideoSize.height);
- srcUVScanLines = calcUVScanLines(currentVideoSize.height);
- mInterpr->mViVBuff.srcWidth = (size_t)currentVideoSize.width;
- mInterpr->mViVBuff.srcHeight = (size_t)currentVideoSize.height;
-
-
- mInterpr->mViVBuff.YStride = srcYStride;
- mInterpr->mViVBuff.UVStride = srcUVStride;
- mInterpr->mViVBuff.YScanLines = srcYScanLines;
- mInterpr->mViVBuff.UVScanLines = srcUVScanLines;
-
- memcpy( mInterpr->mViVBuff.buff, dstBuff,
- mInterpr->mViVBuff.buffSize);
-
- mInterpr->mViVVid.isBuffValid = true;
- } else if (mCameraIndex == mInterpr->mViVVid.destinationCameraID) {
- if(mInterpr->mViVVid.isBuffValid == true) {
- dstYStride = calcStride(currentVideoSize.width);
- dstUVStride = calcStride(currentVideoSize.width);
- dstYScanLines = calcYScanLines(currentVideoSize.height);
- dstUVScanLines = calcUVScanLines(currentVideoSize.height);
-
- srcYStride = mInterpr->mViVBuff.YStride;
- srcUVStride = mInterpr->mViVBuff.UVStride;
- srcYScanLines = mInterpr->mViVBuff.YScanLines;
- srcUVScanLines = mInterpr->mViVBuff.UVScanLines;
-
-
- for (i = 0; i < mInterpr->mViVBuff.srcHeight; i++) {
- srcOffset = i*srcYStride;
- dstOffset = i*dstYStride;
- memcpy((unsigned char *) dstBuff + dstOffset,
- (unsigned char *) mInterpr->mViVBuff.buff +
- srcOffset, mInterpr->mViVBuff.srcWidth);
- }
- srcBaseOffset = srcYStride * srcYScanLines;
- dstBaseOffset = dstYStride * dstYScanLines;
- for (i = 0; i < mInterpr->mViVBuff.srcHeight / 2; i++) {
- srcOffset = i*srcUVStride + srcBaseOffset;
- dstOffset = i*dstUVStride + dstBaseOffset;
- memcpy((unsigned char *) dstBuff + dstOffset,
- (unsigned char *) mInterpr->mViVBuff.buff +
- srcOffset, mInterpr->mViVBuff.srcWidth);
- }
-
- err = native_window_dequeue_buffer_and_wait(
- mInterpr->mViVVid.ANW.get(),&anb);
- if (err != NO_ERROR) {
- printf("Cannot dequeue anb for sensor %d!!!\n", mCameraIndex);
- mInterpr->ViVUnlock();
- return;
- }
- mInterpr->mViVVid.graphBuf = new GraphicBuffer(anb, false);
- if(NULL == mInterpr->mViVVid.graphBuf.get()) {
- printf("Invalid Graphic buffer\n");
- mInterpr->ViVUnlock();
- return;
- }
- err = mInterpr->mViVVid.graphBuf->lock(
- GRALLOC_USAGE_SW_WRITE_OFTEN,
- (void**)(&mInterpr->mViVVid.mappedBuff));
- if (err != NO_ERROR) {
- printf("Graphic buffer could not be locked %d!!!\n", err);
- mInterpr->ViVUnlock();
- return;
- }
-
- srcYStride = dstYStride;
- srcUVStride = dstUVStride;
- srcYScanLines = dstYScanLines;
- srcUVScanLines = dstUVScanLines;
- srcBuff = dstBuff;
-
- for (i = 0; i < (size_t)currentVideoSize.height; i++) {
- srcOffset = i*srcYStride;
- dstOffset = i*dstYStride;
- memcpy((unsigned char *) mInterpr->mViVVid.mappedBuff +
- dstOffset, (unsigned char *) srcBuff +
- srcOffset, (size_t)currentVideoSize.width);
- }
-
- srcBaseOffset = srcYStride * srcYScanLines;
- dstBaseOffset = dstUVStride * (size_t)currentVideoSize.height;
-
- for (i = 0; i < (size_t)currentVideoSize.height / 2; i++) {
- srcOffset = i*srcUVStride + srcBaseOffset;
- dstOffset = i*dstUVStride + dstBaseOffset;
- memcpy((unsigned char *) mInterpr->mViVVid.mappedBuff +
- dstOffset, (unsigned char *) srcBuff +
- srcOffset, (size_t)currentVideoSize.width);
- }
-
-
- mInterpr->mViVVid.graphBuf->unlock();
-
- err = mInterpr->mViVVid.ANW->queueBuffer(
- mInterpr->mViVVid.ANW.get(), anb, -1);
- if(err)
- printf("Failed to enqueue buffer to recorder!!!\n");
- }
- }
- mCamera->releaseRecordingFrame(dataPtr);
-
- mInterpr->ViVUnlock();
-}
-
-/*===========================================================================
- * FUNCTION : ViVEncoderThread
- *
- * DESCRIPTION: Creates a separate thread for ViV recording
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-status_t Interpreter::ViVEncoderThread()
-{
- int ret = NO_ERROR;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
-
- ret = pthread_create(&mViVEncThread, &attr, ThreadWrapper, this);
- ret = pthread_attr_destroy(&attr);
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : ThreadWrapper
- *
- * DESCRIPTION: Helper function for for ViV recording thread
- *
- * PARAMETERS : Interpreter context
- *
- * RETURN : None
- *==========================================================================*/
-void *Interpreter::ThreadWrapper(void *context) {
- Interpreter *writer = static_cast<Interpreter *>(context);
- writer->ViVEncode();
- return NULL;
-}
-
-/*===========================================================================
- * FUNCTION : ViVEncode
- *
- * DESCRIPTION: Thread for ViV encode. Buffers from video codec are sent to
- * muxer and saved in a file.
- *
- * PARAMETERS : Interpreter context
- *
- * RETURN : None
- *==========================================================================*/
-void Interpreter::ViVEncode()
-{
- status_t err = NO_ERROR;
- ssize_t trackIdx = -1;
- uint32_t debugNumFrames = 0;
-
- size_t bufIndex, offset, size;
- int64_t ptsUsec;
- uint32_t flags;
- bool DoRecording = true;
-
-
- err = mTestContext->mViVVid.codec->getOutputBuffers(
- &mTestContext->mViVVid.buffers);
- if (err != NO_ERROR) {
- printf("Unable to get output buffers (err=%d)\n", err);
- }
-
- while (DoRecording) {
- err = mTestContext->mViVVid.codec->dequeueOutputBuffer(
- &bufIndex,
- &offset,
- &size,
- &ptsUsec,
- &flags, -1);
-
- switch (err) {
-
- case NO_ERROR:
- // got a buffer
- if ((flags & MediaCodec::BUFFER_FLAG_CODECCONFIG) != 0) {
- // ignore this -- we passed the CSD into MediaMuxer when
- // we got the format change notification
- size = 0;
- }
- if (size != 0) {
- // If the virtual display isn't providing us with timestamps,
- // use the current time.
- if (ptsUsec == 0) {
- ptsUsec = systemTime(SYSTEM_TIME_MONOTONIC) / 1000;
- }
-
- // The MediaMuxer docs are unclear, but it appears that we
- // need to pass either the full set of BufferInfo flags, or
- // (flags & BUFFER_FLAG_SYNCFRAME).
- err = mTestContext->mViVVid.muxer->writeSampleData(
- mTestContext->mViVVid.buffers[bufIndex],
- (size_t)trackIdx,
- ptsUsec,
- flags);
- if (err != NO_ERROR) {
- fprintf(stderr, "Failed writing data to muxer (err=%d)\n",
- err);
- }
- debugNumFrames++;
- }
- err = mTestContext->mViVVid.codec->releaseOutputBuffer(bufIndex);
- if (err != NO_ERROR) {
- fprintf(stderr, "Unable to release output buffer (err=%d)\n",
- err);
- }
- if ((flags & MediaCodec::BUFFER_FLAG_EOS) != 0) {
- // Not expecting EOS from SurfaceFlinger. Go with it.
- printf("Received end-of-stream\n");
- //DoRecording = false;
- }
- break;
- case -EAGAIN: // INFO_TRY_AGAIN_LATER
- ALOGV("Got -EAGAIN, looping");
- break;
- case INFO_FORMAT_CHANGED: // INFO_OUTPUT_FORMAT_CHANGED
- {
- // format includes CSD, which we must provide to muxer
- sp<AMessage> newFormat;
- mTestContext->mViVVid.codec->getOutputFormat(&newFormat);
- trackIdx = mTestContext->mViVVid.muxer->addTrack(newFormat);
- err = mTestContext->mViVVid.muxer->start();
- if (err != NO_ERROR) {
- printf("Unable to start muxer (err=%d)\n", err);
- }
- }
- break;
- case INFO_OUTPUT_BUFFERS_CHANGED: // INFO_OUTPUT_BUFFERS_CHANGED
- // not expected for an encoder; handle it anyway
- ALOGV("Encoder buffers changed");
- err = mTestContext->mViVVid.codec->getOutputBuffers(
- &mTestContext->mViVVid.buffers);
- if (err != NO_ERROR) {
- printf("Unable to get new output buffers (err=%d)\n", err);
- }
- break;
- case INVALID_OPERATION:
- DoRecording = false;
- break;
- default:
- printf("Got weird result %d from dequeueOutputBuffer\n", err);
- break;
- }
- }
-
- return;
-}
-
-/*===========================================================================
- * FUNCTION : calcBufferSize
- *
- * DESCRIPTION: Temp buffer size calculation. Temp buffer is used to store
- * the buffer from the camera with smaller resolution. It is
- * copied to the buffer from camera with higher resolution.
- *
- * PARAMETERS :
- * @width : video size width
- * @height : video size height
- *
- * RETURN : size_t
- *==========================================================================*/
-size_t CameraContext::calcBufferSize(int width, int height)
-{
- size_t size = 0;
- size_t UVAlignment;
- size_t YPlane, UVPlane, YStride, UVStride, YScanlines, UVScanlines;
- if (!width || !height) {
- return size;
- }
- UVAlignment = 4096;
- YStride = calcStride(width);
- UVStride = calcStride(width);
- YScanlines = calcYScanLines(height);
- UVScanlines = calcUVScanLines(height);
- YPlane = YStride * YScanlines;
- UVPlane = UVStride * UVScanlines + UVAlignment;
- size = YPlane + UVPlane;
- size = VIDEO_BUF_ALLIGN(size, 4096);
-
- return size;
-}
-
-/*===========================================================================
- * FUNCTION : calcStride
- *
- * DESCRIPTION: Temp buffer stride calculation.
- *
- * PARAMETERS :
- * @width : video size width
- *
- * RETURN : size_t
- *==========================================================================*/
-size_t CameraContext::calcStride(int width)
-{
- size_t alignment, stride = 0;
- if (!width) {
- return stride;
- }
- alignment = 128;
- stride = VIDEO_BUF_ALLIGN((size_t)width, alignment);
-
- return stride;
-}
-
-/*===========================================================================
- * FUNCTION : calcYScanLines
- *
- * DESCRIPTION: Temp buffer scanlines calculation for Y plane.
- *
- * PARAMETERS :
- * @width : video size height
- *
- * RETURN : size_t
- *==========================================================================*/
-size_t CameraContext::calcYScanLines(int height)
-{
- size_t alignment, scanlines = 0;
- if (!height) {
- return scanlines;
- }
- alignment = 32;
- scanlines = VIDEO_BUF_ALLIGN((size_t)height, alignment);
-
- return scanlines;
-}
-
-/*===========================================================================
- * FUNCTION : calcUVScanLines
- *
- * DESCRIPTION: Temp buffer scanlines calculation for UV plane.
- *
- * PARAMETERS :
- * @width : video size height
- *
- * RETURN : size_t
- *==========================================================================*/
-size_t CameraContext::calcUVScanLines(int height)
-{
- size_t alignment, scanlines = 0;
- if (!height) {
- return scanlines;
- }
- alignment = 16;
- scanlines = VIDEO_BUF_ALLIGN((size_t)((height + 1) >> 1), alignment);
-
- return scanlines;
-}
-
-/*===========================================================================
- * FUNCTION : printSupportedParams
- *
- * DESCRIPTION: dump common supported parameters
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::printSupportedParams()
-{
- const char *camera_ids = mParams.get("camera-indexes");
- const char *pic_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES);
- const char *pic_formats = mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS);
- const char *preview_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
- const char *video_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES);
- const char *preview_formats = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS);
- const char *frame_rates = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES);
- const char *thumb_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES);
- const char *wb_modes = mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE);
- const char *effects = mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS);
- const char *scene_modes = mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES);
- const char *focus_modes = mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES);
- const char *antibanding_modes = mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING);
- const char *flash_modes = mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
- int focus_areas = mParams.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS);
- const char *fps_ranges = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE);
- const char *focus_distances = mParams.get(CameraParameters::KEY_FOCUS_DISTANCES);
-
- printf("\n\r\tSupported Cameras: %s",
- (camera_ids != NULL)? camera_ids : "NULL");
- printf("\n\r\tSupported Picture Sizes: %s",
- (pic_sizes != NULL)? pic_sizes : "NULL");
- printf("\n\r\tSupported Picture Formats: %s",
- (pic_formats != NULL)? pic_formats : "NULL");
- printf("\n\r\tSupported Preview Sizes: %s",
- (preview_sizes != NULL)? preview_sizes : "NULL");
- printf("\n\r\tSupported Video Sizes: %s",
- (video_sizes != NULL)? video_sizes : "NULL");
- printf("\n\r\tSupported Preview Formats: %s",
- (preview_formats != NULL)? preview_formats : "NULL");
- printf("\n\r\tSupported Preview Frame Rates: %s",
- (frame_rates != NULL)? frame_rates : "NULL");
- printf("\n\r\tSupported Thumbnail Sizes: %s",
- (thumb_sizes != NULL)? thumb_sizes : "NULL");
- printf("\n\r\tSupported Whitebalance Modes: %s",
- (wb_modes != NULL)? wb_modes : "NULL");
- printf("\n\r\tSupported Effects: %s",
- (effects != NULL)? effects : "NULL");
- printf("\n\r\tSupported Scene Modes: %s",
- (scene_modes != NULL)? scene_modes : "NULL");
- printf("\n\r\tSupported Focus Modes: %s",
- (focus_modes != NULL)? focus_modes : "NULL");
- printf("\n\r\tSupported Antibanding Options: %s",
- (antibanding_modes != NULL)? antibanding_modes : "NULL");
- printf("\n\r\tSupported Flash Modes: %s",
- (flash_modes != NULL)? flash_modes : "NULL");
- printf("\n\r\tSupported Focus Areas: %d", focus_areas);
- printf("\n\r\tSupported FPS ranges : %s",
- (fps_ranges != NULL)? fps_ranges : "NULL");
- printf("\n\r\tFocus Distances: %s \n",
- (focus_distances != NULL)? focus_distances : "NULL");
-}
-
-/*===========================================================================
- * FUNCTION : createPreviewSurface
- *
- * DESCRIPTION: helper function for creating preview surfaces
- *
- * PARAMETERS :
- * @width : preview width
- * @height: preview height
- * @pixFormat : surface pixelformat
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::createPreviewSurface(int width, int height, int32_t pixFormat)
-{
- int ret = NO_ERROR;
- DisplayInfo dinfo;
- sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(
- ISurfaceComposer::eDisplayIdMain));
- SurfaceComposerClient::getDisplayInfo(display, &dinfo);
- uint32_t previewWidth, previewHeight;
-
- if ((0 >= width) || (0 >= height)) {
- printf("Bad preview surface size %dx%d\n", width, height);
- return BAD_VALUE;
- }
-
- if ((int)dinfo.w < width) {
- previewWidth = dinfo.w;
- } else {
- previewWidth = (unsigned int)width;
- }
-
- if ((int)dinfo.h < height) {
- previewHeight = dinfo.h;
- } else {
- previewHeight = (unsigned int)height;
- }
-
- mClient = new SurfaceComposerClient();
-
- if ( NULL == mClient.get() ) {
- printf("Unable to establish connection to Surface Composer \n");
- return NO_INIT;
- }
-
- mSurfaceControl = mClient->createSurface(String8("QCamera_Test"),
- previewWidth,
- previewHeight,
- pixFormat,
- 0);
- if ( NULL == mSurfaceControl.get() ) {
- printf("Unable to create preview surface \n");
- return NO_INIT;
- }
-
- mPreviewSurface = mSurfaceControl->getSurface();
- if ( NULL != mPreviewSurface.get() ) {
- mClient->openGlobalTransaction();
- ret |= mSurfaceControl->setLayer(0x7fffffff);
- if ( mCameraIndex == 0 )
- ret |= mSurfaceControl->setPosition(0, 0);
- else
- ret |= mSurfaceControl->setPosition((float)(dinfo.w - previewWidth),
- (float)(dinfo.h - previewHeight));
-
- ret |= mSurfaceControl->setSize(previewWidth, previewHeight);
- ret |= mSurfaceControl->show();
- mClient->closeGlobalTransaction();
-
- if ( NO_ERROR != ret ) {
- printf("Preview surface configuration failed! \n");
- }
- } else {
- ret = NO_INIT;
- }
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : destroyPreviewSurface
- *
- * DESCRIPTION: closes previously open preview surface
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::destroyPreviewSurface()
-{
- if ( NULL != mPreviewSurface.get() ) {
- mPreviewSurface.clear();
- }
-
- if ( NULL != mSurfaceControl.get() ) {
- mSurfaceControl->clear();
- mSurfaceControl.clear();
- }
-
- if ( NULL != mClient.get() ) {
- mClient->dispose();
- mClient.clear();
- }
-
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : CameraContext
- *
- * DESCRIPTION: camera context constructor
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-CameraContext::CameraContext(int cameraIndex) :
- mCameraIndex(cameraIndex),
- mResizePreview(true),
- mHardwareActive(false),
- mPreviewRunning(false),
- mRecordRunning(false),
- mVideoFd(-1),
- mVideoIdx(0),
- mRecordingHint(false),
- mDoPrintMenu(true),
- mPiPCapture(false),
- mfmtMultiplier(1),
- mSectionsRead(false),
- mSectionsAllocated(0),
- mSections(NULL),
- mJEXIFTmp(NULL),
- mHaveAll(false),
- mCamera(NULL),
- mClient(NULL),
- mSurfaceControl(NULL),
- mPreviewSurface(NULL),
- mInUse(false)
-{
- mRecorder = new MediaRecorder(String16("camera"));
-}
-
-/*===========================================================================
- * FUNCTION : setTestCtxInstance
- *
- * DESCRIPTION : Sends TestContext instance to CameraContext
- *
- * PARAMETERS :
- * @instance : TestContext instance
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::setTestCtxInstance(TestContext *instance)
-{
- mInterpr = instance;
-}
-
-/*===========================================================================
- * FUNCTION : setTestCtxInst
- *
- * DESCRIPTION : Sends TestContext instance to Interpreter
- *
- * PARAMETERS :
- * @instance : TestContext instance
- *
- * RETURN : None
- *==========================================================================*/
-void Interpreter::setTestCtxInst(TestContext *instance)
-{
- mTestContext = instance;
-}
-
-/*===========================================================================
- * FUNCTION : ~CameraContext
- *
- * DESCRIPTION: camera context destructor
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-CameraContext::~CameraContext()
-{
- stopPreview();
- closeCamera();
-}
-
-/*===========================================================================
- * FUNCTION : openCamera
- *
- * DESCRIPTION: connects to and initializes camera
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::openCamera()
-{
- useLock();
- const char *ZSLStr = NULL;
- size_t ZSLStrSize = 0;
-
- if ( NULL != mCamera.get() ) {
- printf("Camera already open! \n");
- signalFinished();
- return NO_ERROR;
- }
-
- printf("openCamera(camera_index=%d)\n", mCameraIndex);
-
-#ifndef USE_JB_MR1
-
- String16 packageName("CameraTest");
-
- mCamera = Camera::connect(mCameraIndex,
- packageName,
- Camera::USE_CALLING_UID);
-
-#else
-
- mCamera = Camera::connect(mCameraIndex);
-
-#endif
-
- if ( NULL == mCamera.get() ) {
- printf("Unable to connect to CameraService\n");
- signalFinished();
- return NO_INIT;
- }
-
- mParams = mCamera->getParameters();
- mParams.getSupportedPreviewSizes(mSupportedPreviewSizes);
- mParams.getSupportedPictureSizes(mSupportedPictureSizes);
- mParams.getSupportedVideoSizes(mSupportedVideoSizes);
-
- mCurrentPictureSizeIdx = mSupportedPictureSizes.size() / 2;
- mCurrentPreviewSizeIdx = mSupportedPreviewSizes.size() / 2;
- mCurrentVideoSizeIdx = mSupportedVideoSizes.size() / 2;
-
- mCamera->setListener(this);
- mHardwareActive = true;
-
- mInterpr->setViVSize((Size) mSupportedVideoSizes.itemAt(
- mCurrentVideoSizeIdx),
- mCameraIndex);
-
- ZSLStr = mParams.get(CameraContext::KEY_ZSL);
- if (NULL != ZSLStr) {
- ZSLStrSize = strlen(ZSLStr);
- if (!strncmp(ZSLStr, "on", ZSLStrSize)) {
- mInterpr->mIsZSLOn = true;
- } else if (!strncmp(ZSLStr, "off", ZSLStrSize)) {
- mInterpr->mIsZSLOn = false;
- } else {
- printf("zsl value is not valid!\n");
- }
- } else {
- printf("zsl is NULL\n");
- }
-
- signalFinished();
-
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : onAsBinder
- *
- * DESCRIPTION: onAsBinder
- *
- * PARAMETERS : None
- *
- * RETURN : Pointer to IBinder
- *==========================================================================*/
-IBinder* CameraContext::onAsBinder() {
- return NULL;
-}
-
-/*===========================================================================
- * FUNCTION : getNumberOfCameras
- *
- * DESCRIPTION: returns the number of supported camera by the system
- *
- * PARAMETERS : None
- *
- * RETURN : supported camera count
- *==========================================================================*/
-int CameraContext::getNumberOfCameras()
-{
- int ret = -1;
-
- if ( NULL != mCamera.get() ) {
- ret = mCamera->getNumberOfCameras();
- }
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : closeCamera
- *
- * DESCRIPTION: closes a previously the initialized camera reference
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::closeCamera()
-{
- useLock();
- if ( NULL == mCamera.get() ) {
- return NO_INIT;
- }
-
- mCamera->disconnect();
- mCamera.clear();
-
- mRecorder->init();
- mRecorder->close();
- mRecorder->release();
- mRecorder.clear();
-
- mHardwareActive = false;
- mPreviewRunning = false;
- mRecordRunning = false;
-
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : startPreview
- *
- * DESCRIPTION: starts camera preview
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::startPreview()
-{
- useLock();
-
- int ret = NO_ERROR;
- int previewWidth, previewHeight;
- Size calculatedPreviewSize;
- Size currentPreviewSize = mSupportedPreviewSizes.itemAt(
- mCurrentPreviewSizeIdx);
- Size currentPictureSize = mSupportedPictureSizes.itemAt(
- mCurrentPictureSizeIdx);
- Size currentVideoSize = mSupportedVideoSizes.itemAt(
- mCurrentVideoSizeIdx);
-
-#ifndef USE_JB_MR1
-
- sp<IGraphicBufferProducer> gbp;
-
-#endif
-
- if (!mHardwareActive ) {
- printf("Camera not active! \n");
- return NO_INIT;
- }
-
- if (mPreviewRunning) {
- printf("Preview is already running! \n");
- signalFinished();
- return NO_ERROR;
- }
-
- if (mResizePreview) {
- mPreviewRunning = false;
-
- if ( mRecordingHint ) {
- calculatedPreviewSize =
- getPreviewSizeFromVideoSizes(currentVideoSize);
- previewWidth = calculatedPreviewSize.width;
- previewHeight = calculatedPreviewSize.height;
- } else {
- previewWidth = currentPreviewSize.width;
- previewHeight = currentPreviewSize.height;
- }
-
- ret = createPreviewSurface(previewWidth,
- previewHeight,
- HAL_PIXEL_FORMAT_YCrCb_420_SP);
- if ( NO_ERROR != ret ) {
- printf("Error while creating preview surface\n");
- return ret;
- }
-
- // set rdi mode if system prop is set for front camera
- if (mCameraIndex == 1) {
- char value[32];
- property_get("persist.camera.rdimode", value, "0");
- int rdimode = atoi(value);
- printf("rdi mode = %d\n", rdimode);
- if (rdimode == 1) {
- mParams.set("rdi-mode", "enable");
- } else {
- mParams.set("rdi-mode", "disable");
- }
- } else {
- mParams.set("rdi-mode", "disable");
- }
-
- //mParams.set("rdi-mode", "enable");
- mParams.set("recording-hint", "true");
- mParams.setPreviewSize(previewWidth, previewHeight);
- mParams.setPictureSize(currentPictureSize.width,
- currentPictureSize.height);
- mParams.setVideoSize(
- currentVideoSize.width, currentVideoSize.height);
-
- ret |= mCamera->setParameters(mParams.flatten());
-
-#ifndef USE_JB_MR1
-
- gbp = mPreviewSurface->getIGraphicBufferProducer();
- ret |= mCamera->setPreviewTarget(gbp);
-
-#else
-
- ret |= mCamera->setPreviewDisplay(mPreviewSurface);
-
-#endif
- mResizePreview = false;
- }
-
- if ( !mPreviewRunning ) {
- ret |= mCamera->startPreview();
- if ( NO_ERROR != ret ) {
- printf("Preview start failed! \n");
- return ret;
- }
-
- mPreviewRunning = true;
- }
-
- signalFinished();
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : getPreviewSizeFromVideoSizes
- *
- * DESCRIPTION: Get the preview size from video size. Find all resolutions with
- * the same aspect ratio and choose the same or the closest
- * from them.
- *
- * PARAMETERS :
- * @currentVideoSize: current video size
-
- *
- * RETURN : PreviewSize
- *==========================================================================*/
-Size CameraContext::getPreviewSizeFromVideoSizes(Size currentVideoSize)
-{
-
- Size tmpPreviewSize;
- Size PreviewSize;
- Size PreviewSizes[mSupportedPreviewSizes.size()];
- double tolerance = 0.00001;
- double videoRatio;
- double previewRatio;
- size_t i = 0;
- size_t j = 0;
- int delta;
-
- // Find all the resolutions with the same aspect ratio and choose the
- // same or the closest resolution from them. Choose the closest resolution
- // in case same aspect ratio is not found
- if (currentVideoSize.width * currentVideoSize.height > 0 &&
- mSupportedPreviewSizes.size() > 0) {
- videoRatio = (float)currentVideoSize.width /
- (float)currentVideoSize.height;
- for (i=0; i<mSupportedPreviewSizes.size(); i++) {
- tmpPreviewSize = mSupportedPreviewSizes.itemAt(i);
- previewRatio = (float)tmpPreviewSize.width /
- (float)tmpPreviewSize.height;
- if (fabs(videoRatio - previewRatio) < tolerance) {
- PreviewSizes[j] = tmpPreviewSize;
- j++;
- }
- }
-
- if ( j > 0 ) {
- delta = abs((currentVideoSize.width *currentVideoSize.height)-
- (PreviewSizes[0].width * PreviewSizes[0].height));
- PreviewSize = PreviewSizes[0];
- for (i=0; i<j; i++) {
- if(abs(currentVideoSize.width * currentVideoSize.height) -
- (PreviewSizes[i].width * PreviewSizes[i].height) <
- delta) {
- PreviewSize = PreviewSizes[i];
- delta = abs((currentVideoSize.width *
- currentVideoSize.height) -
- (PreviewSizes[i].width * PreviewSizes[i].height));
- }
- }
- } else {
- // Choose the closest resolution in case same aspect ratio is
- // not found
- tmpPreviewSize = mSupportedPreviewSizes.itemAt(j);
- PreviewSize = tmpPreviewSize;
- delta = abs(
- (currentVideoSize.width * currentVideoSize.height)-
- (tmpPreviewSize.width * tmpPreviewSize.height));
- for (i=0; i<mSupportedPreviewSizes.size(); i++) {
- tmpPreviewSize = mSupportedPreviewSizes.itemAt(i);
- if(abs(
- (currentVideoSize.width * currentVideoSize.height)-
- (tmpPreviewSize.width * tmpPreviewSize.height)) <
- delta) {
- PreviewSize = tmpPreviewSize;
- delta = abs(
- (currentVideoSize.width * currentVideoSize.height)-
- (tmpPreviewSize.width * tmpPreviewSize.height));
- }
- }
- }
- } else {
- memset(&PreviewSize, 0, sizeof(PreviewSize));
- }
- return PreviewSize;
-}
-
-/*===========================================================================
- * FUNCTION : autoFocus
- *
- * DESCRIPTION: Triggers autofocus
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::autoFocus()
-{
- useLock();
- status_t ret = NO_ERROR;
-
- if ( mPreviewRunning ) {
- ret = mCamera->autoFocus();
- }
-
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : enablePreviewCallbacks
- *
- * DESCRIPTION: Enables preview callback messages
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::enablePreviewCallbacks()
-{
- useLock();
- if ( mHardwareActive ) {
- mCamera->setPreviewCallbackFlags(
- CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
- }
-
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : takePicture
- *
- * DESCRIPTION: triggers image capture
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::takePicture()
-{
- status_t ret = NO_ERROR;
- useLock();
- if ( mPreviewRunning ) {
- ret = mCamera->takePicture(
- CAMERA_MSG_COMPRESSED_IMAGE|
- CAMERA_MSG_RAW_IMAGE);
- if (!mRecordingHint && !mInterpr->mIsZSLOn) {
- mPreviewRunning = false;
- }
- } else {
- printf("Please resume/start the preview before taking a picture!\n");
- }
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : configureRecorder
- *
- * DESCRIPTION: Configure video recorder
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::configureRecorder()
-{
- useLock();
- status_t ret = NO_ERROR;
-
- mResizePreview = true;
- mParams.set("recording-hint", "true");
- mRecordingHint = true;
- mCamera->setParameters(mParams.flatten());
-
- Size videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
- ret = mRecorder->setParameters(
- String8("video-param-encoding-bitrate=64000"));
- if ( ret != NO_ERROR ) {
- LOGE("Could not configure recorder (%d)", ret);
- return ret;
- }
-
- ret = mRecorder->setCamera(
- mCamera->remote(), mCamera->getRecordingProxy());
- if ( ret != NO_ERROR ) {
- LOGE("Could not set camera (%d)", ret);
- return ret;
- }
- ret = mRecorder->setVideoSource(VIDEO_SOURCE_CAMERA);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set video soruce (%d)", ret);
- return ret;
- }
- ret = mRecorder->setAudioSource(AUDIO_SOURCE_DEFAULT);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set audio source (%d)", ret);
- return ret;
- }
- ret = mRecorder->setOutputFormat(OUTPUT_FORMAT_DEFAULT);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set output format (%d)", ret);
- return ret;
- }
-
- ret = mRecorder->setVideoEncoder(VIDEO_ENCODER_DEFAULT);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set video encoder (%d)", ret);
- return ret;
- }
-
- char fileName[100];
-
- snprintf(fileName, sizeof(fileName) / sizeof(char),
- "/sdcard/vid_cam%d_%dx%d_%d.mpeg", mCameraIndex,
- videoSize.width, videoSize.height, mVideoIdx++);
-
- if ( mVideoFd < 0 ) {
- mVideoFd = open(fileName, O_CREAT | O_RDWR );
- }
-
- if ( mVideoFd < 0 ) {
- LOGE("Could not open video file for writing %s!", fileName);
- return UNKNOWN_ERROR;
- }
-
- ret = mRecorder->setOutputFile(mVideoFd, 0, 0);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set output file (%d)", ret);
- return ret;
- }
-
- ret = mRecorder->setVideoSize(videoSize.width, videoSize.height);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set video size %dx%d", videoSize.width,
- videoSize.height);
- return ret;
- }
-
- ret = mRecorder->setVideoFrameRate(30);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set video frame rate (%d)", ret);
- return ret;
- }
-
- ret = mRecorder->setAudioEncoder(AUDIO_ENCODER_DEFAULT);
- if ( ret != NO_ERROR ) {
- LOGE("Could not set audio encoder (%d)", ret);
- return ret;
- }
-
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : unconfigureViVRecording
- *
- * DESCRIPTION: Unconfigures video in video recording
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::unconfigureRecorder()
-{
- useLock();
-
- if ( !mRecordRunning ) {
- mResizePreview = true;
- mParams.set("recording-hint", "false");
- mRecordingHint = false;
- mCamera->setParameters(mParams.flatten());
- }
-
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : configureViVRecording
- *
- * DESCRIPTION: Configures video in video recording
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::configureViVRecording()
-{
- status_t ret = NO_ERROR;
-
- mResizePreview = true;
- mParams.set("recording-hint", "true");
- mRecordingHint = true;
- mCamera->setParameters(mParams.flatten());
- mCamera->setRecordingProxyListener(this);
-
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : startRecording
- *
- * DESCRIPTION: triggers start recording
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::startRecording()
-{
- useLock();
- status_t ret = NO_ERROR;
-
-
- if ( mPreviewRunning ) {
-
- mCamera->unlock();
-
- ret = mRecorder->prepare();
- if ( ret != NO_ERROR ) {
- LOGE("Could not prepare recorder");
- return ret;
- }
-
- ret = mRecorder->start();
- if ( ret != NO_ERROR ) {
- LOGE("Could not start recorder");
- return ret;
- }
-
- mRecordRunning = true;
- }
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : stopRecording
- *
- * DESCRIPTION: triggers start recording
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::stopRecording()
-{
- useLock();
- status_t ret = NO_ERROR;
-
- if ( mRecordRunning ) {
- mRecorder->stop();
- close(mVideoFd);
- mVideoFd = -1;
-
- mRecordRunning = false;
- }
-
- signalFinished();
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : startViVRecording
- *
- * DESCRIPTION: Starts video in video recording
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::startViVRecording()
-{
- useLock();
- status_t ret;
-
- if (mInterpr->mViVVid.VideoSizes[0].width *
- mInterpr->mViVVid.VideoSizes[0].height >=
- mInterpr->mViVVid.VideoSizes[1].width *
- mInterpr->mViVVid.VideoSizes[1].height) {
- mInterpr->mViVBuff.buffSize = calcBufferSize(
- mInterpr->mViVVid.VideoSizes[1].width,
- mInterpr->mViVVid.VideoSizes[1].height);
- if (mInterpr->mViVBuff.buff == NULL) {
- mInterpr->mViVBuff.buff =
- (void *)malloc(mInterpr->mViVBuff.buffSize);
- }
- mInterpr->mViVVid.sourceCameraID = 1;
- mInterpr->mViVVid.destinationCameraID = 0;
-
- } else {
- mInterpr->mViVBuff.buffSize = calcBufferSize(
- mInterpr->mViVVid.VideoSizes[0].width,
- mInterpr->mViVVid.VideoSizes[0].height);
- if (mInterpr->mViVBuff.buff == NULL) {
- mInterpr->mViVBuff.buff =
- (void *)malloc(mInterpr->mViVBuff.buffSize);
- }
- mInterpr->mViVVid.sourceCameraID = 0;
- mInterpr->mViVVid.destinationCameraID = 1;
- }
-
- ret = mCamera->startRecording();
-
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : stopViVRecording
- *
- * DESCRIPTION: Stops video in video recording
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::stopViVRecording()
-{
- useLock();
- status_t ret = NO_ERROR;
-
- mCamera->stopRecording();
-
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : stopPreview
- *
- * DESCRIPTION: stops camera preview
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::stopPreview()
-{
- useLock();
- status_t ret = NO_ERROR;
-
- if ( mHardwareActive ) {
- mCamera->stopPreview();
- ret = destroyPreviewSurface();
- }
-
- mPreviewRunning = false;
- mResizePreview = true;
-
- signalFinished();
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : resumePreview
- *
- * DESCRIPTION: resumes camera preview after image capture
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::resumePreview()
-{
- useLock();
- status_t ret = NO_ERROR;
-
- if ( mHardwareActive ) {
- ret = mCamera->startPreview();
- mPreviewRunning = true;
- } else {
- ret = NO_INIT;
- }
-
- signalFinished();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : nextPreviewSize
- *
- * DESCRIPTION: Iterates through all supported preview sizes.
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::nextPreviewSize()
-{
- useLock();
- if ( mHardwareActive ) {
- mCurrentPreviewSizeIdx += 1;
- mCurrentPreviewSizeIdx %= mSupportedPreviewSizes.size();
- Size previewSize = mSupportedPreviewSizes.itemAt(
- mCurrentPreviewSizeIdx);
- mParams.setPreviewSize(previewSize.width,
- previewSize.height);
- mResizePreview = true;
-
- if ( mPreviewRunning ) {
- mCamera->stopPreview();
- mCamera->setParameters(mParams.flatten());
- mCamera->startPreview();
- } else {
- mCamera->setParameters(mParams.flatten());
- }
- }
-
- signalFinished();
- return NO_ERROR;
-}
-
-
-/*===========================================================================
- * FUNCTION : setPreviewSize
- *
- * DESCRIPTION: Sets exact preview size if supported
- *
- * PARAMETERS : format size in the form of WIDTHxHEIGHT
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::setPreviewSize(const char *format)
-{
- useLock();
- if ( mHardwareActive ) {
- int newHeight;
- int newWidth;
- sscanf(format, "%dx%d", &newWidth, &newHeight);
-
- unsigned int i;
- for (i = 0; i < mSupportedPreviewSizes.size(); ++i) {
- Size previewSize = mSupportedPreviewSizes.itemAt(i);
- if ( newWidth == previewSize.width &&
- newHeight == previewSize.height )
- {
- break;
- }
-
- }
- if ( i == mSupportedPreviewSizes.size())
- {
- printf("Preview size %dx%d not supported !\n",
- newWidth, newHeight);
- return INVALID_OPERATION;
- }
-
- mParams.setPreviewSize(newWidth,
- newHeight);
- mResizePreview = true;
-
- if ( mPreviewRunning ) {
- mCamera->stopPreview();
- mCamera->setParameters(mParams.flatten());
- mCamera->startPreview();
- } else {
- mCamera->setParameters(mParams.flatten());
- }
- }
-
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : getCurrentPreviewSize
- *
- * DESCRIPTION: queries the currently configured preview size
- *
- * PARAMETERS :
- * @previewSize : preview size currently configured
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::getCurrentPreviewSize(Size &previewSize)
-{
- useLock();
- if ( mHardwareActive ) {
- previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx);
- }
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : nextPictureSize
- *
- * DESCRIPTION: Iterates through all supported picture sizes.
- *
- * PARAMETERS : None
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::nextPictureSize()
-{
- useLock();
- if ( mHardwareActive ) {
- mCurrentPictureSizeIdx += 1;
- mCurrentPictureSizeIdx %= mSupportedPictureSizes.size();
- Size pictureSize = mSupportedPictureSizes.itemAt(
- mCurrentPictureSizeIdx);
- mParams.setPictureSize(pictureSize.width,
- pictureSize.height);
- mCamera->setParameters(mParams.flatten());
- }
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : setPictureSize
- *
- * DESCRIPTION: Sets exact preview size if supported
- *
- * PARAMETERS : format size in the form of WIDTHxHEIGHT
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::setPictureSize(const char *format)
-{
- useLock();
- if ( mHardwareActive ) {
- int newHeight;
- int newWidth;
- sscanf(format, "%dx%d", &newWidth, &newHeight);
-
- unsigned int i;
- for (i = 0; i < mSupportedPictureSizes.size(); ++i) {
- Size PictureSize = mSupportedPictureSizes.itemAt(i);
- if ( newWidth == PictureSize.width &&
- newHeight == PictureSize.height )
- {
- break;
- }
-
- }
- if ( i == mSupportedPictureSizes.size())
- {
- printf("Preview size %dx%d not supported !\n",
- newWidth, newHeight);
- return INVALID_OPERATION;
- }
-
- mParams.setPictureSize(newWidth,
- newHeight);
- mCamera->setParameters(mParams.flatten());
- }
-
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : nextVideoSize
- *
- * DESCRIPTION: Select the next available video size
- *
- * PARAMETERS : none
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::nextVideoSize()
-{
- useLock();
- if ( mHardwareActive ) {
- mCurrentVideoSizeIdx += 1;
- mCurrentVideoSizeIdx %= mSupportedVideoSizes.size();
- Size videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
- mParams.setVideoSize(videoSize.width,
- videoSize.height);
- mCamera->setParameters(mParams.flatten());
- mInterpr->setViVSize((Size) mSupportedVideoSizes.itemAt(
- mCurrentVideoSizeIdx), mCameraIndex);
- }
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : setVideoSize
- *
- * DESCRIPTION: Set video size
- *
- * PARAMETERS :
- * @format : format
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::setVideoSize(const char *format)
-{
- useLock();
- if ( mHardwareActive ) {
- int newHeight;
- int newWidth;
- sscanf(format, "%dx%d", &newWidth, &newHeight);
-
- unsigned int i;
- for (i = 0; i < mSupportedVideoSizes.size(); ++i) {
- Size PictureSize = mSupportedVideoSizes.itemAt(i);
- if ( newWidth == PictureSize.width &&
- newHeight == PictureSize.height )
- {
- break;
- }
-
- }
- if ( i == mSupportedVideoSizes.size())
- {
- printf("Preview size %dx%d not supported !\n",
- newWidth, newHeight);
- return INVALID_OPERATION;
- }
-
- mParams.setVideoSize(newWidth,
- newHeight);
- mCamera->setParameters(mParams.flatten());
- }
-
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : getCurrentVideoSize
- *
- * DESCRIPTION : Get current video size
- *
- * PARAMETERS :
- * @videoSize: video Size
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::getCurrentVideoSize(Size &videoSize)
-{
- useLock();
- if ( mHardwareActive ) {
- videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
- }
- signalFinished();
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : getCurrentPictureSize
- *
- * DESCRIPTION: queries the currently configured picture size
- *
- * PARAMETERS :
- * @pictureSize : picture size currently configured
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t CameraContext::getCurrentPictureSize(Size &pictureSize)
-{
- useLock();
- if ( mHardwareActive ) {
- pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx);
- }
- signalFinished();
- return NO_ERROR;
-}
-
-}; //namespace qcamera ends here
-
-using namespace qcamera;
-
-/*===========================================================================
- * FUNCTION : printMenu
- *
- * DESCRIPTION: prints the available camera options
- *
- * PARAMETERS :
- * @currentCamera : camera context currently being used
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::printMenu(sp<CameraContext> currentCamera)
-{
- if ( !mDoPrintMenu ) return;
- Size currentPictureSize, currentPreviewSize, currentVideoSize;
- const char *zsl_mode = mParams.get(CameraContext::KEY_ZSL);
-
- assert(currentCamera.get());
-
- currentCamera->getCurrentPictureSize(currentPictureSize);
- currentCamera->getCurrentPreviewSize(currentPreviewSize);
- currentCamera->getCurrentVideoSize(currentVideoSize);
-
- printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n");
-
- printf(" \n\nSTART / STOP / GENERAL SERVICES \n");
- printf(" -----------------------------\n");
- printf(" %c. Switch camera - Current Index: %d\n",
- Interpreter::SWITCH_CAMERA_CMD,
- currentCamera->getCameraIndex());
- printf(" %c. Resume Preview after capture \n",
- Interpreter::RESUME_PREVIEW_CMD);
- printf(" %c. Quit \n",
- Interpreter::EXIT_CMD);
- printf(" %c. Camera Capability Dump",
- Interpreter::DUMP_CAPS_CMD);
-
- printf(" \n\n PREVIEW SUB MENU \n");
- printf(" -----------------------------\n");
- printf(" %c. Start Preview\n",
- Interpreter::START_PREVIEW_CMD);
- printf(" %c. Stop Preview\n",
- Interpreter::STOP_PREVIEW_CMD);
- printf(" %c. Preview size: %dx%d\n",
- Interpreter::CHANGE_PREVIEW_SIZE_CMD,
- currentPreviewSize.width,
- currentPreviewSize.height);
- printf(" %c. Video size: %dx%d\n",
- Interpreter::CHANGE_VIDEO_SIZE_CMD,
- currentVideoSize.width,
- currentVideoSize.height);
- printf(" %c. Start Recording\n",
- Interpreter::START_RECORD_CMD);
- printf(" %c. Stop Recording\n",
- Interpreter::STOP_RECORD_CMD);
- printf(" %c. Start ViV Recording\n",
- Interpreter::START_VIV_RECORD_CMD);
- printf(" %c. Stop ViV Recording\n",
- Interpreter::STOP_VIV_RECORD_CMD);
- printf(" %c. Enable preview frames\n",
- Interpreter::ENABLE_PRV_CALLBACKS_CMD);
- printf(" %c. Trigger autofocus \n",
- Interpreter::AUTOFOCUS_CMD);
-
- printf(" \n\n IMAGE CAPTURE SUB MENU \n");
- printf(" -----------------------------\n");
- printf(" %c. Take picture/Full Press\n",
- Interpreter::TAKEPICTURE_CMD);
- printf(" %c. Take picture in picture\n",
- Interpreter::TAKEPICTURE_IN_PICTURE_CMD);
- printf(" %c. Picture size: %dx%d\n",
- Interpreter::CHANGE_PICTURE_SIZE_CMD,
- currentPictureSize.width,
- currentPictureSize.height);
- printf(" %c. zsl: %s\n", Interpreter::ZSL_CMD,
- (zsl_mode != NULL) ? zsl_mode : "NULL");
-
- printf("\n Choice: ");
-}
-
-/*===========================================================================
- * FUNCTION : enablePrintPreview
- *
- * DESCRIPTION: Enables printing the preview
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::enablePrintPreview()
-{
- mDoPrintMenu = true;
-}
-
-/*===========================================================================
- * FUNCTION : disablePrintPreview
- *
- * DESCRIPTION: Disables printing the preview
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::disablePrintPreview()
-{
- mDoPrintMenu = false;
-}
-
-/*===========================================================================
- * FUNCTION : enablePiPCapture
- *
- * DESCRIPTION: Enables picture in picture capture
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::enablePiPCapture()
-{
- mPiPCapture = true;
-}
-
-/*===========================================================================
- * FUNCTION : disablePiPCapture
- *
- * DESCRIPTION: Disables picture in picture capture
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::disablePiPCapture()
-{
- mPiPCapture = false;
-}
-
-/*===========================================================================
- * FUNCTION : getZSL
- *
- * DESCRIPTION: get ZSL value of current camera
- *
- * PARAMETERS : None
- *
- * RETURN : current zsl value
- *==========================================================================*/
-const char *CameraContext::getZSL()
-{
- return mParams.get(CameraContext::KEY_ZSL);
-}
-
-/*===========================================================================
- * FUNCTION : setZSL
- *
- * DESCRIPTION: set ZSL value of current camera
- *
- * PARAMETERS : zsl value to be set
- *
- * RETURN : None
- *==========================================================================*/
-void CameraContext::setZSL(const char *value)
-{
- mParams.set(CameraContext::KEY_ZSL, value);
- mCamera->setParameters(mParams.flatten());
-}
-
-/*===========================================================================
- * FUNCTION : configureViVCodec
- *
- * DESCRIPTION: Configures video in video codec
- *
- * PARAMETERS : none
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t Interpreter::configureViVCodec()
-{
- status_t ret = NO_ERROR;
- char fileName[100];
- sp<AMessage> format = new AMessage;
- sp<ALooper> looper = new ALooper;
-
- if (mTestContext->mViVVid.VideoSizes[0].width *
- mTestContext->mViVVid.VideoSizes[0].height >=
- mTestContext->mViVVid.VideoSizes[1].width *
- mTestContext->mViVVid.VideoSizes[1].height) {
- snprintf(fileName, sizeof(fileName) / sizeof(char), "/sdcard/ViV_vid_%dx%d_%d.mp4",
- mTestContext->mViVVid.VideoSizes[0].width,
- mTestContext->mViVVid.VideoSizes[0].height,
- mTestContext->mViVVid.ViVIdx++);
- format->setInt32("width", mTestContext->mViVVid.VideoSizes[0].width);
- format->setInt32("height", mTestContext->mViVVid.VideoSizes[0].height);
- } else {
- snprintf(fileName, sizeof(fileName) / sizeof(char), "/sdcard/ViV_vid_%dx%d_%d.mp4",
- mTestContext->mViVVid.VideoSizes[1].width,
- mTestContext->mViVVid.VideoSizes[1].height,
- mTestContext->mViVVid.ViVIdx++);
- format->setInt32("width", mTestContext->mViVVid.VideoSizes[1].width);
- format->setInt32("height", mTestContext->mViVVid.VideoSizes[1].height);
- }
- int fd = open(fileName, O_CREAT | O_RDWR );
- if (fd < 0) {
- LOGE("Error opening file");
- return UNKNOWN_ERROR;
- }
- mTestContext->mViVVid.muxer = new MediaMuxer(
- fd, MediaMuxer::OUTPUT_FORMAT_MPEG_4);
-
- format->setString("mime", "video/avc");
- format->setInt32("color-format", OMX_COLOR_FormatAndroidOpaque);
-
- format->setInt32("bitrate", 1000000);
- format->setFloat("frame-rate", 30);
- format->setInt32("i-frame-interval", 10);
-
- looper->setName("ViV_recording_looper");
- looper->start();
- ALOGV("Creating codec");
- mTestContext->mViVVid.codec = MediaCodec::CreateByType(
- looper, "video/avc", true);
- if (mTestContext->mViVVid.codec == NULL) {
- fprintf(stderr, "ERROR: unable to create video/avc codec instance\n");
- return UNKNOWN_ERROR;
- }
- ret = mTestContext->mViVVid.codec->configure(format, NULL, NULL,
- MediaCodec::CONFIGURE_FLAG_ENCODE);
- if (ret != NO_ERROR) {
- mTestContext->mViVVid.codec->release();
- mTestContext->mViVVid.codec.clear();
-
- fprintf(stderr, "ERROR: unable to configure codec (err=%d)\n", ret);
- return ret;
- }
-
- ALOGV("Creating buffer producer");
- ret = mTestContext->mViVVid.codec->createInputSurface(
- &mTestContext->mViVVid.bufferProducer);
- if (ret != NO_ERROR) {
- mTestContext->mViVVid.codec->release();
- mTestContext->mViVVid.codec.clear();
-
- fprintf(stderr,
- "ERROR: unable to create encoder input surface (err=%d)\n", ret);
- return ret;
- }
-
- ret = mTestContext->mViVVid.codec->start();
- if (ret != NO_ERROR) {
- mTestContext->mViVVid.codec->release();
- mTestContext->mViVVid.codec.clear();
-
- fprintf(stderr, "ERROR: unable to start codec (err=%d)\n", ret);
- return ret;
- }
- ALOGV("Codec prepared");
-
- mTestContext->mViVVid.surface = new Surface(
- mTestContext->mViVVid.bufferProducer);
- mTestContext->mViVVid.ANW = mTestContext->mViVVid.surface;
- ret = native_window_api_connect(mTestContext->mViVVid.ANW.get(),
- NATIVE_WINDOW_API_CPU);
- if (mTestContext->mViVVid.VideoSizes[0].width *
- mTestContext->mViVVid.VideoSizes[0].height >=
- mTestContext->mViVVid.VideoSizes[1].width *
- mTestContext->mViVVid.VideoSizes[1].height) {
- native_window_set_buffers_format(mTestContext->mViVVid.ANW.get(),
- HAL_PIXEL_FORMAT_NV12_ENCODEABLE);
- native_window_set_buffers_dimensions(mTestContext->mViVVid.ANW.get(),
- mTestContext->mViVVid.VideoSizes[0].width,
- mTestContext->mViVVid.VideoSizes[0].height);
- } else {
- native_window_set_buffers_format(mTestContext->mViVVid.ANW.get(),
- HAL_PIXEL_FORMAT_NV12_ENCODEABLE);
- native_window_set_buffers_dimensions(mTestContext->mViVVid.ANW.get(),
- mTestContext->mViVVid.VideoSizes[1].width,
- mTestContext->mViVVid.VideoSizes[1].height);
- }
- native_window_set_usage(mTestContext->mViVVid.ANW.get(),
- GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
- native_window_set_buffer_count(mTestContext->mViVVid.ANW.get(),
- mTestContext->mViVVid.buff_cnt);
-
- ViVEncoderThread();
-
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : unconfigureViVCodec
- *
- * DESCRIPTION: Unconfigures video in video codec
- *
- * PARAMETERS : none
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t Interpreter::unconfigureViVCodec()
-{
- status_t ret = NO_ERROR;
-
- ret = native_window_api_disconnect(mTestContext->mViVVid.ANW.get(),
- NATIVE_WINDOW_API_CPU);
- mTestContext->mViVVid.bufferProducer = NULL;
- mTestContext->mViVVid.codec->stop();
- pthread_join(mViVEncThread, NULL);
- mTestContext->mViVVid.muxer->stop();
- mTestContext->mViVVid.codec->release();
- mTestContext->mViVVid.codec.clear();
- mTestContext->mViVVid.muxer.clear();
- mTestContext->mViVVid.surface.clear();
- return ret;
-}
-
-/*===========================================================================
- * FUNCTION : Interpreter
- *
- * DESCRIPTION: Interpreter constructor
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-Interpreter::Interpreter(const char *file)
- : mCmdIndex(0)
- , mScript(NULL)
-{
- if (!file){
- printf("no File Given\n");
- mUseScript = false;
- return;
- }
-
- FILE *fh = fopen(file, "r");
- if ( !fh ) {
- printf("Could not open file %s\n", file);
- mUseScript = false;
- return;
- }
-
- fseek(fh, 0, SEEK_END);
- size_t len = (size_t)ftell(fh);
- rewind(fh);
-
- if( !len ) {
- printf("Script file %s is empty !\n", file);
- fclose(fh);
- return;
- }
-
- mScript = new char[len + 1];
- if ( !mScript ) {
- fclose(fh);
- return;
- }
-
- fread(mScript, sizeof(char), len, fh);
- mScript[len] = '\0'; // ensure null terminated;
- fclose(fh);
-
-
- char *p1;
- char *p2;
- p1 = p2 = mScript;
-
- do {
- switch (*p1) {
- case '\0':
- case '|':
- p1++;
- break;
- case SWITCH_CAMERA_CMD:
- case RESUME_PREVIEW_CMD:
- case START_PREVIEW_CMD:
- case STOP_PREVIEW_CMD:
- case CHANGE_PREVIEW_SIZE_CMD:
- case CHANGE_PICTURE_SIZE_CMD:
- case START_RECORD_CMD:
- case STOP_RECORD_CMD:
- case START_VIV_RECORD_CMD:
- case STOP_VIV_RECORD_CMD:
- case DUMP_CAPS_CMD:
- case AUTOFOCUS_CMD:
- case TAKEPICTURE_CMD:
- case TAKEPICTURE_IN_PICTURE_CMD:
- case ENABLE_PRV_CALLBACKS_CMD:
- case EXIT_CMD:
- case ZSL_CMD:
- case DELAY:
- p2 = p1;
- while( (p2 != (mScript + len)) && (*p2 != '|')) {
- p2++;
- }
- *p2 = '\0';
- if (p2 == (p1 + 1))
- mCommands.push_back(Command(
- static_cast<Interpreter::Commands_e>(*p1)));
- else
- mCommands.push_back(Command(
- static_cast<Interpreter::Commands_e>(*p1), (p1 + 1)));
- p1 = p2;
- break;
- default:
- printf("Invalid cmd %c \n", *p1);
- do {
- p1++;
-
- } while(*p1 != '|' && p1 != (mScript + len));
-
- }
- } while(p1 != (mScript + len));
- mUseScript = true;
-}
-
-/*===========================================================================
- * FUNCTION : ~Interpreter
- *
- * DESCRIPTION: Interpreter destructor
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-Interpreter::~Interpreter()
-{
- if ( mScript )
- delete[] mScript;
-
- mCommands.clear();
-}
-
-/*===========================================================================
- * FUNCTION : getCommand
- *
- * DESCRIPTION : Get a command from interpreter
- *
- * PARAMETERS :
- * @currentCamera: Current camera context
- *
- * RETURN : command
- *==========================================================================*/
-Interpreter::Command Interpreter::getCommand(
- sp<CameraContext> currentCamera)
-{
- if( mUseScript ) {
- return mCommands[mCmdIndex++];
- } else {
- currentCamera->printMenu(currentCamera);
- return Interpreter::Command(
- static_cast<Interpreter::Commands_e>(getchar()));
- }
-}
-
-/*===========================================================================
- * FUNCTION : TestContext
- *
- * DESCRIPTION : TestContext constructor
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-TestContext::TestContext()
-{
- int i = 0;
- mTestRunning = false;
- mInterpreter = NULL;
- mViVVid.ViVIdx = 0;
- mViVVid.buff_cnt = 9;
- mViVVid.graphBuf = 0;
- mViVVid.mappedBuff = NULL;
- mViVVid.isBuffValid = false;
- mViVVid.sourceCameraID = -1;
- mViVVid.destinationCameraID = -1;
- mPiPinUse = false;
- mViVinUse = false;
- mIsZSLOn = false;
- memset(&mViVBuff, 0, sizeof(ViVBuff_t));
-
- ProcessState::self()->startThreadPool();
-
- do {
- camera[i] = new CameraContext(i);
- if ( NULL == camera[i].get() ) {
- break;
- }
- camera[i]->setTestCtxInstance(this);
-
- //by default open only back camera
- if (i==0) {
- status_t stat = camera[i]->openCamera();
- if ( NO_ERROR != stat ) {
- printf("Error encountered Openging camera id : %d\n", i);
- break;
- }
- }
- mAvailableCameras.add(camera[i]);
- i++;
- } while ( i < camera[0]->getNumberOfCameras() ) ;
-
- if (i < camera[0]->getNumberOfCameras() ) {
- for (size_t j = 0; j < mAvailableCameras.size(); j++) {
- camera[j] = mAvailableCameras.itemAt(j);
- camera[j]->closeCamera();
- camera[j].clear();
- }
-
- mAvailableCameras.clear();
- }
-}
-
-/*===========================================================================
- * FUNCTION : ~TestContext
- *
- * DESCRIPTION : TestContext destructor
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-TestContext::~TestContext()
-{
- delete mInterpreter;
-
- for (size_t j = 0; j < mAvailableCameras.size(); j++) {
- camera[j] = mAvailableCameras.itemAt(j);
- camera[j]->closeCamera();
- camera[j].clear();
- }
-
- mAvailableCameras.clear();
-}
-
-/*===========================================================================
- * FUNCTION : GetCamerasNum
- *
- * DESCRIPTION : Get the number of available cameras
- *
- * PARAMETERS : None
- *
- * RETURN : Number of cameras
- *==========================================================================*/
-size_t TestContext::GetCamerasNum()
-{
- return mAvailableCameras.size();
-}
-
-/*===========================================================================
- * FUNCTION : AddScriptFromFile
- *
- * DESCRIPTION : Add script from file
- *
- * PARAMETERS :
- * @scriptFile : Script file
- *
- * RETURN : status_t type of status
- * NO_ERROR -- success
- * none-zero failure code
- *==========================================================================*/
-status_t TestContext::AddScriptFromFile(const char *scriptFile)
-{
- mInterpreter = new Interpreter(scriptFile);
- mInterpreter->setTestCtxInst(this);
-
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : releasePiPBuff
- *
- * DESCRIPTION : Release video in video temp buffer
- *
- * PARAMETERS : None
- *
- * RETURN : None
- *==========================================================================*/
-void Interpreter::releasePiPBuff() {
- free(mTestContext->mViVBuff.buff);
- mTestContext->mViVBuff.buff = NULL;
-}
-
-/*===========================================================================
- * FUNCTION : functionalTest
- *
- * DESCRIPTION: queries and executes client supplied commands for testing a
- * particular camera.
- *
- * PARAMETERS :
- * @availableCameras : List with all cameras supported
- *
- * RETURN : status_t type of status
- * NO_ERROR -- continue testing
- * none-zero -- quit test
- *==========================================================================*/
-status_t TestContext::FunctionalTest()
-{
- status_t stat = NO_ERROR;
- const char *ZSLStr = NULL;
- size_t ZSLStrSize = 0;
-
- assert(mAvailableCameras.size());
-
- if ( !mInterpreter ) {
- mInterpreter = new Interpreter();
- mInterpreter->setTestCtxInst(this);
- }
-
- if (mAvailableCameras.size() == 0) {
- printf("no cameras supported... exiting test app\n");
- } else {
- mTestRunning = true;
- }
-
- while (mTestRunning) {
- sp<CameraContext> currentCamera =
- mAvailableCameras.itemAt(mCurrentCameraIndex);
- Interpreter::Command command =
- mInterpreter->getCommand(currentCamera);
- currentCamera->enablePrintPreview();
-
- switch (command.cmd) {
- case Interpreter::SWITCH_CAMERA_CMD:
- {
- mCurrentCameraIndex++;
- mCurrentCameraIndex %= mAvailableCameras.size();
- currentCamera = mAvailableCameras.itemAt(mCurrentCameraIndex);
- stat = currentCamera->openCamera();
- }
- break;
-
- case Interpreter::RESUME_PREVIEW_CMD:
- {
- stat = currentCamera->resumePreview();
- }
- break;
-
- case Interpreter::START_PREVIEW_CMD:
- {
- stat = currentCamera->startPreview();
- }
- break;
-
- case Interpreter::STOP_PREVIEW_CMD:
- {
- stat = currentCamera->stopPreview();
- }
- break;
-
- case Interpreter::CHANGE_VIDEO_SIZE_CMD:
- {
- if ( command.arg )
- stat = currentCamera->setVideoSize(command.arg);
- else
- stat = currentCamera->nextVideoSize();
- }
- break;
-
- case Interpreter::CHANGE_PREVIEW_SIZE_CMD:
- {
- if ( command.arg )
- stat = currentCamera->setPreviewSize(command.arg);
- else
- stat = currentCamera->nextPreviewSize();
- }
- break;
-
- case Interpreter::CHANGE_PICTURE_SIZE_CMD:
- {
- if ( command.arg )
- stat = currentCamera->setPictureSize(command.arg);
- else
- stat = currentCamera->nextPictureSize();
- }
- break;
-
- case Interpreter::DUMP_CAPS_CMD:
- {
- currentCamera->printSupportedParams();
- }
- break;
-
- case Interpreter::AUTOFOCUS_CMD:
- {
- stat = currentCamera->autoFocus();
- }
- break;
-
- case Interpreter::TAKEPICTURE_CMD:
- {
- stat = currentCamera->takePicture();
- }
- break;
-
- case Interpreter::TAKEPICTURE_IN_PICTURE_CMD:
- {
- if (mAvailableCameras.size() == 2) {
- mSaveCurrentCameraIndex = mCurrentCameraIndex;
- for (size_t i = 0; i < mAvailableCameras.size(); i++) {
- mCurrentCameraIndex = i;
- currentCamera = mAvailableCameras.itemAt(mCurrentCameraIndex);
- currentCamera->enablePiPCapture();
- stat = currentCamera->takePicture();
- }
- mCurrentCameraIndex = mSaveCurrentCameraIndex;
- } else {
- printf("Number of available sensors should be 2\n");
- }
- }
- break;
-
- case Interpreter::ENABLE_PRV_CALLBACKS_CMD:
- {
- stat = currentCamera->enablePreviewCallbacks();
- }
- break;
-
- case Interpreter::START_RECORD_CMD:
- {
- stat = currentCamera->stopPreview();
- stat = currentCamera->configureRecorder();
- stat = currentCamera->startPreview();
- stat = currentCamera->startRecording();
- }
- break;
-
- case Interpreter::STOP_RECORD_CMD:
- {
- stat = currentCamera->stopRecording();
-
- stat = currentCamera->stopPreview();
- stat = currentCamera->unconfigureRecorder();
- stat = currentCamera->startPreview();
- }
- break;
-
- case Interpreter::START_VIV_RECORD_CMD:
- {
-
- if (mAvailableCameras.size() == 2) {
- mSaveCurrentCameraIndex = mCurrentCameraIndex;
- stat = mInterpreter->configureViVCodec();
- for ( size_t i = 0; i < mAvailableCameras.size(); i++ ) {
- mCurrentCameraIndex = i;
- currentCamera = mAvailableCameras.itemAt(
- mCurrentCameraIndex);
- stat = currentCamera->stopPreview();
- stat = currentCamera->configureViVRecording();
- stat = currentCamera->startPreview();
- stat = currentCamera->startViVRecording();
- }
- mCurrentCameraIndex = mSaveCurrentCameraIndex;
- } else {
- printf("Number of available sensors should be 2\n");
- }
-
- }
- break;
-
- case Interpreter::STOP_VIV_RECORD_CMD:
- {
- if (mAvailableCameras.size() == 2) {
- mSaveCurrentCameraIndex = mCurrentCameraIndex;
- for ( size_t i = 0; i < mAvailableCameras.size(); i++ ) {
- mCurrentCameraIndex = i;
- currentCamera = mAvailableCameras.itemAt(
- mCurrentCameraIndex);
- stat = currentCamera->stopViVRecording();
- stat = currentCamera->stopPreview();
- stat = currentCamera->unconfigureRecorder();
- stat = currentCamera->startPreview();
- }
- stat = mInterpreter->unconfigureViVCodec();
- mCurrentCameraIndex = mSaveCurrentCameraIndex;
-
- mInterpreter->releasePiPBuff();
- } else {
- printf("Number of available sensors should be 2\n");
- }
- }
- break;
-
- case Interpreter::EXIT_CMD:
- {
- currentCamera->stopPreview();
- mTestRunning = false;
- }
- break;
-
- case Interpreter::DELAY:
- {
- if ( command.arg ) {
- int delay = atoi(command.arg);
- if (0 < delay) {
- usleep(1000U * (unsigned int)delay);
- }
- }
- }
- break;
-
- case Interpreter::ZSL_CMD:
- {
- currentCamera = mAvailableCameras.itemAt(
- mCurrentCameraIndex);
- ZSLStr = currentCamera->getZSL();
-
- if (NULL != ZSLStr) {
- ZSLStrSize = strlen(ZSLStr);
- if (!strncmp(ZSLStr, "off", ZSLStrSize)) {
- currentCamera->setZSL("on");
- mIsZSLOn = true;
- } else if (!strncmp(ZSLStr, "on", ZSLStrSize)) {
- currentCamera->setZSL("off");
- mIsZSLOn = false;
- } else {
- printf("Set zsl failed!\n");
- }
- } else {
- printf("zsl is NULL\n");
- }
- }
- break;
-
- default:
- {
- currentCamera->disablePrintPreview();
- }
- break;
- }
- printf("Command status 0x%x \n", stat);
- }
-
- return NO_ERROR;
-}
-
-/*===========================================================================
- * FUNCTION : PiPLock
- *
- * DESCRIPTION: Mutex lock for PiP capture
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void TestContext::PiPLock()
-{
- Mutex::Autolock l(mPiPLock);
- while (mPiPinUse) {
- mPiPCond.wait(mPiPLock);
- }
- mPiPinUse = true;
-}
-
-/*===========================================================================
- * FUNCTION : PiPUnLock
- *
- * DESCRIPTION: Mutex unlock for PiP capture
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void TestContext::PiPUnlock()
-{
- Mutex::Autolock l(mPiPLock);
- mPiPinUse = false;
- mPiPCond.signal();
-}
-
-/*===========================================================================
- * FUNCTION : ViVLock
- *
- * DESCRIPTION: Mutex lock for ViV Video
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void TestContext::ViVLock()
-{
- Mutex::Autolock l(mViVLock);
- while (mViVinUse) {
- mViVCond.wait(mViVLock);
- }
- mViVinUse = true;
-}
-
-/*===========================================================================
- * FUNCTION : ViVUnlock
- *
- * DESCRIPTION: Mutex unlock for ViV Video
- *
- * PARAMETERS : none
- *
- * RETURN : none
- *==========================================================================*/
-void TestContext::ViVUnlock()
-{
- Mutex::Autolock l(mViVLock);
- mViVinUse = false;
- mViVCond.signal();
-}
-
-/*===========================================================================
- * FUNCTION : setViVSize
- *
- * DESCRIPTION : Set video in video size
- *
- * PARAMETERS :
- * @VideoSize : video size
- * @camIndex : camera index
- *
- * RETURN : none
- *==========================================================================*/
-void TestContext::setViVSize(Size VideoSize, int camIndex)
-{
- mViVVid.VideoSizes[camIndex] = VideoSize;
-}
-
-/*===========================================================================
- * FUNCTION : main
- *
- * DESCRIPTION : main function
- *
- * PARAMETERS :
- * @argc : argc
- * @argv : argv
- *
- * RETURN : int status
- *==========================================================================*/
-int main(int argc, char *argv[])
-{
- TestContext ctx;
-
- if (argc > 1) {
- if ( ctx.AddScriptFromFile((const char *)argv[1]) ) {
- printf("Could not add script file... "
- "continuing in normal menu mode! \n");
- }
- }
-
- ctx.FunctionalTest();
-
- return 0;
-}