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