ANativeWindowDisplayAdapter.cpp revision b3fb1a45ce906ab0365f247caf596665ea0c9f39
1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL" 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "ANativeWindowDisplayAdapter.h" 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <OMX_IVCommon.h> 246c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu#include <ui/GraphicBuffer.h> 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <ui/GraphicBufferMapper.h> 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <hal_public.h> 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Constant declarations 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///@todo Check the time units 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int ANativeWindowDisplayAdapter::DISPLAY_TIMEOUT = 1000; // seconds 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Suspends buffers after given amount of failed dq's 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int ANativeWindowDisplayAdapter::FAILED_DQS_TO_SUSPEND = 3; 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_COLOR_FORMATTYPE toOMXPixFormat(const char* parameters_format) 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_COLOR_FORMATTYPE pixFormat; 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( parameters_format != NULL ) 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("CbYCrY format selected"); 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = OMX_COLOR_FormatCbYCrY; 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("YUV420SP format selected"); 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = OMX_COLOR_FormatYUV420SemiPlanar; 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) 55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("RGB565 format selected"); 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = OMX_COLOR_Format16bitRGB565; 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Invalid format, CbYCrY format selected as default"); 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = OMX_COLOR_FormatCbYCrY; 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else { 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Preview format is NULL, defaulting to CbYCrY"); 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = OMX_COLOR_FormatCbYCrY; 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return pixFormat; 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst char* getPixFormatConstant(const char* parameters_format) 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char* pixFormat; 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( parameters_format != NULL ) 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVA("CbYCrY format selected"); 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = (const char *) CameraParameters::PIXEL_FORMAT_YUV422I; 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO(XXX): We are treating YV12 the same as YUV420SP 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVA("YUV420SP format selected"); 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP; 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(parameters_format, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVA("RGB565 format selected"); 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = (const char *) CameraParameters::PIXEL_FORMAT_RGB565; 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid format, CbYCrY format selected as default"); 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = (const char *) CameraParameters::PIXEL_FORMAT_YUV422I; 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Preview format is NULL, defaulting to CbYCrY"); 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pixFormat = (const char *) CameraParameters::PIXEL_FORMAT_YUV422I; 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return pixFormat; 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst size_t getBufSize(const char* parameters_format, int width, int height) 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int buf_size; 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( parameters_format != NULL ) { 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(parameters_format, 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf_size = width * height * 2; 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if((strcmp(parameters_format, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) || 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (strcmp(parameters_format, CameraParameters::PIXEL_FORMAT_YUV420P) == 0)) { 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf_size = width * height * 3 / 2; 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(parameters_format, 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) { 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf_size = width * height * 2; 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid format"); 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf_size = 0; 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Preview format is NULL"); 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf_size = 0; 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return buf_size; 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------ANativeWindowDisplayAdapter Class STARTS here-----------------------------*/ 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Display Adapter class STARTS here.. 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevANativeWindowDisplayAdapter::ANativeWindowDisplayAdapter():mDisplayThread(NULL), 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayState(ANativeWindowDisplayAdapter::DISPLAY_INIT), 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayEnabled(false), 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufferCount(0) 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mShotToShot = false; 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mStartCapture.tv_sec = 0; 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mStartCapture.tv_usec = 0; 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mStandbyToShot.tv_sec = 0; 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mStandbyToShot.tv_usec = 0; 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasureStandby = false; 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPixelFormat = NULL; 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufferHandleMap = NULL; 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mGrallocHandleMap = NULL; 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffsetsMap = NULL; 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider = NULL; 1697702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameWidth = 0; 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameHeight = 0; 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewWidth = 0; 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewHeight = 0; 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSuspend = false; 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFailedDQs = 0; 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPaused = false; 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mXOff = 0; 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mYOff = 0; 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFirstInit = false; 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFD = -1; 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevANativeWindowDisplayAdapter::~ANativeWindowDisplayAdapter() 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Semaphore sem; 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///If Frame provider exists 19797e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu if (mFrameProvider) { 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Unregister with the frame provider 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::ALL_FRAMES); 20097e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu delete mFrameProvider; 201c493114006e0e136c8c88c2fc9865994054959bfSundar Raman mFrameProvider = NULL; 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///The ANativeWindow object will get destroyed here 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev destroy(); 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///If Display thread exists 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mDisplayThread.get()) 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Kill the display thread 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Create(); 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = DisplayThread::DISPLAY_EXIT; 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Send the semaphore to signal once the command is completed 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.arg1 = &sem; 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the message to display thread 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread->msgQ().put(&msg); 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Wait for the ACK - implies that the thread is now started and waiting for frames 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Wait(); 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Exit and cleanup the thread 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread->requestExitAndWait(); 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Delete the display thread 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread.clear(); 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t ANativeWindowDisplayAdapter::initialize() 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Create the display thread 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread = new DisplayThread(this); 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mDisplayThread.get() ) 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't create display thread"); 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Start the display thread 248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = mDisplayThread->run("DisplayThread", PRIORITY_URGENT_DISPLAY); 249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ret != NO_ERROR ) 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't run display thread"); 252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::setPreviewWindow(preview_stream_ops_t* window) 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Note that Display Adapter cannot work without a valid window object 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !window) 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("NULL window object passed to DisplayAdapter"); 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return BAD_VALUE; 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Destroy the existing window object, if it exists 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev destroy(); 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Move to new window obj 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mANativeWindow = window; 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::setFrameProvider(FrameNotifier *frameProvider) 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Check for NULL pointer 28897e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu if ( !frameProvider ) { 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("NULL passed for frame provider"); 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return BAD_VALUE; 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 29497e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu //Release any previous frame providers 29597e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu if ( NULL != mFrameProvider ) { 29697e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu delete mFrameProvider; 29797e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu } 29897e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /** Dont do anything here, Just save the pointer for use when display is 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev actually enabled or disabled 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider = new FrameProvider(frameProvider, this, frameCallbackRelay); 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::setErrorHandler(ErrorNotifier *errorNotifier) 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == errorNotifier ) 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid Error Notifier reference"); 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mErrorNotifier = errorNotifier; 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t ANativeWindowDisplayAdapter::setSnapshotTimeRef(struct timeval *refTime) 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != refTime ) 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(&mStartCapture, refTime, sizeof(struct timeval)); 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::enableDisplay(int width, int height, struct timeval *refTime, S3DParameters *s3dParams) 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Semaphore sem; 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mDisplayEnabled ) 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Display is already enabled"); 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: s3d is not part of bringup...will reenable 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (s3dParams) 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOverlay->set_s3d_params(s3dParams->mode, s3dParams->framePacking, 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev s3dParams->order, s3dParams->subSampling); 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != refTime ) 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(&mStandbyToShot, refTime, sizeof(struct timeval)); 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasureStandby = true; 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Send START_DISPLAY COMMAND to display thread. Display thread will start and then wait for a message 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Create(); 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = DisplayThread::DISPLAY_START; 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Send the semaphore to signal once the command is completed 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.arg1 = &sem; 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the message to display thread 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread->msgQ().put(&msg); 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Wait for the ACK - implies that the thread is now started and waiting for frames 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Wait(); 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Register with the frame provider for frames 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayEnabled = true; 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewWidth = width; 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewHeight = height; 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("mPreviewWidth = %d mPreviewHeight = %d", mPreviewWidth, mPreviewHeight); 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 412816f63fd6a78b45e18819d9967d409c212c88eaeSundar Ramanint ANativeWindowDisplayAdapter::disableDisplay(bool cancel_buffer) 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4147702898343dbb27a4543c642d189cff5de7046c9Sundar Raman status_t ret = NO_ERROR; 4156c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 4167702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mDisplayEnabled) 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Display is already disabled"); 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ALREADY_EXISTS; 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Unregister with the frame provider here 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 4288e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mFrameProvider->removeFramePointers(); 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mDisplayThread.get() ) 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Send STOP_DISPLAY COMMAND to display thread. Display thread will stop and dequeue all messages 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // and then wait for message 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Semaphore sem; 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Create(); 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = DisplayThread::DISPLAY_STOP; 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Send the semaphore to signal once the command is completed 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.arg1 = &sem; 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the message to display thread 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread->msgQ().put(&msg); 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Wait for the ACK for display to be disabled 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Wait(); 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Reset the display enabled flag 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayEnabled = false; 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Reset the offset values 457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mXOff = 0; 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mYOff = 0; 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Reset the frame width and height values 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameWidth =0; 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameHeight = 0; 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewWidth = 0; 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewHeight = 0; 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 466816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman if(cancel_buffer) 467816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman { 468b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman // Return the buffers to ANativeWindow here, the mFramesWithCameraAdapterMap is also cleared inside 469b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman returnBuffersToWindow(); 470816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman } 471816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman else 472816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman { 473816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman mANativeWindow = NULL; 474b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman // Clear the frames with camera adapter map 475b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman mFramesWithCameraAdapterMap.clear(); 476816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman } 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 478b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t ANativeWindowDisplayAdapter::pauseDisplay(bool pause) 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPaused = pause; 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid ANativeWindowDisplayAdapter::destroy() 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Check if the display is disabled, if not disable it 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mDisplayEnabled ) 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("WARNING: Calling destroy of Display adapter when display enabled. Disabling display.."); 510816f63fd6a78b45e18819d9967d409c212c88eaeSundar Raman disableDisplay(false); 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufferCount = 0; 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev// Implementation of inherited interfaces 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const char* format, int &bytes, int numBufs) 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t err; 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i = -1; 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const int lnumBufs = numBufs; 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufferHandleMap = new buffer_handle_t*[lnumBufs]; 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mGrallocHandleMap = new IMG_native_handle_t*[lnumBufs]; 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int undequeued = 0; 5286c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 5296c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu Rect bounds; 5306c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 5327702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( NULL == mANativeWindow ) { 5337702898343dbb27a4543c642d189cff5de7046c9Sundar Raman return NULL; 5347702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 5357702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Set gralloc usage bits for window. 537941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu err = mANativeWindow->set_usage(mANativeWindow, CAMHAL_GRALLOC_USAGE); 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (err != 0) { 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 5407702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 5417702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == err ) { 5427702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 5437702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 5447702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 5457702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Number of buffers set to ANativeWindow %d", numBufs); 550b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman ///Set the number of buffers needed for camera preview 551b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman err = mANativeWindow->set_buffer_count(mANativeWindow, numBufs); 552b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman if (err != 0) { 553b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman LOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), -err); 5547702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 555b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman if ( ENODEV == err ) { 556b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 557b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman mANativeWindow = NULL; 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 559b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 560b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman return NULL; 561b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman } 562b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman CAMHAL_LOGDB("Configuring %d buffers for ANativeWindow", numBufs); 563b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman mBufferCount = numBufs; 564b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Set window geometry 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev err = mANativeWindow->set_buffers_geometry( 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mANativeWindow, 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev width, 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev height, 5712e986e5e29b391b070f608d641538c14b778d4baIliyan Malchev /*toOMXPixFormat(format)*/HAL_PIXEL_FORMAT_TI_NV12); // Gralloc only supports NV12 alloc! 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (err != 0) { 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOGE("native_window_set_buffers_geometry failed: %s (%d)", strerror(-err), -err); 5757702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 5767702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == err ) { 5777702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 5787702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 5797702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 5807702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///We just return the buffers from ANativeWindow, if the width and height are same, else (vstab, vnf case) 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///re-allocate buffers using ANativeWindow and then get them 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo - Re-allocate buffers for vnf and vstab using the width, height, format, numBufs etc 58797e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu if ( mBufferHandleMap == NULL ) 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't create array for ANativeWindow buffers"); 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mANativeWindow->get_min_undequeued_buffer_count(mANativeWindow, &undequeued); 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( i=0; i < mBufferCount; i++ ) 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IMG_native_handle_t** hndl2hndl; 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IMG_native_handle_t* handle; 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int stride; // dummy variable to get stride 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO(XXX): Do we need to keep stride information in camera hal? 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev err = mANativeWindow->dequeue_buffer(mANativeWindow, (buffer_handle_t**) &hndl2hndl, &stride); 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (err != 0) { 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 6077702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 6087702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == err ) { 6097702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 6107702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 6117702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 6127702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev handle = *hndl2hndl; 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufferHandleMap[i] = (buffer_handle_t*) hndl2hndl; 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mGrallocHandleMap[i] = handle; 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFramesWithCameraAdapterMap.add((int) mGrallocHandleMap[i], i); 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytes = getBufSize(format, width, height); 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // lock the initial queueable buffers 6276c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.left = 0; 6286c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.top = 0; 6296c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.right = width; 6306c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.bottom = height; 6316c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for( i = 0; i < mBufferCount-undequeued; i++ ) 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 6346c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu void *y_uv[2]; 6356c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mANativeWindow->lock_buffer(mANativeWindow, mBufferHandleMap[i]); 6376c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 638941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv); 6398e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mFrameProvider->addFramePointers(mGrallocHandleMap[i] , y_uv); 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // return the rest of the buffers back to ANativeWindow 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for(i = (mBufferCount-undequeued); i >= 0 && i < mBufferCount; i++) 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 6457702898343dbb27a4543c642d189cff5de7046c9Sundar Raman err = mANativeWindow->cancel_buffer(mANativeWindow, mBufferHandleMap[i]); 6467702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if (err != 0) { 6477702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEB("cancel_buffer failed: %s (%d)", strerror(-err), -err); 6487702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 6497702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == err ) { 6507702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 6517702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 6527702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 6537702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 6547702898343dbb27a4543c642d189cff5de7046c9Sundar Raman goto fail; 6557702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 6566c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu mFramesWithCameraAdapterMap.removeItem((int) mGrallocHandleMap[i]); 6578e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng //LOCK UNLOCK TO GET YUV POINTERS 6588e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng void *y_uv[2]; 6598e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv); 6608e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mFrameProvider->addFramePointers(mGrallocHandleMap[i] , y_uv); 6618e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mapper.unlock((buffer_handle_t) mGrallocHandleMap[i]); 662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFirstInit = true; 665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPixelFormat = getPixFormatConstant(format); 666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameWidth = width; 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameHeight = height; 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mGrallocHandleMap; 670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fail: 672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // need to cancel buffers if any were dequeued 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int start = 0; start < i && i > 0; start++) { 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int err = mANativeWindow->cancel_buffer(mANativeWindow, mBufferHandleMap[start]); 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (err != 0) { 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("cancelBuffer failed w/ error 0x%08x", err); 6777702898343dbb27a4543c642d189cff5de7046c9Sundar Raman break; 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 6796c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu mFramesWithCameraAdapterMap.removeItem((int) mGrallocHandleMap[start]); 680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error occurred, performing cleanup"); 682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mErrorNotifier.get() ) 684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mErrorNotifier->errorNotify(-ENOMEM); 686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevuint32_t * ANativeWindowDisplayAdapter::getOffsets() 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const int lnumBufs = mBufferCount; 696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO(XXX): Need to remove getOffsets from the API. No longer needed 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mANativeWindow ) 702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("mANativeWindow reference is missing"); 704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( mBufferHandleMap == NULL) 708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Buffers not allocated yet!!"); 710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail; 711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mOffsetsMap == NULL) 714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffsetsMap = new uint32_t[lnumBufs]; 716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for(int i = 0; i < mBufferCount; i++) 717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IMG_native_handle_t* handle = (IMG_native_handle_t*) *(mBufferHandleMap[i]); 719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffsetsMap[i] = 0; 720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mOffsetsMap; 726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fail: 728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mOffsetsMap ) 730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete [] mOffsetsMap; 732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffsetsMap = NULL; 733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mErrorNotifier.get() ) 736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mErrorNotifier->errorNotify(-ENOSYS); 738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NULL; 743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::maxQueueableBuffers(unsigned int& queueable) 746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int ret = NO_ERROR; 749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int undequeued = 0; 750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mBufferCount == 0) 752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -ENOSYS; 754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto end; 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mANativeWindow) 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -ENOSYS; 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto end; 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 7637702898343dbb27a4543c642d189cff5de7046c9Sundar Raman ret = mANativeWindow->get_min_undequeued_buffer_count(mANativeWindow, &undequeued); 7647702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( NO_ERROR != ret ) { 7657702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEB("get_min_undequeued_buffer_count failed: %s (%d)", strerror(-ret), -ret); 7667702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 7677702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == ret ) { 7687702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 7697702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 7707702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 7717702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 7727702898343dbb27a4543c642d189cff5de7046c9Sundar Raman return -ret; 7737702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev queueable = mBufferCount - undequeued; 776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev end: 778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::getFd() 783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mFD == -1) 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev IMG_native_handle_t* handle = (IMG_native_handle_t*) *(mBufferHandleMap[0]); 789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO: should we dup the fd? not really necessary and another thing for ANativeWindow 790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // to manage and close... 791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFD = dup(handle->fd[0]); 792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mFD; 797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 800b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Ramanstatus_t ANativeWindowDisplayAdapter::returnBuffersToWindow() 801b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman{ 802b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman status_t ret = NO_ERROR; 803b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 804b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 805b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman //Give the buffers back to display here - sort of free it 806b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman if (mANativeWindow) 807b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman for(unsigned int i = 0; i < mFramesWithCameraAdapterMap.size(); i++) { 808b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman int value = mFramesWithCameraAdapterMap.valueAt(i); 809b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 810b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman // unlock buffer before giving it up 811b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman mapper.unlock((buffer_handle_t) mGrallocHandleMap[value]); 812b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 813b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman ret = mANativeWindow->cancel_buffer(mANativeWindow, mBufferHandleMap[value]); 814b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman if ( ENODEV == ret ) { 815b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 816b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman mANativeWindow = NULL; 817b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman return -ret; 818b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman } else if ( NO_ERROR != ret ) { 819b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman CAMHAL_LOGEB("cancel_buffer() failed: %s (%d)", 820b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman strerror(-ret), 821b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman -ret); 822b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman return -ret; 823b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman } 824b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman } 825b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman else 826b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman LOGE("mANativeWindow is NULL"); 827b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 828b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman ///Clear the frames with camera adapter map 829b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman mFramesWithCameraAdapterMap.clear(); 830b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 831b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman return ret; 832b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 833b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman} 834b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::freeBuffer(void* buf) 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int *buffers = (int *) buf; 840b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman status_t ret = NO_ERROR; 841b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 842b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman Mutex::Autolock lock(mLock); 843b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if((int *)mGrallocHandleMap != buffers) 845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("CameraHal passed wrong set of buffers to free!!!"); 847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mGrallocHandleMap != NULL) 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete []mGrallocHandleMap; 849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mGrallocHandleMap = NULL; 850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 852b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 853b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman returnBuffersToWindow(); 854b3fb1a45ce906ab0365f247caf596665ea0c9f39Sundar Raman 855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != buf ) 856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete [] buffers; 858348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu mGrallocHandleMap = NULL; 859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( mBufferHandleMap != NULL) 862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete [] mBufferHandleMap; 864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufferHandleMap = NULL; 865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mOffsetsMap ) 868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete [] mOffsetsMap; 870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mOffsetsMap = NULL; 871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( mFD != -1) 874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev close(mFD); // close duped handle 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFD = -1; 877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool ANativeWindowDisplayAdapter::supportsExternalBuffering() 884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return false; 886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint ANativeWindowDisplayAdapter::useBuffers(void *bufArr, int num) 889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid ANativeWindowDisplayAdapter::displayThread() 894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool shouldLive = true; 896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int timeout = 0; 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret; 898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while(shouldLive) 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = TIUTILS::MessageQueue::waitForMsg(&mDisplayThread->msgQ() 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev , &mDisplayQ 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev , NULL 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev , ANativeWindowDisplayAdapter::DISPLAY_TIMEOUT); 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mDisplayThread->msgQ().isEmpty() ) 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Received a message from CameraHal, process it 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev shouldLive = processHalMsg(); 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if( !mDisplayQ.isEmpty()) 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mDisplayState== ANativeWindowDisplayAdapter::DISPLAY_INIT ) 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///If display adapter is not started, continue 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev continue; 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Get the dummy msg from the displayQ 927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mDisplayQ.get(&msg)!=NO_ERROR) 928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error in getting message from display Q"); 930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev continue; 931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // There is a frame from ANativeWindow for us to dequeue 934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // We dequeue and return the frame back to Camera adapter 935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mDisplayState == ANativeWindowDisplayAdapter::DISPLAY_STARTED) 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev handleFrameReturn(); 938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mDisplayState == ANativeWindowDisplayAdapter::DISPLAY_EXITED) 941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///we exit the thread even though there are frames still to dequeue. They will be dequeued 943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///in disableDisplay 944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev shouldLive = false; 945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool ANativeWindowDisplayAdapter::processHalMsg() 955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayThread->msgQ().get(&msg); 962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool ret = true, invalidCommand = false; 963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch ( msg.command ) 965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case DisplayThread::DISPLAY_START: 968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Display thread received DISPLAY_START command from Camera HAL"); 970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayState = ANativeWindowDisplayAdapter::DISPLAY_STARTED; 971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case DisplayThread::DISPLAY_STOP: 975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@bug There is no API to disable SF without destroying it 977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@bug Buffers might still be w/ display and will get displayed 978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks Ideal seqyence should be something like this 979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///mOverlay->setParameter("enabled", false); 980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Display thread received DISPLAY_STOP command from Camera HAL"); 981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayState = ANativeWindowDisplayAdapter::DISPLAY_STOPPED; 982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case DisplayThread::DISPLAY_EXIT: 986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Display thread received DISPLAY_EXIT command from Camera HAL."); 988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Stopping display thread..."); 989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayState = ANativeWindowDisplayAdapter::DISPLAY_EXITED; 990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Note that the SF can have pending buffers when we disable the display 991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///This is normal and the expectation is that they may not be displayed. 992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///This is to ensure that the user experience is not impacted 993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = false; 994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Invalid Display Thread Command 0x%x.", msg.command); 999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev invalidCommand = true; 1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Signal the semaphore if it is sent as part of the message 1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( msg.arg1 ) && ( !invalidCommand ) ) 1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("+Signalling display semaphore"); 1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Semaphore &sem = *((Semaphore*)msg.arg1); 1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sem.Signal(); 1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("-Signalling display semaphore"); 1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t ANativeWindowDisplayAdapter::PostFrame(ANativeWindowDisplayAdapter::DisplayFrame &dispFrame) 1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t actualFramesWithDisplay = 0; 1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev android_native_buffer_t *buffer = NULL; 10276c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i; 1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Do cropping based on the stabilized frame coordinates 1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Insert logic to drop frames here based on refresh rate of 1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///display or rendering rate whichever is lower 1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Queue the buffer to overlay 1034348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu 1035348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu if (!mGrallocHandleMap || !dispFrame.mBuffer) { 1036348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu CAMHAL_LOGEA("NULL sent to PostFrame"); 1037348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu return -EINVAL; 1038348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu } 1039348e4eaaf2f88810f2a3c55fd1b0df540a5104edTyler Luu 1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( i = 0; i < mBufferCount; i++ ) 1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ((int) dispFrame.mBuffer ) == (int)mGrallocHandleMap[i] ) 1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mDisplayState == ANativeWindowDisplayAdapter::DISPLAY_STARTED && 1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (!mPaused || CameraFrame::CameraFrame::SNAPSHOT_FRAME == dispFrame.mType) && 1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev !mSuspend) 1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t xOff = (dispFrame.mOffset% PAGE_SIZE); 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t yOff = (dispFrame.mOffset / PAGE_SIZE); 1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Set crop only if current x and y offsets do not match with frame offsets 1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if((mXOff!=xOff) || (mYOff!=yOff)) 1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Offset %d xOff = %d, yOff = %d", dispFrame.mOffset, xOff, yOff); 1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint8_t bytesPerPixel; 1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Calculate bytes per pixel based on the pixel format 1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(strcmp(mPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) 1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 2; 1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(mPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) 1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 2; 1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(mPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) 1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 1; 1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 1; 1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB(" crop.left = %d crop.top = %d crop.right = %d crop.bottom = %d", 1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev xOff/bytesPerPixel, yOff , (xOff/bytesPerPixel)+mPreviewWidth, yOff+mPreviewHeight); 1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // We'll ignore any errors here, if the surface is 1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // already invalid, we'll know soon enough. 1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mANativeWindow->set_crop(mANativeWindow, xOff/bytesPerPixel, yOff, 1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (xOff/bytesPerPixel)+mPreviewWidth, yOff+mPreviewHeight); 1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Update the current x and y offsets 1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mXOff = xOff; 1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mYOff = yOff; 1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 10916c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu // unlock buffer before sending to display 10926c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu mapper.unlock((buffer_handle_t) mGrallocHandleMap[i]); 1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mANativeWindow->enqueue_buffer(mANativeWindow, mBufferHandleMap[i]); 1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (ret != 0) { 1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOGE("Surface::queueBuffer returned error %d", ret); 1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFramesWithCameraAdapterMap.removeItem((int) dispFrame.mBuffer); 1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // HWComposer has not minimum buffer requirement. We should be able to dequeue 1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // the buffer immediately 1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayQ.put(&msg); 1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mMeasureStandby ) 1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal::PPM("Standby to first shot: Sensor Change completed - ", &mStandbyToShot); 1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasureStandby = false; 1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if (CameraFrame::CameraFrame::SNAPSHOT_FRAME == dispFrame.mType) 1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal::PPM("Shot to snapshot: ", &mStartCapture); 1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mShotToShot = true; 1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( mShotToShot ) 1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal::PPM("Shot to shot: ", &mStartCapture); 1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mShotToShot = false; 1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 11306c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 11316c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu // unlock buffer before giving it up 11326c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu mapper.unlock((buffer_handle_t) mGrallocHandleMap[i]); 11336c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // cancel buffer and dequeue another one 1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mANativeWindow->cancel_buffer(mANativeWindow, mBufferHandleMap[i]); 1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (ret != 0) { 1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOGE("Surface::queueBuffer returned error %d", ret); 1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFramesWithCameraAdapterMap.removeItem((int) dispFrame.mBuffer); 1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayQ.put(&msg); 1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = NO_ERROR; 1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool ANativeWindowDisplayAdapter::handleFrameReturn() 1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t err; 1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buffer_handle_t* buf; 1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i = 0; 1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int stride; // dummy variable to get stride 11576c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 11586c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu Rect bounds; 11596c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu void *y_uv[2]; 11606c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO(XXX): Do we need to keep stride information in camera hal? 1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 11637702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( NULL == mANativeWindow ) { 11647702898343dbb27a4543c642d189cff5de7046c9Sundar Raman return false; 11657702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 11667702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev err = mANativeWindow->dequeue_buffer(mANativeWindow, &buf, &stride); 1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (err != 0) { 1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 11707702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 11717702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == err ) { 11727702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 11737702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 11747702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 11757702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 11767702898343dbb27a4543c642d189cff5de7046c9Sundar Raman return false; 1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev err = mANativeWindow->lock_buffer(mANativeWindow, buf); 1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (err != 0) { 1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("lockbuffer failed: %s (%d)", strerror(-err), -err); 11827702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 11837702898343dbb27a4543c642d189cff5de7046c9Sundar Raman if ( ENODEV == err ) { 11847702898343dbb27a4543c642d189cff5de7046c9Sundar Raman CAMHAL_LOGEA("Preview surface abandoned!"); 11857702898343dbb27a4543c642d189cff5de7046c9Sundar Raman mANativeWindow = NULL; 11867702898343dbb27a4543c642d189cff5de7046c9Sundar Raman } 11877702898343dbb27a4543c642d189cff5de7046c9Sundar Raman 11887702898343dbb27a4543c642d189cff5de7046c9Sundar Raman return false; 1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for(i = 0; i < mBufferCount; i++) 1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mBufferHandleMap[i] == buf) 1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 11976c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu // lock buffer before sending to FrameProvider for filling 11986c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.left = 0; 11996c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.top = 0; 12006c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.right = mFrameWidth; 12016c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu bounds.bottom = mFrameHeight; 12028e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng 12038e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng int lock_try_count = 0; 12048e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng while (mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv) < 0){ 12058e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng if (++lock_try_count > LOCK_BUFFER_TRIES){ 12068e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng if ( NULL != mErrorNotifier.get() ){ 12078e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mErrorNotifier->errorNotify(CAMERA_ERROR_UNKNOWN); 12088e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 12098e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng return false; 12108e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 12118e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng CAMHAL_LOGEA("Gralloc Lock FrameReturn Error: Sleeping 15ms"); 12128e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng usleep(15000); 12138e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 12146c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFramesWithCameraAdapterMap.add((int) mGrallocHandleMap[i], i); 1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("handleFrameReturn: found graphic buffer %d of %d", i, mBufferCount-1); 1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->returnFrame( (void*)mGrallocHandleMap[i], CameraFrame::PREVIEW_FRAME_SYNC); 1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return true; 1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid ANativeWindowDisplayAdapter::frameCallbackRelay(CameraFrame* caFrame) 1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != caFrame ) 1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != caFrame->mCookie ) 1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ANativeWindowDisplayAdapter *da = (ANativeWindowDisplayAdapter*) caFrame->mCookie; 1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev da->frameCallback(caFrame); 1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Invalid Cookie in Camera Frame = %p, Cookie = %p", caFrame, caFrame->mCookie); 1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Invalid Camera Frame = %p", caFrame); 1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid ANativeWindowDisplayAdapter::frameCallback(CameraFrame* caFrame) 1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Call queueBuffer of overlay in the context of the callback thread 1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev DisplayFrame df; 1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mBuffer = caFrame->mBuffer; 1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mType = (CameraFrame::FrameType) caFrame->mFrameType; 1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mOffset = caFrame->mOffset; 1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mWidthStride = caFrame->mAlignment; 1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mLength = caFrame->mLength; 1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mWidth = caFrame->mWidth; 1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev df.mHeight = caFrame->mHeight; 1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev PostFrame(df); 1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------ANativeWindowDisplayAdapter Class ENDS here-----------------------------*/ 1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1263