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