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