AppCallbackNotifier.cpp revision 3f75fa6e5edf504c155a357494ab77c59b6887b8
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 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h" 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "VideoMetadata.h" 25ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu#include "Encoder_libjpeg.h" 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <MetadataBufferType.h> 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <ui/GraphicBuffer.h> 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <ui/GraphicBufferMapper.h> 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 306c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu#define LOCK_BUFFER_TRIES 5 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int AppCallbackNotifier::NOTIFIER_TIMEOUT = -1; 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 35ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luuvoid AppCallbackNotifierEncoderCallback(size_t jpeg_size, 36ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu uint8_t* src, 37ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu CameraFrame::FrameType type, 38ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu void* cookie1, 39ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu void* cookie2, 40ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu void* cookie3) 41ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu{ 42ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (cookie1) { 43ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu AppCallbackNotifier* cb = (AppCallbackNotifier*) cookie1; 4436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu cb->EncoderDoneCb(jpeg_size, src, type, cookie2, cookie3); 45ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 46ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu} 47ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------NotificationHandler Class STARTS here-----------------------------*/ 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 5036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luuvoid AppCallbackNotifier::EncoderDoneCb(size_t jpeg_size, uint8_t* src, CameraFrame::FrameType type, void* cookie1, void* cookie2) 51ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu{ 52ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu camera_memory_t* encoded_mem = NULL; 53ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 54ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME; 55ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 567207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman camera_memory_t* picture = NULL; 577207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 587207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 59ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu Mutex::Autolock lock(mLock); 60ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 61ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoded_mem = (camera_memory_t*) cookie1; 62ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 63ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // TODO(XXX): Need to temporarily allocate another chunk of memory and then memcpy 64ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // encoded buffer since MemoryHeapBase and MemoryBase are passed as 65ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // one camera_memory_t structure. How fix this? 66ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 6736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if(encoded_mem && encoded_mem->data) { 6836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (cookie2) { 6936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu ExifElementsTable* exif = (ExifElementsTable*) cookie2; 7036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu Section_t* exif_section = NULL; 7136e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 7236e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif->insertExifToJpeg((unsigned char*) encoded_mem->data, jpeg_size); 7336e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif_section = FindSection(M_EXIF); 7436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 7536e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (exif_section) { 7636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu picture = mRequestMemory(-1, jpeg_size + exif_section->Size, 1, NULL); 7736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (picture && picture->data) { 7836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif->saveJpeg((unsigned char*) picture->data, jpeg_size + exif_section->Size); 7936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 8036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 8136e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu delete exif; 8236e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu cookie2 = NULL; 8336e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } else { 8436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu picture = mRequestMemory(-1, jpeg_size, 1, NULL); 8536e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (picture && picture->data) { 8636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu memcpy(picture->data, encoded_mem->data, jpeg_size); 8736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 8836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 89ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 907207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 91ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 927207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman // Send the callback to the application only if the notifier is started and the message is enabled 937207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if((mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) 947207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman && (mCameraHal->msgTypeEnabled(CAMERA_MSG_COMPRESSED_IMAGE))) 95ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 96ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu Mutex::Autolock lock(mBurstLock); 97ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu#if 0 //TODO: enable burst mode later 98ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if ( mBurst ) 99ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 100ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu `(CAMERA_MSG_BURST_IMAGE, JPEGPictureMemBase, mCallbackCookie); 101ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 102ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu else 103ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu#endif 104ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 105ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, picture, 0, NULL, mCallbackCookie); 106ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 107ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 108ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 109ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (encoded_mem) { 110ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoded_mem->release(encoded_mem); 111ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 112ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 113ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (picture) { 114ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu picture->release(picture); 115ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 116ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 11736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (cookie2) { 11836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu delete (ExifElementsTable*) cookie2; 11936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 12036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 121ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mFrameProvider->returnFrame(src, type); 122ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 123ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME_EXIT; 124ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu} 125ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * NotificationHandler class 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Initialization function for AppCallbackNotifier 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::initialize() 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasurementEnabled = false; 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Create the app notifier thread 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread = new NotificationThread(this); 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mNotificationThread.get()) 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't create Notification thread"); 142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Start the display thread 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = mNotificationThread->run("NotificationThread", PRIORITY_URGENT_DISPLAY); 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(ret!=NO_ERROR) 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't run NotificationThread"); 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread.clear(); 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mUseMetaDataBufferMode = true; 155e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = false; 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setCallbacks(CameraHal* cameraHal, 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_notify_callback notify_cb, 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback data_cb, 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory get_memory, 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *user) 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraHal = cameraHal; 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb = notify_cb; 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb = data_cb; 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCbTimestamp = data_cb_timestamp; 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRequestMemory = get_memory; 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCallbackCookie = user; 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setMeasurements(bool enable) 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasurementEnabled = enable; 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enable ) 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::FRAME_DATA_SYNC); 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//All sub-components of Camera HAL call this whenever any error happens 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::errorNotify(int error) 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("AppCallbackNotifier received error %d", error); 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2070ff71809874c00d540af83c123f3dc34759f1871Sundar Raman // If it is a fatal error abort here! 2080ff71809874c00d540af83c123f3dc34759f1871Sundar Raman if((error == CAMERA_ERROR_FATAL) || (error == CAMERA_ERROR_HARD)) { 2090ff71809874c00d540af83c123f3dc34759f1871Sundar Raman //We kill media server if we encounter these errors as there is 2100ff71809874c00d540af83c123f3dc34759f1871Sundar Raman //no point continuing and apps also don't handle errors other 2110ff71809874c00d540af83c123f3dc34759f1871Sundar Raman //than media server death always. 2120ff71809874c00d540af83c123f3dc34759f1871Sundar Raman abort(); 2130ff71809874c00d540af83c123f3dc34759f1871Sundar Raman return; 2140ff71809874c00d540af83c123f3dc34759f1871Sundar Raman } 2150ff71809874c00d540af83c123f3dc34759f1871Sundar Raman 2166b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng if ( ( NULL != mCameraHal ) && 2176b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng ( NULL != mNotifyCb ) && 2186b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ERROR) ) ) 2196b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng { 2206b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng CAMHAL_LOGEB("AppCallbackNotifier mNotifyCb %d", error); 2216b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng mNotifyCb(CAMERA_MSG_ERROR, CAMERA_ERROR_UNKNOWN, 0, mCallbackCookie); 2226b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng } 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2273f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luubool AppCallbackNotifier::notificationThread() 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool shouldLive = true; 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret; 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2343f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu //CAMHAL_LOGDA("Notification Thread waiting for message"); 2353f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ret = TIUTILS::MessageQueue::waitForMsg(&mNotificationThread->msgQ(), 2363f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu &mEventQ, 2373f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu &mFrameQ, 2383f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu AppCallbackNotifier::NOTIFIER_TIMEOUT); 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2403f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu //CAMHAL_LOGDA("Notification Thread received message"); 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2423f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if (mNotificationThread->msgQ().hasMsg()) { 2433f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ///Received a message from CameraHal, process it 2443f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu CAMHAL_LOGDA("Notification Thread received message from Camera HAL"); 2453f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu shouldLive = processMessage(); 2463f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if(!shouldLive) { 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Notification Thread exiting."); 248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2493f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu } 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2513f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if(mEventQ.hasMsg()) { 2523f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ///Received an event from one of the event providers 2533f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu CAMHAL_LOGDA("Notification Thread received an event from event provider (CameraAdapter)"); 2543f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu notifyEvent(); 2553f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu } 256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2573f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if(mFrameQ.hasMsg()) { 2583f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ///Received a frame from one of the frame providers 2593f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu //CAMHAL_LOGDA("Notification Thread received a frame from frame provider (CameraAdapter)"); 2603f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu notifyFrame(); 2613f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu } 2623f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu 2633f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu LOG_FUNCTION_NAME_EXIT; 2643f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu return shouldLive; 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::notifyEvent() 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Receive and send the event notifications to app 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventQ.get(&msg); 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool ret = true; 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent *evt = NULL; 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::FocusEventData *focusEvtData; 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::ZoomEventData *zoomEvtData; 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::FaceEventData faceEvtData; 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(msg.command) 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT: 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev evt = ( CameraHalEvent * ) msg.arg1; 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == evt ) 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid CameraHalEvent"); 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(evt->mEventType) 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_SHUTTER: 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mCameraHal ) && 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb ) && 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_SHUTTER) ) ) 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie); 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 306e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = false; 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_FOCUS_LOCKED: 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_FOCUS_ERROR: 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusEvtData = &evt->mEventData->focusEvent; 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( focusEvtData->focusLocked ) && 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb ) && 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( focusEvtData->focusError && 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb ) && 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_ZOOM_INDEX_REACHED: 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev zoomEvtData = &evt->mEventData->zoomEvent; 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mCameraHal ) && 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb) && 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ZOOM) ) ) 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_ZOOM, zoomEvtData->currentZoomIndex, zoomEvtData->targetZoomIndexReached, mCallbackCookie); 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_FACE: 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev faceEvtData = evt->mEventData->faceEvent; 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mCameraHal ) && 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb) && 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_METADATA) ) ) 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // WA for an issue inside CameraService 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t *tmpBuffer = mRequestMemory(-1, 1, 1, NULL); 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb(CAMERA_MSG_PREVIEW_METADATA, 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tmpBuffer, 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 0, 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev faceEvtData->getFaceResult(), 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCallbackCookie); 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev faceEvtData.clear(); 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != tmpBuffer ) { 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tmpBuffer->release(tmpBuffer); 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::ALL_EVENTS: 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != evt ) 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete evt; 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void copy2Dto1D(void *dst, 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *src, 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int width, 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int height, 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t stride, 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t offset, 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int bytesPerPixel, 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t length, 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *pixelFormat) 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int alignedRow, row; 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned char *bufferDst, *bufferSrc; 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned char *bufferDstEnd, *bufferSrcEnd; 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferSrc_UV; 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *y_uv[2]; //y_uv[0]=> y pointer; y_uv[1]=>uv pointer 4056c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu int lock_try_count = 0; 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Rect bounds; 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bounds.left = offset % stride; 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bounds.top = offset / stride; 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bounds.right = width; 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bounds.bottom = height; 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // get the y & uv pointers from the gralloc handle; 416941b79b3815eb5f41e0d194d6f65161d1e4a86d0Tyler Luu while (mapper.lock((buffer_handle_t)src, CAMHAL_GRALLOC_USAGE, bounds, y_uv) < 0) { 4176c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu // give up after LOCK_BUFFER_TRIES (defined in this file) 4186c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu if (++lock_try_count > LOCK_BUFFER_TRIES) { 4196c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu return; 4206c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu } 4216c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu 4226c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu // sleep for 50 ms before we try to lock again. 4236c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu // somebody else has a write lock on this buffer 4246c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu usleep(50000); 4256c73fda9fdca5431e4e7911bb3171e36088a861eTyler Luu } 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("copy2Dto1D() y= %p ; uv=%p.",y_uv[0],y_uv[1]); 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("pixelFormat,= %d; offset=%d",*pixelFormat,offset); 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pixelFormat!=NULL) { 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 2; 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 1; 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst = ( unsigned char * ) dst; 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDstEnd = ( unsigned char * ) dst + width*height*bytesPerPixel; 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrc = ( unsigned char * ) y_uv[0] + offset; 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrcEnd = ( unsigned char * ) ( ( size_t ) y_uv[0] + length + offset); 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev row = width*bytesPerPixel; 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev alignedRow = stride-width; 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int stride_bytes = stride / 8; 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t xOff = offset % stride; 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t yOff = offset / stride; 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // going to convert from NV12 here and return 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Step 1: Y plane: iterate through each row and copy 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( int i = 0 ; i < height ; i++) { 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(bufferDst, bufferSrc, row); 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrc += stride; 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst += row; 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( bufferSrc > bufferSrcEnd ) || ( bufferDst > bufferDstEnd ) ) { 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 457f8a689d36a1b20942e39d848712e99d4a000fa72Sundar Raman bufferSrc_UV = ( uint16_t * ) ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff); 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) { 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferDst_UV; 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Step 2: UV plane: convert NV12 to NV21 by swapping U & V 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst_UV = (uint16_t *) (((uint8_t*)dst)+row*height); 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int n = width; 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev asm volatile ( 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " pld [%[src], %[src_stride], lsl #2] \n\t" 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 1f \n\t" 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "0: @ 32 byte swap \n\t" 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #32 \n\t" 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {q0, q1} , [%[src]]! \n\t" 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vswp q0, q1 \n\t" 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst2.8 {q0,q1},[%[dst]]! \n\t" 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 0b \n\t" 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "1: @ Is there enough data? \n\t" 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 3f \n\t" 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "2: @ 16 byte swap \n\t" 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #16 \n\t" 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vswp d0, d1 \n\t" 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst2.8 {d0,d1},[%[dst]]! \n\t" 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 2b \n\t" 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "3: @ Is there enough data? \n\t" 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 5f \n\t" 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "4: @ 8 byte swap \n\t" 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #8 \n\t" 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vswp d0, d1 \n\t" 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst2.8 {d0[0],d1[0]},[%[dst]]! \n\t" 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 4b \n\t" 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "5: @ end \n\t" 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef NEEDS_ARM_ERRATA_754319_754320 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vmov s0,s0 @ add noop for errata item \n\t" 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [dst] "+r" (bufferDst_UV), [src] "+r" (bufferSrc_UV), [n] "+r" (n) 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [src_stride] "r" (stride_bytes) 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : "cc", "memory", "q0", "q1" 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ); 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferDst_U; 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferDst_V; 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Step 2: UV plane: convert NV12 to YV12 by de-interleaving U & V 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO(XXX): This version of CameraHal assumes NV12 format it set at 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // camera adapter to support YV12. Need to address for 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // USBCamera 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst_V = (uint16_t *) (((uint8_t*)dst)+row*height); 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst_U = (uint16_t *) (((uint8_t*)dst)+row*height+row*height/4); 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int n = width; 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev asm volatile ( 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " pld [%[src], %[src_stride], lsl #2] \n\t" 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 1f \n\t" 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "0: @ 32 byte swap \n\t" 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #32 \n\t" 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {q0, q1} , [%[src]]! \n\t" 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {q1},[%[dst_v]]! \n\t" 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {q0},[%[dst_u]]! \n\t" 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 0b \n\t" 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "1: @ Is there enough data? \n\t" 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 3f \n\t" 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "2: @ 16 byte swap \n\t" 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #16 \n\t" 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d1},[%[dst_v]]! \n\t" 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d0},[%[dst_u]]! \n\t" 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 2b \n\t" 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "3: @ Is there enough data? \n\t" 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 5f \n\t" 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "4: @ 8 byte swap \n\t" 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #8 \n\t" 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d1[0]},[%[dst_v]]! \n\t" 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d0[0]},[%[dst_u]]! \n\t" 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 4b \n\t" 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "5: @ end \n\t" 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef NEEDS_ARM_ERRATA_754319_754320 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vmov s0,s0 @ add noop for errata item \n\t" 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [dst_u] "+r" (bufferDst_U), [dst_v] "+r" (bufferDst_V), 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev [src] "+r" (bufferSrc_UV), [n] "+r" (n) 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [src_stride] "r" (stride_bytes) 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : "cc", "memory", "q0", "q1" 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ); 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mapper.unlock((buffer_handle_t)src); 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ; 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if(strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_RGB565) == 0) { 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 2; 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst = ( unsigned char * ) dst; 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrc = ( unsigned char * ) y_uv[0]; 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev row = width*bytesPerPixel; 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev alignedRow = ( row + ( stride -1 ) ) & ( ~ ( stride -1 ) ); 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //iterate through each row 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( int i = 0 ; i < height ; i++, bufferSrc += alignedRow, bufferDst += row) { 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(bufferDst, bufferSrc, row); 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mapper.unlock((buffer_handle_t)src); 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 583e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Ramanstatus_t AppCallbackNotifier::dummyRaw() 584e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman{ 585e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman LOG_FUNCTION_NAME; 586e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 587e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( NULL == mRequestMemory ) { 588e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman CAMHAL_LOGEA("Can't allocate memory for dummy raw callback!"); 589e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman return NO_INIT; 590e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 591e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 592e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( ( NULL != mCameraHal ) && 593e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( NULL != mDataCb) && 594e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( NULL != mNotifyCb ) ){ 595e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 596e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE) ) { 597e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman camera_memory_t *dummyRaw = mRequestMemory(-1, 1, 1, NULL); 598e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 599e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( NULL == dummyRaw ) { 600e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman CAMHAL_LOGEA("Dummy raw buffer allocation failed!"); 601e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman return NO_MEMORY; 602e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 603e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 604e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mDataCb(CAMERA_MSG_RAW_IMAGE, dummyRaw, 0, NULL, mCallbackCookie); 605e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 606e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman dummyRaw->release(dummyRaw); 607e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } else if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY) ) { 608e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mNotifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCallbackCookie); 609e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 610e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 611e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 612e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman LOG_FUNCTION_NAME_EXIT; 613e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 614e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman return NO_ERROR; 615e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman} 616e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::notifyFrame() 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Receive and send the frame notifications to app 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame *frame; 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MemoryHeapBase *heap; 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MemoryBase *buffer = NULL; 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryBase> memBase; 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *buf = NULL; 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mFrameQ.isEmpty()) 6307207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 6317207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman mFrameQ.get(&msg); 6327207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 6387207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman bool ret = true; 6397207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = NULL; 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(msg.command) 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_FRAME: 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = (CameraFrame *) msg.arg1; 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!frame) 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (CameraFrame::RAW_FRAME == frame->mFrameType )&& 652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 654e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( NULL != mNotifyCb ) ) 655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 657e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE) ) 658e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef COPY_IMAGE_BUFFER 660e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman camera_memory_t* raw_picture = mRequestMemory(-1, frame->mLength, 1, NULL); 661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 662e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( NULL != raw_picture ) 663e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 664e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman buf = raw_picture->data; 665e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( NULL != buf ) 666e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 667e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman memcpy(buf, 668e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( void * ) ( (unsigned int) frame->mBuffer + frame->mOffset), 669e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman frame->mLength); 670e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 671e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mFrameProvider->returnFrame(frame->mBuffer, 672e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( CameraFrame::FrameType ) frame->mFrameType); 673e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 674e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 675e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mDataCb(CAMERA_MSG_RAW_IMAGE, raw_picture, 0, NULL, mCallbackCookie); 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 679e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman //TODO: Find a way to map a Tiler buffer to a MemoryHeapBase 680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 682e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if(raw_picture) 683e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 684e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman raw_picture->release(raw_picture); 685e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 686e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 687e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman else if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY) ) 688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 689e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mNotifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCallbackCookie); 690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 692e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = true; 693e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 695ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu else if ( (CameraFrame::IMAGE_FRAME == frame->mFrameType) && 696ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (NULL != mCameraHal) && 697ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (NULL != mDataCb) && 698ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (CameraFrame::ENCODE_RAW_YUV422I_TO_JPEG & frame->mQuirks) ) 699ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 700ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 701ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu int encode_quality = 100; 702ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu const char* valstr = NULL; 70336e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu void* exif_data = NULL; 704ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu camera_memory_t* raw_picture = mRequestMemory(-1, frame->mLength, 1, NULL); 705ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 706ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if(raw_picture) { 707ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu buf = raw_picture->data; 708ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 709ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 710ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu valstr = mParameters.get(CameraParameters::KEY_JPEG_QUALITY); 711ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (valstr) { 712ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encode_quality = atoi(valstr); 713ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (encode_quality < 0 || encode_quality > 100) { 714ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encode_quality = 100; 715ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 716ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 717ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 71836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (CameraFrame::HAS_EXIF_DATA & frame->mQuirks) { 71936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif_data = frame->mCookie2; 72036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 72136e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 72236e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu CAMHAL_LOGVB("encoder(%p, %d, %p, %d, %d, %d, %d,%p,%d,%p,%p,%p)", 723ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (uint8_t*)frame->mBuffer, 724ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mLength, 725ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (uint8_t*)buf, 726ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mLength, 727ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encode_quality, 728ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mWidth, 729ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mHeight, 730ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu AppCallbackNotifierEncoderCallback, 731ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mFrameType, 732ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu this, 733ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu raw_picture, 73436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif_data); 735ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 736ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu sp<Encoder_libjpeg> encoder = new Encoder_libjpeg((uint8_t*)frame->mBuffer, 737ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mLength, 738ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (uint8_t*)buf, 739ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mLength, 740ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encode_quality, 741ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mWidth, 742ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu frame->mHeight, 743ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu AppCallbackNotifierEncoderCallback, 744ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (CameraFrame::FrameType)frame->mFrameType, 745ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu this, 746ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu raw_picture, 74736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif_data); 748ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoder->run(); 749ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoder.clear(); 750ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 751ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( ( CameraFrame::IMAGE_FRAME == frame->mFrameType ) && 753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) ) 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 7567207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman camera_memory_t* raw_picture = NULL; 7577207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 7607207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) 7617207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 7627207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman return; 7637207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 7647207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 765e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // CTS, MTS requirements: Every 'takePicture()' call 766e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // who registers a raw callback should receive one 767e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // as well. This is not always the case with 768e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // CameraAdapters though. 769e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( !mRawAvailable ) 770e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 771e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman dummyRaw(); 772e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 773e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman else 774e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 775e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = false; 776e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 777e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef COPY_IMAGE_BUFFER 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 7807207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman raw_picture = mRequestMemory(-1, frame->mLength, 1, NULL); 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(raw_picture) 783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf = raw_picture->data; 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != buf) 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(buf, 790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( void * ) ( (unsigned int) frame->mBuffer + frame->mOffset), 791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mLength); 792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 794b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu // CTS Requirement: The camera client should be 795b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu // able to restart the preview from within the context 796b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu // of a jpeg callback. Here we should return the image 797b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu // frame before calling the data callback. This way 798b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu // we won't depend on the binder ipc timing and we 799b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu // will be able to execute the client request successfully. 800b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu mFrameProvider->returnFrame(frame->mBuffer, 801b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu ( CameraFrame::FrameType ) frame->mFrameType); 8027207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 803b2fb762fda58b35be6da475582e3f623f9f1e46aTyler Luu 8047207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if((mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) 8057207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman && (mCameraHal->msgTypeEnabled(CAMERA_MSG_COMPRESSED_IMAGE))) 806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mBurstLock); 808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: enable burst mode later 809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mBurst ) 810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev `(CAMERA_MSG_BURST_IMAGE, JPEGPictureMemBase, mCallbackCookie); 812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, raw_picture, 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 0, NULL, 818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCallbackCookie); 819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Find a way to map a Tiler buffer to a MemoryHeapBase 824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(raw_picture) 827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev raw_picture->release(raw_picture); 829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( ( CameraFrame::VIDEO_FRAME_SYNC == frame->mFrameType ) && 833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_VIDEO_FRAME) ) ) 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingLock.lock(); 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mRecording) 839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t *videoMedatadaBufferMemory = 843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (camera_memory_t *) mVideoMetadataBufferMemoryMap.valueFor((uint32_t) frame->mBuffer); 844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev video_metadata_t *videoMetadataBuffer = (video_metadata_t *) videoMedatadaBufferMemory->data; 845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( (NULL == videoMedatadaBufferMemory) || (NULL == videoMetadataBuffer) || (NULL == frame->mBuffer) ) 847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! One of the video buffers is NULL"); 849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMetadataBuffer->metadataBufferType = (int) kMetadataBufferTypeCameraSource; 853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMetadataBuffer->handle = frame->mBuffer; 854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMetadataBuffer->offset = frame->mOffset; 855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("mDataCbTimestamp : frame->mBuffer=0x%x, videoMetadataBuffer=0x%x, videoMedatadaBufferMemory=0x%x", 857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mBuffer, videoMetadataBuffer, videoMedatadaBufferMemory); 858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCbTimestamp(frame->mTimestamp, CAMERA_MSG_VIDEO_FRAME, 860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory, 0, mCallbackCookie); 861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Need to revisit this, should ideally be mapping the TILER buffer using mRequestMemory 865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* fakebuf = mRequestMemory(-1, 4, 1, NULL); 866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( (NULL == fakebuf) || ( NULL == fakebuf->data) || ( NULL == frame->mBuffer)) 867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! One of the video buffers is NULL"); 869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fakebuf->data = frame->mBuffer; 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCbTimestamp(frame->mTimestamp, CAMERA_MSG_VIDEO_FRAME, fakebuf, 0, mCallbackCookie); 874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fakebuf->release(fakebuf); 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingLock.unlock(); 878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(( CameraFrame::SNAPSHOT_FRAME == frame->mFrameType ) && 881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb)) { 884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //When enabled, measurement data is sent instead of video data 885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mMeasurementEnabled ) { 8867207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 8877207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman Mutex::Autolock lock(mLock); 8887207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 8897207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) 8907207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 8917207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman return; 8927207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 8937207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mPreviewMemory || !frame->mBuffer) { 895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Error! One of the buffer is NULL"); 896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf = (void*) mPreviewBufs[mPreviewBufCount]; 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("%d:copy2Dto1D(%p, %p, %d, %d, %d, %d, %d,%s)", 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev __LINE__, 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf, 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mBuffer, 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mWidth, 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mHeight, 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mAlignment, 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2, 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mLength, 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat); 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != buf ) { 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev copy2Dto1D(buf, 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mBuffer, 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mWidth, 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mHeight, 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mAlignment, 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mOffset, 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2, 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mLength, 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat); 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 9237207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 9257207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman //Send a callback only if the notifier is started and snapshot message is enabled 9267207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if ((mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) 9277207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman && (mCameraHal->msgTypeEnabled(CAMERA_MSG_POSTVIEW_FRAME))) { 928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Give preview callback to app 929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb(CAMERA_MSG_POSTVIEW_FRAME, mPreviewMemory, mPreviewBufCount, NULL, mCallbackCookie); 930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // increment for next buffer 933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufCount = (mPreviewBufCount+1) % AppCallbackNotifier::MAX_BUFFERS; 934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->returnFrame(frame->mBuffer, 937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( CameraFrame::FrameType ) frame->mFrameType); 9387207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 9397207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman else if ( ( CameraFrame::PREVIEW_FRAME_SYNC== frame->mFrameType ) && 940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) ) { 9437207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //When enabled, measurement data is sent instead of video data 945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mMeasurementEnabled ) { 9467207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 9477207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman Mutex::Autolock lock(mLock); 9487207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 9497207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 9507207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) 9517207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 9527207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman return; 9537207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 9547207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mPreviewMemory || !frame->mBuffer) { 956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Error! One of the buffer is NULL"); 957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf = (void*) mPreviewBufs[mPreviewBufCount]; 961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("%d:copy2Dto1D(%p, %p, %d, %d, %d, %d, %d,%s)", 963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev __LINE__, 964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf, 965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mBuffer, 966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mWidth, 967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mHeight, 968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mAlignment, 969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2, 970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mLength, 971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat); 972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != buf ) { 974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev copy2Dto1D(buf, 975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mBuffer, 976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mWidth, 977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mHeight, 978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mAlignment, 979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mOffset, 980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2, 981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mLength, 982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat); 983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 9847207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 9867207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman //Send a callback only if the notifier is started 9877207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman if(mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) 9887207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 9897207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman // Give preview callback to app 9907207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman mDataCb(CAMERA_MSG_PREVIEW_FRAME, mPreviewMemory, mPreviewBufCount, NULL, mCallbackCookie); 9917207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // increment for next buffer 994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufCount = (mPreviewBufCount+1) % AppCallbackNotifier::MAX_BUFFERS; 995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->returnFrame(frame->mBuffer, 997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( CameraFrame::FrameType ) frame->mFrameType); 9987207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 9997207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman else if ( ( CameraFrame::FRAME_DATA_SYNC == frame->mFrameType ) && 1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) ) { 1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mPreviewMemory || !frame->mBuffer) { 1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Error! One of the buffer is NULL"); 1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buf = (void*) mPreviewBufs[mPreviewBufCount]; 1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (buf) { 1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (mPreviewMemory->size / MAX_BUFFERS) >= frame->mLength ) { 1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(buf, ( void * ) frame->mBuffer, frame->mLength); 1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memset(buf, 0, (mPreviewMemory->size / MAX_BUFFERS)); 1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Give preview callback to app 1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb(CAMERA_MSG_PREVIEW_FRAME, mPreviewMemory, mPreviewBufCount, NULL, mCallbackCookie); 1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Increment the buffer count 1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufCount = (mPreviewBufCount+1) % AppCallbackNotifier::MAX_BUFFERS; 1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->returnFrame(frame->mBuffer, 1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( CameraFrame::FrameType ) frame->mFrameType); 1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->returnFrame(frame->mBuffer, 1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( CameraFrame::FrameType ) frame->mFrameType); 1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Frame type 0x%x is still unsupported!", frame->mFrameType); 1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != frame ) 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete frame; 1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::frameCallbackRelay(CameraFrame* caFrame) 1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AppCallbackNotifier *appcbn = (AppCallbackNotifier*) (caFrame->mCookie); 1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev appcbn->frameCallback(caFrame); 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::frameCallback(CameraFrame* caFrame) 1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the event to the event queue of AppCallbackNotifier 1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame *frame; 1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != caFrame ) 1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = new CameraFrame(*caFrame); 1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != frame ) 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_FRAME; 1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.arg1 = frame; 1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameQ.put(&msg); 1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Not enough resources to allocate CameraFrame"); 1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::eventCallbackRelay(CameraHalEvent* chEvt) 1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AppCallbackNotifier *appcbn = (AppCallbackNotifier*) (chEvt->mCookie); 1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev appcbn->eventCallback(chEvt); 1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::eventCallback(CameraHalEvent* chEvt) 1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the event to the event queue of AppCallbackNotifier 1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent *event; 1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != chEvt ) 1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev event = new CameraHalEvent(*chEvt); 1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != event ) 1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT; 1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.arg1 = event; 1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventQ.put(&msg); 1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Not enough resources to allocate CameraHalEvent"); 1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool AppCallbackNotifier::processMessage() 1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Retrieve the command from the command queue and process it 1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("+Msg get..."); 1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread->msgQ().get(&msg); 1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("-Msg get..."); 1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool ret = true; 1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(msg.command) 1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case NotificationThread::NOTIFIER_EXIT: 1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Received NOTIFIER_EXIT command from Camera HAL"); 1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifierState = AppCallbackNotifier::NOTIFIER_EXITED; 1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = false; 1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error: ProcessMsg() command from Camera HAL"); 1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevAppCallbackNotifier::~AppCallbackNotifier() 1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Stop app callback notifier if not already stopped 1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev stop(); 1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Unregister with the frame provider 1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mFrameProvider ) 1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::ALL_FRAMES); 1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //unregister with the event provider 1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mEventProvider ) 1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); 1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg = {0,0,0,0,0,0}; 1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = NotificationThread::NOTIFIER_EXIT; 1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the message to display thread 1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread->msgQ().put(&msg); 1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Exit and cleanup the thread 11863f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu mNotificationThread->requestExit(); 11873f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu mNotificationThread->join(); 1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Delete the display thread 1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread.clear(); 1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Free the event and frame providers 1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mEventProvider ) 1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Deleting the event provider 1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Stopping Event Provider"); 1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete mEventProvider; 1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = NULL; 1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mFrameProvider ) 1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Deleting the frame provider 1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Stopping Frame Provider"); 1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete mFrameProvider; 1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider = NULL; 1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev releaseSharedVideoBuffers(); 1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Free all video heaps and buffers 1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::releaseSharedVideoBuffers() 1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* videoMedatadaBufferMemory; 1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (unsigned int i = 0; i < mVideoMetadataBufferMemoryMap.size(); i++) 1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory = (camera_memory_t*) mVideoMetadataBufferMemoryMap.valueAt(i); 1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(NULL != videoMedatadaBufferMemory) 1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory->release(videoMedatadaBufferMemory); 1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Released videoMedatadaBufferMemory=0x%x", videoMedatadaBufferMemory); 1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferMemoryMap.clear(); 1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferReverseMap.clear(); 1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier) 1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks There is no NULL check here. We will check 1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///for NULL when we get start command from CameraHal 1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@Remarks Currently only one event provider (CameraAdapter) is supported 1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Have an array of event providers for each event bitmask 1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay); 1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mEventProvider ) 1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error in creating EventProvider"); 1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->enableEventNotification(eventMask); 1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setFrameProvider(FrameNotifier *frameNotifier) 1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks There is no NULL check here. We will check 1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///for NULL when we get the start command from CameraAdapter 1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider = new FrameProvider(frameNotifier, this, frameCallbackRelay); 1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error in creating FrameProvider"); 1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Register only for captured images and RAW for now 1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Register for and handle all types of frames 1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::IMAGE_FRAME); 1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::RAW_FRAME); 1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::startPreviewCallbacks(CameraParameters ¶ms, void *buffers, uint32_t *offsets, int fd, size_t length, size_t count) 1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryHeapBase> heap; 1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryBase> buffer; 1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int *bufArr; 1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t size = 0; 1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to start video recording without FrameProvider"); 1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return -EINVAL; 1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mPreviewing ) 1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("+Already previewing"); 1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int w,h; 1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Get preview size 1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.getPreviewSize(&w, &h); 1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Get the preview pixel format 1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = params.getPreviewFormat(); 1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) 1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size = w*h*2; 1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV422I; 1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || 1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) 1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size = (w*h*3)/2; 1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV420SP; 1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) 1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size = w*h*2; 1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_RGB565; 1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewMemory = mRequestMemory(-1, size, AppCallbackNotifier::MAX_BUFFERS, NULL); 1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mPreviewMemory) { 1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i=0; i < AppCallbackNotifier::MAX_BUFFERS; i++) { 1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufs[i] = (unsigned char*) mPreviewMemory->data + (i*size); 1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME ) ) { 1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufCount = 0; 1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewing = true; 1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setBurst(bool burst) 1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mBurstLock); 1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBurst = burst; 1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1362ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luuint AppCallbackNotifier::setParameters(const CameraParameters& params) 1363ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu{ 1364ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME; 1365ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1366ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mParameters = params 1367ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1368ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME_EXIT; 1369ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu return NO_ERROR; 1370ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu} 1371ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::stopPreviewCallbacks() 1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryHeapBase> heap; 1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryBase> buffer; 1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to stop preview callbacks without FrameProvider"); 1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return -EINVAL; 1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mPreviewing ) 1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 13927207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 13937207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman Mutex::Autolock lock(mLock); 1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewMemory->release(mPreviewMemory); 13957207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewing = false; 1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::useMetaDataBufferMode(bool enable) 1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mUseMetaDataBufferMode = enable; 1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::startRecording() 1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mRecordingLock); 1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to start video recording without FrameProvider"); 1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mRecording) 1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::VIDEO_FRAME_SYNC); 1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecording = true; 1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Allocate metadata buffers for video recording 1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::initSharedVideoBuffers(void *buffers, uint32_t *offsets, int fd, size_t length, size_t count) 1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *bufArr = NULL; 1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* videoMedatadaBufferMemory = NULL; 1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(NULL == buffers) 1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! Video buffers are NULL"); 1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return BAD_VALUE; 1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufArr = (uint32_t *) buffers; 1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (uint32_t i = 0; i < count; i++) 1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory = mRequestMemory(-1, sizeof(video_metadata_t), 1, NULL); 1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if((NULL == videoMedatadaBufferMemory) || (NULL == videoMedatadaBufferMemory->data)) 1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! Could not allocate memory for Video Metadata Buffers"); 1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferMemoryMap.add(bufArr[i], (uint32_t)(videoMedatadaBufferMemory)); 1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferReverseMap.add((uint32_t)(videoMedatadaBufferMemory->data), bufArr[i]); 1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("bufArr[%d]=0x%x, videoMedatadaBufferMemory=0x%x, videoMedatadaBufferMemory->data=0x%x", 1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev i, bufArr[i], videoMedatadaBufferMemory, videoMedatadaBufferMemory->data); 1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::stopRecording() 1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mRecordingLock); 1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to stop video recording without FrameProvider"); 1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mRecording) 1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::VIDEO_FRAME_SYNC); 1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Release the shared video buffers 1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev releaseSharedVideoBuffers(); 1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecording = false; 1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::releaseRecordingFrame(const void* mem) 1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *frame = NULL; 1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to stop video recording without FrameProvider"); 1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mem ) 1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Video Frame released is invalid"); 1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( NO_ERROR != ret ) 1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev video_metadata_t *videoMetadataBuffer = (video_metadata_t *) mem ; 1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = (void*) mVideoMetadataBufferReverseMap.valueFor((uint32_t) videoMetadataBuffer); 1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("Releasing frame with videoMetadataBuffer=0x%x, videoMetadataBuffer->handle=0x%x & frame handle=0x%x\n", 1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMetadataBuffer, videoMetadataBuffer->handle, frame); 1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = (void*)(*((uint32_t *)mem)); 1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mFrameProvider->returnFrame(frame, CameraFrame::VIDEO_FRAME_SYNC); 1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::enableMsgType(int32_t msgType) 1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_POSTVIEW_FRAME) 1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::SNAPSHOT_FRAME); 1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_PREVIEW_FRAME) 1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::disableMsgType(int32_t msgType) 1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_POSTVIEW_FRAME) 1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::SNAPSHOT_FRAME); 1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_PREVIEW_FRAME) 1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::start() 1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) 1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("AppCallbackNotifier already running"); 1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ALREADY_EXISTS; 1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Check whether initial conditions are met for us to start 1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///A frame provider should be available, if not return error 1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mFrameProvider) 1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///AppCallbackNotifier not properly initialized 1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("AppCallbackNotifier not properly initialized - Frame provider is NULL"); 1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///At least one event notifier should be available, if not return error 1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Modify here when there is an array of event providers 1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mEventProvider) 1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("AppCallbackNotifier not properly initialized - Event provider is NULL"); 1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///AppCallbackNotifier not properly initialized 1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifierState = AppCallbackNotifier::NOTIFIER_STARTED; 1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STARTED \n"); 1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::stop() 1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mNotifierState!=AppCallbackNotifier::NOTIFIER_STARTED) 1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("AppCallbackNotifier already in stopped state"); 1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ALREADY_EXISTS; 1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 16437207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 16447207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman Mutex::Autolock lock(mLock); 1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifierState = AppCallbackNotifier::NOTIFIER_STOPPED; 1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STOPPED \n"); 16487207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------NotificationHandler Class ENDS here-----------------------------*/ 1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 1660