AppCallbackNotifier.cpp revision c160a1f85c70e49a7613d774e2d99035f3cb4851
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> 2972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng#include "NV12_resize.h" 3072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int AppCallbackNotifier::NOTIFIER_TIMEOUT = -1; 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 35c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luuvoid AppCallbackNotifierEncoderCallback(void* main_jpeg, 36c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu void* thumb_jpeg, 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; 44c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu cb->EncoderDoneCb(main_jpeg, thumb_jpeg, type, cookie2, cookie3); 45ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 46ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu} 47ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------NotificationHandler Class STARTS here-----------------------------*/ 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 50c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luuvoid AppCallbackNotifier::EncoderDoneCb(void* main_jpeg, void* thumb_jpeg, CameraFrame::FrameType type, void* cookie1, void* cookie2) 51ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu{ 52ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu camera_memory_t* encoded_mem = NULL; 53c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu Encoder_libjpeg::params *main_param = NULL, *thumb_param = NULL; 54c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu size_t jpeg_size; 55c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu uint8_t* src = NULL; 56ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 57ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME; 58ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 597207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman camera_memory_t* picture = NULL; 607207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 617207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 62ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu Mutex::Autolock lock(mLock); 63ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 64c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (!main_jpeg) { 65c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu goto exit; 66c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 67ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 68c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu encoded_mem = (camera_memory_t*) cookie1; 69c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_param = (Encoder_libjpeg::params *) main_jpeg; 70c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu jpeg_size = main_param->jpeg_size; 71c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu src = main_param->src; 72ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 73c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if(encoded_mem && encoded_mem->data && (jpeg_size > 0)) { 7436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (cookie2) { 7536e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu ExifElementsTable* exif = (ExifElementsTable*) cookie2; 7636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu Section_t* exif_section = NULL; 7736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 7836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif->insertExifToJpeg((unsigned char*) encoded_mem->data, jpeg_size); 79c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 80c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if(thumb_jpeg) { 81c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu thumb_param = (Encoder_libjpeg::params *) thumb_jpeg; 82c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu exif->insertExifThumbnailImage((const char*)thumb_param->dst, 83c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu (int)thumb_param->jpeg_size); 84c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 85c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 8636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif_section = FindSection(M_EXIF); 8736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 8836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (exif_section) { 8936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu picture = mRequestMemory(-1, jpeg_size + exif_section->Size, 1, NULL); 9036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (picture && picture->data) { 9136e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif->saveJpeg((unsigned char*) picture->data, jpeg_size + exif_section->Size); 9236e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 9336e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 9436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu delete exif; 9536e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu cookie2 = NULL; 9636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } else { 9736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu picture = mRequestMemory(-1, jpeg_size, 1, NULL); 9836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (picture && picture->data) { 9936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu memcpy(picture->data, encoded_mem->data, jpeg_size); 10036e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 10136e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 102ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 103c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } // scope for mutex lock 104ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1057207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman // Send the callback to the application only if the notifier is started and the message is enabled 106c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if(picture && (mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) && 107c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu (mCameraHal->msgTypeEnabled(CAMERA_MSG_COMPRESSED_IMAGE))) 108ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 109ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu Mutex::Autolock lock(mBurstLock); 110ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu#if 0 //TODO: enable burst mode later 111ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if ( mBurst ) 112ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 113ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu `(CAMERA_MSG_BURST_IMAGE, JPEGPictureMemBase, mCallbackCookie); 114ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 115ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu else 116ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu#endif 117ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 118ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, picture, 0, NULL, mCallbackCookie); 119ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 120ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 121ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 122c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu exit: 123c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 124c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (main_jpeg) { 125c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu free(main_jpeg); 126c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 127c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 128c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (thumb_jpeg) { 129c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (((Encoder_libjpeg::params *) thumb_jpeg)->dst) { 130c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu free(((Encoder_libjpeg::params *) thumb_jpeg)->dst); 131c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 132c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu free(thumb_jpeg); 133c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 134c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 135ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (encoded_mem) { 136ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoded_mem->release(encoded_mem); 137ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 138ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 139ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (picture) { 140ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu picture->release(picture); 141ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 142ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 14336e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (cookie2) { 14436e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu delete (ExifElementsTable*) cookie2; 14536e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 14636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 147ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mFrameProvider->returnFrame(src, type); 148ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 149ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME_EXIT; 150ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu} 151ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * NotificationHandler class 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev///Initialization function for AppCallbackNotifier 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::initialize() 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasurementEnabled = false; 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Create the app notifier thread 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread = new NotificationThread(this); 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mNotificationThread.get()) 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't create Notification thread"); 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Start the display thread 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = mNotificationThread->run("NotificationThread", PRIORITY_URGENT_DISPLAY); 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(ret!=NO_ERROR) 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't run NotificationThread"); 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread.clear(); 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mUseMetaDataBufferMode = true; 181e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = false; 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setCallbacks(CameraHal* cameraHal, 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_notify_callback notify_cb, 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback data_cb, 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory get_memory, 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *user) 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraHal = cameraHal; 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb = notify_cb; 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb = data_cb; 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCbTimestamp = data_cb_timestamp; 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRequestMemory = get_memory; 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCallbackCookie = user; 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setMeasurements(bool enable) 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasurementEnabled = enable; 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enable ) 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::FRAME_DATA_SYNC); 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//All sub-components of Camera HAL call this whenever any error happens 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::errorNotify(int error) 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("AppCallbackNotifier received error %d", error); 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2330ff71809874c00d540af83c123f3dc34759f1871Sundar Raman // If it is a fatal error abort here! 2340ff71809874c00d540af83c123f3dc34759f1871Sundar Raman if((error == CAMERA_ERROR_FATAL) || (error == CAMERA_ERROR_HARD)) { 2350ff71809874c00d540af83c123f3dc34759f1871Sundar Raman //We kill media server if we encounter these errors as there is 2360ff71809874c00d540af83c123f3dc34759f1871Sundar Raman //no point continuing and apps also don't handle errors other 2370ff71809874c00d540af83c123f3dc34759f1871Sundar Raman //than media server death always. 2380ff71809874c00d540af83c123f3dc34759f1871Sundar Raman abort(); 2390ff71809874c00d540af83c123f3dc34759f1871Sundar Raman return; 2400ff71809874c00d540af83c123f3dc34759f1871Sundar Raman } 2410ff71809874c00d540af83c123f3dc34759f1871Sundar Raman 2426b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng if ( ( NULL != mCameraHal ) && 2436b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng ( NULL != mNotifyCb ) && 2446b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ERROR) ) ) 2456b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng { 2466b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng CAMHAL_LOGEB("AppCallbackNotifier mNotifyCb %d", error); 2476b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng mNotifyCb(CAMERA_MSG_ERROR, CAMERA_ERROR_UNKNOWN, 0, mCallbackCookie); 2486b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng } 249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2533f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luubool AppCallbackNotifier::notificationThread() 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool shouldLive = true; 256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret; 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2603f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu //CAMHAL_LOGDA("Notification Thread waiting for message"); 2613f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ret = TIUTILS::MessageQueue::waitForMsg(&mNotificationThread->msgQ(), 2623f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu &mEventQ, 2633f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu &mFrameQ, 2643f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu AppCallbackNotifier::NOTIFIER_TIMEOUT); 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2663f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu //CAMHAL_LOGDA("Notification Thread received message"); 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2683f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if (mNotificationThread->msgQ().hasMsg()) { 2693f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ///Received a message from CameraHal, process it 2703f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu CAMHAL_LOGDA("Notification Thread received message from Camera HAL"); 2713f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu shouldLive = processMessage(); 2723f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if(!shouldLive) { 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Notification Thread exiting."); 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2753f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu } 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2773f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if(mEventQ.hasMsg()) { 2783f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ///Received an event from one of the event providers 2793f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu CAMHAL_LOGDA("Notification Thread received an event from event provider (CameraAdapter)"); 2803f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu notifyEvent(); 2813f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu } 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2833f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu if(mFrameQ.hasMsg()) { 2843f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu ///Received a frame from one of the frame providers 2853f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu //CAMHAL_LOGDA("Notification Thread received a frame from frame provider (CameraAdapter)"); 2863f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu notifyFrame(); 2873f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu } 2883f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu 2893f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu LOG_FUNCTION_NAME_EXIT; 2903f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu return shouldLive; 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::notifyEvent() 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Receive and send the event notifications to app 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventQ.get(&msg); 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool ret = true; 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent *evt = NULL; 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::FocusEventData *focusEvtData; 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::ZoomEventData *zoomEvtData; 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent::FaceEventData faceEvtData; 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(msg.command) 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT: 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev evt = ( CameraHalEvent * ) msg.arg1; 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == evt ) 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid CameraHalEvent"); 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(evt->mEventType) 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_SHUTTER: 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mCameraHal ) && 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb ) && 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_SHUTTER) ) ) 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie); 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 332e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = false; 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_FOCUS_LOCKED: 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_FOCUS_ERROR: 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusEvtData = &evt->mEventData->focusEvent; 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( focusEvtData->focusLocked ) && 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb ) && 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( focusEvtData->focusError && 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb ) && 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) ) 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_ZOOM_INDEX_REACHED: 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev zoomEvtData = &evt->mEventData->zoomEvent; 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mCameraHal ) && 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb) && 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ZOOM) ) ) 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifyCb(CAMERA_MSG_ZOOM, zoomEvtData->currentZoomIndex, zoomEvtData->targetZoomIndexReached, mCallbackCookie); 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::EVENT_FACE: 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev faceEvtData = evt->mEventData->faceEvent; 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NULL != mCameraHal ) && 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb) && 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_METADATA) ) ) 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // WA for an issue inside CameraService 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t *tmpBuffer = mRequestMemory(-1, 1, 1, NULL); 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCb(CAMERA_MSG_PREVIEW_METADATA, 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tmpBuffer, 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 0, 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev faceEvtData->getFaceResult(), 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCallbackCookie); 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev faceEvtData.clear(); 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != tmpBuffer ) { 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tmpBuffer->release(tmpBuffer); 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CameraHalEvent::ALL_EVENTS: 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != evt ) 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete evt; 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void copy2Dto1D(void *dst, 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *src, 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int width, 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int height, 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t stride, 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t offset, 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int bytesPerPixel, 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t length, 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *pixelFormat) 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int alignedRow, row; 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned char *bufferDst, *bufferSrc; 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned char *bufferDstEnd, *bufferSrcEnd; 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferSrc_UV; 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4318e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng unsigned int *y_uv = (unsigned int *)src; 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4338e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng CAMHAL_LOGVB("copy2Dto1D() y= %p ; uv=%p.",y_uv[0], y_uv[1]); 4348e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng CAMHAL_LOGVB("pixelFormat,= %d; offset=%d",*pixelFormat,offset); 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pixelFormat!=NULL) { 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 2; 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 1; 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst = ( unsigned char * ) dst; 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDstEnd = ( unsigned char * ) dst + width*height*bytesPerPixel; 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrc = ( unsigned char * ) y_uv[0] + offset; 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrcEnd = ( unsigned char * ) ( ( size_t ) y_uv[0] + length + offset); 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev row = width*bytesPerPixel; 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev alignedRow = stride-width; 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int stride_bytes = stride / 8; 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t xOff = offset % stride; 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t yOff = offset / stride; 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // going to convert from NV12 here and return 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Step 1: Y plane: iterate through each row and copy 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( int i = 0 ; i < height ; i++) { 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(bufferDst, bufferSrc, row); 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrc += stride; 457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst += row; 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( bufferSrc > bufferSrcEnd ) || ( bufferDst > bufferDstEnd ) ) { 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 463f8a689d36a1b20942e39d848712e99d4a000fa72Sundar Raman bufferSrc_UV = ( uint16_t * ) ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff); 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) { 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferDst_UV; 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Step 2: UV plane: convert NV12 to NV21 by swapping U & V 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst_UV = (uint16_t *) (((uint8_t*)dst)+row*height); 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int n = width; 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev asm volatile ( 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " pld [%[src], %[src_stride], lsl #2] \n\t" 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 1f \n\t" 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "0: @ 32 byte swap \n\t" 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #32 \n\t" 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {q0, q1} , [%[src]]! \n\t" 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vswp q0, q1 \n\t" 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst2.8 {q0,q1},[%[dst]]! \n\t" 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 0b \n\t" 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "1: @ Is there enough data? \n\t" 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 3f \n\t" 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "2: @ 16 byte swap \n\t" 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #16 \n\t" 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vswp d0, d1 \n\t" 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst2.8 {d0,d1},[%[dst]]! \n\t" 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 2b \n\t" 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "3: @ Is there enough data? \n\t" 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 5f \n\t" 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "4: @ 8 byte swap \n\t" 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #8 \n\t" 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vswp d0, d1 \n\t" 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst2.8 {d0[0],d1[0]},[%[dst]]! \n\t" 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 4b \n\t" 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "5: @ end \n\t" 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef NEEDS_ARM_ERRATA_754319_754320 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vmov s0,s0 @ add noop for errata item \n\t" 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [dst] "+r" (bufferDst_UV), [src] "+r" (bufferSrc_UV), [n] "+r" (n) 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [src_stride] "r" (stride_bytes) 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : "cc", "memory", "q0", "q1" 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ); 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferDst_U; 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint16_t *bufferDst_V; 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Step 2: UV plane: convert NV12 to YV12 by de-interleaving U & V 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO(XXX): This version of CameraHal assumes NV12 format it set at 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // camera adapter to support YV12. Need to address for 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // USBCamera 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst_V = (uint16_t *) (((uint8_t*)dst)+row*height); 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst_U = (uint16_t *) (((uint8_t*)dst)+row*height+row*height/4); 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int n = width; 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev asm volatile ( 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " pld [%[src], %[src_stride], lsl #2] \n\t" 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 1f \n\t" 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "0: @ 32 byte swap \n\t" 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #32 \n\t" 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {q0, q1} , [%[src]]! \n\t" 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #32 \n\t" 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {q1},[%[dst_v]]! \n\t" 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {q0},[%[dst_u]]! \n\t" 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 0b \n\t" 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "1: @ Is there enough data? \n\t" 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 3f \n\t" 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "2: @ 16 byte swap \n\t" 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #16 \n\t" 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #16 \n\t" 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d1},[%[dst_v]]! \n\t" 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d0},[%[dst_u]]! \n\t" 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 2b \n\t" 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "3: @ Is there enough data? \n\t" 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " blt 5f \n\t" 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "4: @ 8 byte swap \n\t" 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " sub %[n], %[n], #8 \n\t" 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vld2.8 {d0, d1} , [%[src]]! \n\t" 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " cmp %[n], #8 \n\t" 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d1[0]},[%[dst_v]]! \n\t" 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vst1.8 {d0[0]},[%[dst_u]]! \n\t" 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " bge 4b \n\t" 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "5: @ end \n\t" 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef NEEDS_ARM_ERRATA_754319_754320 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev " vmov s0,s0 @ add noop for errata item \n\t" 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [dst_u] "+r" (bufferDst_U), [dst_v] "+r" (bufferDst_V), 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev [src] "+r" (bufferSrc_UV), [n] "+r" (n) 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : [src_stride] "r" (stride_bytes) 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev : "cc", "memory", "q0", "q1" 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ); 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ; 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else if(strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_RGB565) == 0) { 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytesPerPixel = 2; 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferDst = ( unsigned char * ) dst; 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferSrc = ( unsigned char * ) y_uv[0]; 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev row = width*bytesPerPixel; 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev alignedRow = ( row + ( stride -1 ) ) & ( ~ ( stride -1 ) ); 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //iterate through each row 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for ( int i = 0 ; i < height ; i++, bufferSrc += alignedRow, bufferDst += row) { 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memcpy(bufferDst, bufferSrc, row); 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 58726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luuvoid AppCallbackNotifier::copyAndSendPictureFrame(CameraFrame* frame, int32_t msgType) 58826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu{ 58926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu camera_memory_t* picture = NULL; 59026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu void *dest = NULL, *src = NULL; 59126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 59226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu // scope for lock 59326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu { 59426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu Mutex::Autolock lock(mLock); 59526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 59626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) { 59726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu goto exit; 59826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 59926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 60026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu picture = mRequestMemory(-1, frame->mLength, 1, NULL); 60126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 60226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if (NULL != picture) { 60326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu dest = picture->data; 60426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if (NULL != dest) { 60526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu src = (void *) ((unsigned int) frame->mBuffer + frame->mOffset); 60626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu memcpy(dest, src, frame->mLength); 60726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 60826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 60926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 61026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 61126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu exit: 61226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameProvider->returnFrame(frame->mBuffer, (CameraFrame::FrameType) frame->mFrameType); 61326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 61426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if(picture) { 61526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if((mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) && 61626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mCameraHal->msgTypeEnabled(msgType)) { 61726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mDataCb(msgType, picture, 0, NULL, mCallbackCookie); 61826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 61926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu picture->release(picture); 62026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 62126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu} 62226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 62326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luuvoid AppCallbackNotifier::copyAndSendPreviewFrame(CameraFrame* frame, int32_t msgType) 62426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu{ 62526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu camera_memory_t* picture = NULL; 62626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu void* dest = NULL; 62726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 62826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu // scope for lock 62926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu { 63026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu Mutex::Autolock lock(mLock); 63126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 63226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) { 63326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu goto exit; 63426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 63526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 63626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if (!mPreviewMemory || !frame->mBuffer) { 63726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu CAMHAL_LOGDA("Error! One of the buffer is NULL"); 63826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu goto exit; 63926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 64026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 64126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 64226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu dest = (void*) mPreviewBufs[mPreviewBufCount]; 64326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 64426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu CAMHAL_LOGVB("%d:copy2Dto1D(%p, %p, %d, %d, %d, %d, %d,%s)", 64526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu __LINE__, 64626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu buf, 64726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mBuffer, 64826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mWidth, 64926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mHeight, 65026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mAlignment, 65126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 2, 65226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mLength, 65326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mPreviewPixelFormat); 65426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 65526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if ( NULL != dest ) { 65626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu // data sync frames don't need conversion 65726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if (CameraFrame::FRAME_DATA_SYNC == frame->mFrameType) { 65826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if ( (mPreviewMemory->size / MAX_BUFFERS) >= frame->mLength ) { 65926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu memcpy(dest, (void*) frame->mBuffer, frame->mLength); 66026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } else { 66126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu memset(dest, 0, (mPreviewMemory->size / MAX_BUFFERS)); 66226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 66326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } else { 6648e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng if ((NULL == frame->mYuv[0]) || (NULL == frame->mYuv[1])){ 6658e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng CAMHAL_LOGEA("Error! One of the YUV Pointer is NULL"); 6668e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng goto exit; 6678e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 6688e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng else{ 66926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu copy2Dto1D(dest, 6708e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng frame->mYuv, 67126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mWidth, 67226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mHeight, 67326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mAlignment, 67426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mOffset, 67526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 2, 67626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame->mLength, 67726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mPreviewPixelFormat); 6788e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng } 67926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 68026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 68126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 68226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 68326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu exit: 68426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameProvider->returnFrame(frame->mBuffer, (CameraFrame::FrameType) frame->mFrameType); 68526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 68626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if((mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) && 68726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mCameraHal->msgTypeEnabled(msgType) && 68826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu (dest != NULL)) { 68926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mDataCb(msgType, mPreviewMemory, mPreviewBufCount, NULL, mCallbackCookie); 69026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 69126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 69226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu // increment for next buffer 69326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mPreviewBufCount = (mPreviewBufCount + 1) % AppCallbackNotifier::MAX_BUFFERS; 69426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu} 69526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 696e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Ramanstatus_t AppCallbackNotifier::dummyRaw() 697e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman{ 698e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman LOG_FUNCTION_NAME; 699e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 700e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( NULL == mRequestMemory ) { 701e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman CAMHAL_LOGEA("Can't allocate memory for dummy raw callback!"); 702e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman return NO_INIT; 703e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 704e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 705e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( ( NULL != mCameraHal ) && 706e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( NULL != mDataCb) && 707e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( NULL != mNotifyCb ) ){ 708e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 709e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE) ) { 710e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman camera_memory_t *dummyRaw = mRequestMemory(-1, 1, 1, NULL); 711e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 712e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( NULL == dummyRaw ) { 713e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman CAMHAL_LOGEA("Dummy raw buffer allocation failed!"); 714e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman return NO_MEMORY; 715e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 716e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 717e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mDataCb(CAMERA_MSG_RAW_IMAGE, dummyRaw, 0, NULL, mCallbackCookie); 718e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 719e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman dummyRaw->release(dummyRaw); 720e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } else if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY) ) { 721e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mNotifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCallbackCookie); 722e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 723e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 724e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 725e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman LOG_FUNCTION_NAME_EXIT; 726e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 727e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman return NO_ERROR; 728e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman} 729e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::notifyFrame() 731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Receive and send the frame notifications to app 733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame *frame; 735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MemoryHeapBase *heap; 736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MemoryBase *buffer = NULL; 737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryBase> memBase; 738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *buf = NULL; 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 7427207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 74326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu Mutex::Autolock lock(mLock); 74426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if(!mFrameQ.isEmpty()) { 74526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameQ.get(&msg); 74626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } else { 74726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu return; 74826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 7517207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman bool ret = true; 7527207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = NULL; 754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(msg.command) 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_FRAME: 757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = (CameraFrame *) msg.arg1; 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!frame) 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (CameraFrame::RAW_FRAME == frame->mFrameType )&& 765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 767e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman ( NULL != mNotifyCb ) ) 768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 770e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE) ) 771e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman { 772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef COPY_IMAGE_BUFFER 77326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu copyAndSendPictureFrame(frame, CAMERA_MSG_RAW_IMAGE); 774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 775e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman //TODO: Find a way to map a Tiler buffer to a MemoryHeapBase 776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 777e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman } 77826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu else { 77926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY) ) { 78026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mNotifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCallbackCookie); 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 78226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameProvider->returnFrame(frame->mBuffer, 78326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu (CameraFrame::FrameType) frame->mFrameType); 78426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 786e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = true; 787e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 789ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu else if ( (CameraFrame::IMAGE_FRAME == frame->mFrameType) && 790ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (NULL != mCameraHal) && 791ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (NULL != mDataCb) && 792ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (CameraFrame::ENCODE_RAW_YUV422I_TO_JPEG & frame->mQuirks) ) 793ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu { 794ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 795c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu int encode_quality = 100, tn_quality = 100; 796c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu int tn_width, tn_height; 797c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu unsigned int current_snapshot = 0; 798c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu Encoder_libjpeg::params *main_jpeg = NULL, *tn_jpeg = NULL; 79936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu void* exif_data = NULL; 800ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu camera_memory_t* raw_picture = mRequestMemory(-1, frame->mLength, 1, NULL); 801ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 802ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if(raw_picture) { 803ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu buf = raw_picture->data; 804ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 805ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 806c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu encode_quality = mParameters.getInt(CameraParameters::KEY_JPEG_QUALITY); 807c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (encode_quality < 0 || encode_quality > 100) { 808c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu encode_quality = 100; 809c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 810c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 811c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_quality = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 812c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (tn_quality < 0 || tn_quality > 100) { 813c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_quality = 100; 814ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 815ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 81636e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu if (CameraFrame::HAS_EXIF_DATA & frame->mQuirks) { 81736e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu exif_data = frame->mCookie2; 81836e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu } 81936e9bdd56757ff8048e08f6e52f234480c44f122Tyler Luu 820c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg = (Encoder_libjpeg::params*) 821c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu malloc(sizeof(Encoder_libjpeg::params)); 822c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (main_jpeg) { 823c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->src = (uint8_t*) frame->mBuffer; 824c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->src_size = frame->mLength; 825c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->dst = (uint8_t*) buf; 826c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->dst_size = frame->mLength; 827c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->quality = encode_quality; 828c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->in_width = frame->mWidth; 829c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->in_height = frame->mHeight; 830c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->out_width = frame->mWidth; 831c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->out_height = frame->mHeight; 832c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu main_jpeg->format = CameraParameters::PIXEL_FORMAT_YUV422I; 833c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 834c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 835c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_width = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 836c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_height = mParameters.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 837c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 838c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if ((tn_width > 0) && (tn_height > 0)) { 839c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg = (Encoder_libjpeg::params*) 840c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu malloc(sizeof(Encoder_libjpeg::params)); 841c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu // if malloc fails just keep going and encode main jpeg 842c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (!tn_jpeg) { 843c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg = NULL; 844c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 845c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 846c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 847c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if (tn_jpeg) { 848c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu int width, height; 849c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu mParameters.getPreviewSize(&width,&height); 850c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu current_snapshot = (mPreviewBufCount + MAX_BUFFERS - 1) % MAX_BUFFERS; 851c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->src = (uint8_t*) mPreviewBufs[current_snapshot]; 852c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->src_size = mPreviewMemory->size / MAX_BUFFERS; 853c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->dst = (uint8_t*) malloc(tn_jpeg->src_size); 854c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->dst_size = tn_jpeg->src_size; 855c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->quality = tn_quality; 856c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->in_width = width; 857c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->in_height = height; 858c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->out_width = tn_width; 859c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->out_height = tn_height; 860c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg->format = CameraParameters::PIXEL_FORMAT_YUV420SP;; 861c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 862c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 863c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu sp<Encoder_libjpeg> encoder = new Encoder_libjpeg(main_jpeg, 864c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu tn_jpeg, 865c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu AppCallbackNotifierEncoderCallback, 866c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu (CameraFrame::FrameType)frame->mFrameType, 867c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu this, 868c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu raw_picture, 869c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu exif_data); 870ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoder->run(); 871ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu encoder.clear(); 872ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( ( CameraFrame::IMAGE_FRAME == frame->mFrameType ) && 874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) ) 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 8777207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman 878e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // CTS, MTS requirements: Every 'takePicture()' call 879e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // who registers a raw callback should receive one 880e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // as well. This is not always the case with 881e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman // CameraAdapters though. 88226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if (!mRawAvailable) { 883e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman dummyRaw(); 88426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } else { 885e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman mRawAvailable = false; 88626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 887e6cf8e95b3192621d3b992fbb09df8c58b1a1e5fSundar Raman 888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifdef COPY_IMAGE_BUFFER 88926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu { 89026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu Mutex::Autolock lock(mBurstLock); 891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: enable burst mode later 89226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if ( mBurst ) 89326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu { 89426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu `(CAMERA_MSG_BURST_IMAGE, JPEGPictureMemBase, mCallbackCookie); 89526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 89626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu else 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 89826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu { 89926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu copyAndSendPictureFrame(frame, CAMERA_MSG_COMPRESSED_IMAGE); 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 90126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Find a way to map a Tiler buffer to a MemoryHeapBase 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( ( CameraFrame::VIDEO_FRAME_SYNC == frame->mFrameType ) && 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_VIDEO_FRAME) ) ) 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingLock.lock(); 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mRecording) 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t *videoMedatadaBufferMemory = 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (camera_memory_t *) mVideoMetadataBufferMemoryMap.valueFor((uint32_t) frame->mBuffer); 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev video_metadata_t *videoMetadataBuffer = (video_metadata_t *) videoMedatadaBufferMemory->data; 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( (NULL == videoMedatadaBufferMemory) || (NULL == videoMetadataBuffer) || (NULL == frame->mBuffer) ) 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! One of the video buffers is NULL"); 923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 92672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if ( mUseVideoBuffers ) 92772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 92872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int vBuf = mVideoMap.valueFor((uint32_t) frame->mBuffer); 92972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng GraphicBufferMapper &mapper = GraphicBufferMapper::get(); 93072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng Rect bounds; 93172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng bounds.left = 0; 93272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng bounds.top = 0; 93372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng bounds.right = mVideoWidth; 93472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng bounds.bottom = mVideoHeight; 93572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 93672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng void *y_uv[2]; 93772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mapper.lock((buffer_handle_t)vBuf, CAMHAL_GRALLOC_USAGE, bounds, y_uv); 93872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 93972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng structConvImage input = {frame->mWidth, 94072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng frame->mHeight, 941c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 4096, 94272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng IC_FORMAT_YCbCr420_lp, 94372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng (mmByte *)frame->mYuv[0], 94472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng (mmByte *)frame->mYuv[1], 94572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng frame->mOffset}; 94672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 94772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng structConvImage output = {mVideoWidth, 94872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mVideoHeight, 949c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 4096, 95072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng IC_FORMAT_YCbCr420_lp, 95172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng (mmByte *)y_uv[0], 95272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng (mmByte *)y_uv[1], 95372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 0}; 95472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 95572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng VT_resizeFrame_Video_opt2_lp(&input, &output, NULL, 0); 95672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mapper.unlock((buffer_handle_t)vBuf); 95772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng videoMetadataBuffer->metadataBufferType = (int) kMetadataBufferTypeCameraSource; 95872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng videoMetadataBuffer->handle = (void *)vBuf; 95972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng videoMetadataBuffer->offset = 0; 96072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 96172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng else 96272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 96372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng videoMetadataBuffer->metadataBufferType = (int) kMetadataBufferTypeCameraSource; 96472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng videoMetadataBuffer->handle = frame->mBuffer; 96572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng videoMetadataBuffer->offset = frame->mOffset; 96672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("mDataCbTimestamp : frame->mBuffer=0x%x, videoMetadataBuffer=0x%x, videoMedatadaBufferMemory=0x%x", 969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame->mBuffer, videoMetadataBuffer, videoMedatadaBufferMemory); 970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCbTimestamp(frame->mTimestamp, CAMERA_MSG_VIDEO_FRAME, 972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory, 0, mCallbackCookie); 973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Need to revisit this, should ideally be mapping the TILER buffer using mRequestMemory 977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* fakebuf = mRequestMemory(-1, 4, 1, NULL); 978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( (NULL == fakebuf) || ( NULL == fakebuf->data) || ( NULL == frame->mBuffer)) 979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! One of the video buffers is NULL"); 981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fakebuf->data = frame->mBuffer; 985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDataCbTimestamp(frame->mTimestamp, CAMERA_MSG_VIDEO_FRAME, fakebuf, 0, mCallbackCookie); 986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fakebuf->release(fakebuf); 987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingLock.unlock(); 990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(( CameraFrame::SNAPSHOT_FRAME == frame->mFrameType ) && 993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mNotifyCb)) { 996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //When enabled, measurement data is sent instead of video data 997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mMeasurementEnabled ) { 99826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu copyAndSendPreviewFrame(frame, CAMERA_MSG_POSTVIEW_FRAME); 99926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } else { 100026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameProvider->returnFrame(frame->mBuffer, 100126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu (CameraFrame::FrameType) frame->mFrameType); 1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 10037207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 10047207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman else if ( ( CameraFrame::PREVIEW_FRAME_SYNC== frame->mFrameType ) && 1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) ) { 1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //When enabled, measurement data is sent instead of video data 1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mMeasurementEnabled ) { 101026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu copyAndSendPreviewFrame(frame, CAMERA_MSG_PREVIEW_FRAME); 101126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } else { 101226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameProvider->returnFrame(frame->mBuffer, 101326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu (CameraFrame::FrameType) frame->mFrameType); 1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 10157207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 10167207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman else if ( ( CameraFrame::FRAME_DATA_SYNC == frame->mFrameType ) && 1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mCameraHal ) && 1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( NULL != mDataCb) && 1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) ) { 102026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu copyAndSendPreviewFrame(frame, CAMERA_MSG_PREVIEW_FRAME); 1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->returnFrame(frame->mBuffer, 1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( CameraFrame::FrameType ) frame->mFrameType); 1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Frame type 0x%x is still unsupported!", frame->mFrameType); 1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != frame ) 1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete frame; 1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::frameCallbackRelay(CameraFrame* caFrame) 1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AppCallbackNotifier *appcbn = (AppCallbackNotifier*) (caFrame->mCookie); 1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev appcbn->frameCallback(caFrame); 1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::frameCallback(CameraFrame* caFrame) 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the event to the event queue of AppCallbackNotifier 1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame *frame; 1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != caFrame ) 1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = new CameraFrame(*caFrame); 1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != frame ) 1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 10678e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_FRAME; 10688e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng msg.arg1 = frame; 10698e88af31129b8cc09675279ca2eac88256d8526bAkwasi Boateng mFrameQ.put(&msg); 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Not enough resources to allocate CameraFrame"); 1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 108126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luuvoid AppCallbackNotifier::flushAndReturnFrames() 108226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu{ 108326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu TIUTILS::Message msg; 108426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu CameraFrame *frame; 108526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 108626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu Mutex::Autolock lock(mLock); 108726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu while (!mFrameQ.isEmpty()) { 108826d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameQ.get(&msg); 108926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu frame = (CameraFrame*) msg.arg1; 109026d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu if (frame) { 109126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mFrameProvider->returnFrame(frame->mBuffer, 109226d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu (CameraFrame::FrameType) frame->mFrameType); 109326d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 109426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu } 109526d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu 109626d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu LOG_FUNCTION_NAME_EXIT; 109726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu} 1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::eventCallbackRelay(CameraHalEvent* chEvt) 1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev AppCallbackNotifier *appcbn = (AppCallbackNotifier*) (chEvt->mCookie); 1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev appcbn->eventCallback(chEvt); 1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::eventCallback(CameraHalEvent* chEvt) 1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the event to the event queue of AppCallbackNotifier 1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHalEvent *event; 1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != chEvt ) 1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev event = new CameraHalEvent(*chEvt); 1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != event ) 1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT; 1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.arg1 = event; 1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventQ.put(&msg); 1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Not enough resources to allocate CameraHalEvent"); 1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool AppCallbackNotifier::processMessage() 1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Retrieve the command from the command queue and process it 1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg; 1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("+Msg get..."); 1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread->msgQ().get(&msg); 1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("-Msg get..."); 1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool ret = true; 1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(msg.command) 1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case NotificationThread::NOTIFIER_EXIT: 1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Received NOTIFIER_EXIT command from Camera HAL"); 1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifierState = AppCallbackNotifier::NOTIFIER_EXITED; 1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = false; 1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error: ProcessMsg() command from Camera HAL"); 1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevAppCallbackNotifier::~AppCallbackNotifier() 1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Stop app callback notifier if not already stopped 1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev stop(); 1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Unregister with the frame provider 1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mFrameProvider ) 1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::ALL_FRAMES); 1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //unregister with the event provider 1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mEventProvider ) 1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); 1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIUTILS::Message msg = {0,0,0,0,0,0}; 1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msg.command = NotificationThread::NOTIFIER_EXIT; 1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Post the message to display thread 1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread->msgQ().put(&msg); 1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Exit and cleanup the thread 11993f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu mNotificationThread->requestExit(); 12003f75fa6e5edf504c155a357494ab77c59b6887b8Tyler Luu mNotificationThread->join(); 1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Delete the display thread 1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotificationThread.clear(); 1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Free the event and frame providers 1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mEventProvider ) 1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Deleting the event provider 1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Stopping Event Provider"); 1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete mEventProvider; 1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = NULL; 1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mFrameProvider ) 1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Deleting the frame provider 1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Stopping Frame Provider"); 1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete mFrameProvider; 1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider = NULL; 1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev releaseSharedVideoBuffers(); 1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Free all video heaps and buffers 1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::releaseSharedVideoBuffers() 1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* videoMedatadaBufferMemory; 1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (unsigned int i = 0; i < mVideoMetadataBufferMemoryMap.size(); i++) 1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory = (camera_memory_t*) mVideoMetadataBufferMemoryMap.valueAt(i); 1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(NULL != videoMedatadaBufferMemory) 1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory->release(videoMedatadaBufferMemory); 1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Released videoMedatadaBufferMemory=0x%x", videoMedatadaBufferMemory); 1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferMemoryMap.clear(); 1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferReverseMap.clear(); 1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier) 1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks There is no NULL check here. We will check 1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///for NULL when we get start command from CameraHal 1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@Remarks Currently only one event provider (CameraAdapter) is supported 1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Have an array of event providers for each event bitmask 1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay); 1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mEventProvider ) 1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error in creating EventProvider"); 1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->enableEventNotification(eventMask); 1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setFrameProvider(FrameNotifier *frameNotifier) 1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks There is no NULL check here. We will check 1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///for NULL when we get the start command from CameraAdapter 1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider = new FrameProvider(frameNotifier, this, frameCallbackRelay); 1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error in creating FrameProvider"); 1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Register only for captured images and RAW for now 1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //TODO: Register for and handle all types of frames 1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::IMAGE_FRAME); 1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::RAW_FRAME); 1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::startPreviewCallbacks(CameraParameters ¶ms, void *buffers, uint32_t *offsets, int fd, size_t length, size_t count) 1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryHeapBase> heap; 1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryBase> buffer; 1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int *bufArr; 1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t size = 0; 1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mLock); 1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to start video recording without FrameProvider"); 1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return -EINVAL; 1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mPreviewing ) 1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("+Already previewing"); 1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int w,h; 1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Get preview size 1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.getPreviewSize(&w, &h); 1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Get the preview pixel format 1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = params.getPreviewFormat(); 1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) 1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size = w*h*2; 1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV422I; 1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || 1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) 1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size = (w*h*3)/2; 1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_YUV420SP; 1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if(strcmp(mPreviewPixelFormat, (const char *) CameraParameters::PIXEL_FORMAT_RGB565) == 0) 1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size = w*h*2; 1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_RGB565; 1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewMemory = mRequestMemory(-1, size, AppCallbackNotifier::MAX_BUFFERS, NULL); 1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mPreviewMemory) { 1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (int i=0; i < AppCallbackNotifier::MAX_BUFFERS; i++) { 1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufs[i] = (unsigned char*) mPreviewMemory->data + (i*size); 1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME ) ) { 1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewBufCount = 0; 1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewing = true; 1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid AppCallbackNotifier::setBurst(bool burst) 1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mBurstLock); 1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBurst = burst; 1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 137572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid AppCallbackNotifier::useVideoBuffers(bool useVideoBuffers) 137672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 137772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME; 137872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 137972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mUseVideoBuffers = useVideoBuffers; 138072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 138172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 138272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 138372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 138472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengbool AppCallbackNotifier::getUesVideoBuffers() 138572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 138672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng return mUseVideoBuffers; 138772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 138872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 138972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid AppCallbackNotifier::setVideoRes(int width, int height) 139072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 139172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME; 139272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 139372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mVideoWidth = width; 139472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mVideoHeight = height; 139572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 139672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 139772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 139872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1399ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luuint AppCallbackNotifier::setParameters(const CameraParameters& params) 1400ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu{ 1401ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME; 1402ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1403c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu mParameters = params; 1404ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1405ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu LOG_FUNCTION_NAME_EXIT; 1406ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu return NO_ERROR; 1407ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu} 1408ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::stopPreviewCallbacks() 1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryHeapBase> heap; 1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sp<MemoryBase> buffer; 1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to stop preview callbacks without FrameProvider"); 1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return -EINVAL; 1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mPreviewing ) 1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14297207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 14307207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman Mutex::Autolock lock(mLock); 1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewMemory->release(mPreviewMemory); 14327207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewing = false; 1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::useMetaDataBufferMode(bool enable) 1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mUseMetaDataBufferMode = enable; 1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::startRecording() 1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mRecordingLock); 1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to start video recording without FrameProvider"); 1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mRecording) 1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::VIDEO_FRAME_SYNC); 1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecording = true; 1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//Allocate metadata buffers for video recording 148272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t AppCallbackNotifier::initSharedVideoBuffers(void *buffers, uint32_t *offsets, int fd, size_t length, size_t count, void *vidBufs) 1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t *bufArr = NULL; 1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_memory_t* videoMedatadaBufferMemory = NULL; 1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(NULL == buffers) 1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! Video buffers are NULL"); 1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return BAD_VALUE; 1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufArr = (uint32_t *) buffers; 1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (uint32_t i = 0; i < count; i++) 1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMedatadaBufferMemory = mRequestMemory(-1, sizeof(video_metadata_t), 1, NULL); 1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if((NULL == videoMedatadaBufferMemory) || (NULL == videoMedatadaBufferMemory->data)) 1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error! Could not allocate memory for Video Metadata Buffers"); 1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferMemoryMap.add(bufArr[i], (uint32_t)(videoMedatadaBufferMemory)); 1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoMetadataBufferReverseMap.add((uint32_t)(videoMedatadaBufferMemory->data), bufArr[i]); 1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("bufArr[%d]=0x%x, videoMedatadaBufferMemory=0x%x, videoMedatadaBufferMemory->data=0x%x", 1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev i, bufArr[i], videoMedatadaBufferMemory, videoMedatadaBufferMemory->data); 151272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 151372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if (vidBufs != NULL) 151472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 151572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng uint32_t *vBufArr = (uint32_t *) vidBufs; 151672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mVideoMap.add(bufArr[i], vBufArr[i]); 151772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng CAMHAL_LOGVB("bufArr[%d]=0x%x, vBuffArr[%d]=0x%x", i, bufArr[i], i, vBufArr[i]); 151872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::stopRecording() 1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Mutex::Autolock lock(mRecordingLock); 1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to stop video recording without FrameProvider"); 1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mRecording) 1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::VIDEO_FRAME_SYNC); 1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Release the shared video buffers 1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev releaseSharedVideoBuffers(); 1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecording = false; 1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::releaseRecordingFrame(const void* mem) 1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *frame = NULL; 1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mFrameProvider ) 1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Trying to stop video recording without FrameProvider"); 1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mem ) 1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Video Frame released is invalid"); 1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( NO_ERROR != ret ) 1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mUseMetaDataBufferMode) 1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev video_metadata_t *videoMetadataBuffer = (video_metadata_t *) mem ; 1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = (void*) mVideoMetadataBufferReverseMap.valueFor((uint32_t) videoMetadataBuffer); 1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGVB("Releasing frame with videoMetadataBuffer=0x%x, videoMetadataBuffer->handle=0x%x & frame handle=0x%x\n", 1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev videoMetadataBuffer, videoMetadataBuffer->handle, frame); 1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame = (void*)(*((uint32_t *)mem)); 1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mFrameProvider->returnFrame(frame, CameraFrame::VIDEO_FRAME_SYNC); 1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::enableMsgType(int32_t msgType) 1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_POSTVIEW_FRAME) 1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::SNAPSHOT_FRAME); 1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_PREVIEW_FRAME) 1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::disableMsgType(int32_t msgType) 1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_POSTVIEW_FRAME) 1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::SNAPSHOT_FRAME); 1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(msgType & CAMERA_MSG_PREVIEW_FRAME) 1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); 1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::start() 1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) 1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("AppCallbackNotifier already running"); 1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ALREADY_EXISTS; 1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Check whether initial conditions are met for us to start 1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///A frame provider should be available, if not return error 1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mFrameProvider) 1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///AppCallbackNotifier not properly initialized 1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("AppCallbackNotifier not properly initialized - Frame provider is NULL"); 1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///At least one event notifier should be available, if not return error 1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Modify here when there is an array of event providers 1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mEventProvider) 1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("AppCallbackNotifier not properly initialized - Event provider is NULL"); 1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///AppCallbackNotifier not properly initialized 1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifierState = AppCallbackNotifier::NOTIFIER_STARTED; 1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STARTED \n"); 1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t AppCallbackNotifier::stop() 1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mNotifierState!=AppCallbackNotifier::NOTIFIER_STARTED) 1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("AppCallbackNotifier already in stopped state"); 1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ALREADY_EXISTS; 1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 16877207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman { 16887207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman Mutex::Autolock lock(mLock); 1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mNotifierState = AppCallbackNotifier::NOTIFIER_STOPPED; 1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STOPPED \n"); 16927207ddb84b57c01ea50c5af85dc4a3984b364deaSundar Raman } 1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*--------------------NotificationHandler Class ENDS here-----------------------------*/ 1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 1704