10ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/* 20ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** Copyright (c) 2011 Code Aurora Forum. All rights reserved. 30ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** 40ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** Licensed under the Apache License, Version 2.0 (the "License"); 50ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** you may not use this file except in compliance with the License. 60ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** You may obtain a copy of the License at 70ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** 80ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** http://www.apache.org/licenses/LICENSE-2.0 90ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** 100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** Unless required by applicable law or agreed to in writing, software 110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** distributed under the License is distributed on an "AS IS" BASIS, 120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** See the License for the specific language governing permissions and 140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed** limitations under the License. 150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed*/ 160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/*#error uncomment this for compiler test!*/ 180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed//#define LOG_NDEBUG 0 200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#define LOG_NIDEBUG 0 210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#define LOG_TAG "QCameraHWI_Record" 220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <utils/Log.h> 230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <utils/threads.h> 240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <cutils/properties.h> 250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <fcntl.h> 260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include <sys/mman.h> 270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#include "QCameraStream.h" 290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#define LIKELY(exp) __builtin_expect(!!(exp), 1) 320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#define UNLIKELY(exp) __builtin_expect(!!(exp), 0) 330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/* QCameraStream_record class implementation goes here*/ 350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed/* following code implement the video streaming capture & encoding logic of this class*/ 360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record createInstance() 380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syednamespace android { 400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala SyedQCameraStream* QCameraStream_record::createInstance(int cameraId, 430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed camera_mode_t mode) 440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed QCameraStream* pme = new QCameraStream_record(cameraId, mode); 470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return pme; 490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record deleteInstance() 530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedvoid QCameraStream_record::deleteInstance(QCameraStream *ptr) 550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (ptr){ 580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ptr->release(); 590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed delete ptr; 600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ptr = NULL; 610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record Constructor 670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala SyedQCameraStream_record::QCameraStream_record(int cameraId, 690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed camera_mode_t mode) 700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed :QCameraStream(cameraId,mode), 710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mDebugFps(false) 720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl = NULL; 740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed char value[PROPERTY_VALUE_MAX]; 750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed property_get("persist.debug.sf.showfps", value, "0"); 780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mDebugFps = atoi(value); 790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record Destructor 850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 860ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala SyedQCameraStream_record::~QCameraStream_record() { 870ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 880ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mActive) { 890ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed stop(); 900ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 910ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mInit) { 920ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed release(); 930ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 940ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mInit = false; 950ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mActive = false; 960ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 970ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 980ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 990ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1000ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 1010ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record Callback from mm_camera 1020ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 1030ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedstatic void record_notify_cb(mm_camera_ch_data_buf_t *bufs_new, 1040ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed void *user_data) 1050ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 1060ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed QCameraStream_record *pme = (QCameraStream_record *)user_data; 1070ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mm_camera_ch_data_buf_t *bufs_used = 0; 1080ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 1090ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* 1110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * Call Function Process Video Data 1120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed */ 1130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed pme->processRecordFrame(bufs_new); 1140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 1150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 1160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 1180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record 1190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 1200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedstatus_t QCameraStream_record::init() 1210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 1220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed status_t ret = NO_ERROR; 1230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 1240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* 1260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * Acquiring Video Channel 1270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed */ 1280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = QCameraStream::initChannel (mCameraId, MM_CAMERA_CH_VIDEO_MASK); 1290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (NO_ERROR!=ret) { 1300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s ERROR: Can't init native cammera preview ch\n",__func__); 1310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return ret; 1320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 1330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* 1350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * Register the Callback with camera 1360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed */ 1370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed (void) cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_VIDEO, 1380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed record_notify_cb, 1390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed MM_CAMERA_REG_BUF_CB_INFINITE, 1400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 0, 1410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed this); 1420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mInit = true; 1440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 1450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return ret; 1460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 1470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 1480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record 1490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 1500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedstatus_t QCameraStream_record::start() 1520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 1530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed status_t ret = NO_ERROR; 1540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 1550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed Mutex::Autolock lock(mStopCallbackLock); 1570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(!mInit) { 1580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s ERROR: Record buffer not registered",__func__); 1590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return BAD_VALUE; 1600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 1610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed setFormat(MM_CAMERA_CH_VIDEO_MASK); 1630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mRecordFreeQueueLock.lock(); 1640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mRecordFreeQueue.clear(); 1650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mRecordFreeQueueLock.unlock(); 1660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* 1670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * Allocating Encoder Frame Buffers 1680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed */ 1690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = initEncodeBuffers(); 1700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (NO_ERROR!=ret) { 1710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s ERROR: Buffer Allocation Failed\n",__func__); 1720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed goto error; 1730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 1740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = cam_config_prepare_buf(mCameraId, &mRecordBuf); 1760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(ret != MM_CAMERA_OK) { 1770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s ERROR: Reg Record buf err=%d\n", __func__, ret); 1780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = BAD_VALUE; 1790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed goto error; 1800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed }else{ 1810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = NO_ERROR; 1820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 1830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 1840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* 1850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * Start Video Streaming 1860ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed */ 1870ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = cam_ops_action(mCameraId, TRUE, MM_CAMERA_OPS_VIDEO, 0); 1880ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (MM_CAMERA_OK != ret) { 1890ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE ("%s ERROR: Video streaming start err=%d\n", __func__, ret); 1900ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = BAD_VALUE; 1910ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed goto error; 1920ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed }else{ 1930ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Video streaming Started",__func__); 1940ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = NO_ERROR; 1950ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 1960ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mActive = true; 1970ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 1980ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return ret; 1990ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2000ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syederror: 2010ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed releaseEncodeBuffer(); 2020ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 2030ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return ret; 2040ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 2050ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2060ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedvoid QCameraStream_record::releaseEncodeBuffer() { 2070ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed for(int cnt = 0; cnt < mHalCamCtrl->mRecordingMemory.buffer_count; cnt++) { 2080ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (NO_ERROR != 2090ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_VIDEO, cnt, 2100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mCameraId, CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) 2110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: Unmapping Video Data Failed", __func__); 2120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (mHalCamCtrl->mStoreMetaDataInFrame) { 2140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed struct encoder_media_buffer_type * packet = 2150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed (struct encoder_media_buffer_type *) 2160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->data; 2170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed native_handle_delete(const_cast<native_handle_t *>(packet->meta_handle)); 2180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->release( 2190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]); 2200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.camera_memory[cnt]->release( 2230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.camera_memory[cnt]); 2240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed close(mHalCamCtrl->mRecordingMemory.fd[cnt]); 2250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.fd[cnt] = -1; 2260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#ifdef USE_ION 2280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->deallocate_ion_memory(&mHalCamCtrl->mRecordingMemory, cnt); 2290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif 2300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed memset(&mHalCamCtrl->mRecordingMemory, 0, sizeof(mHalCamCtrl->mRecordingMemory)); 2320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mNumRecordFrames = 0; 2330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed delete[] recordframes; 2340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (mRecordBuf.video.video.buf.mp) 2350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed delete[] mRecordBuf.video.video.buf.mp; 2360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 2370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 2390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record 2400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 2410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedvoid QCameraStream_record::stop() 2420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 2430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed status_t ret = NO_ERROR; 2440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 2450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(!mActive) { 2470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Record stream not started",__func__); 2480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return; 2490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mActive = false; 2510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed Mutex::Autolock lock(mStopCallbackLock); 2520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#if 0 //mzhu, when stop recording, all frame will be dirty. no need to queue frame back to kernel any more 2530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordFreeQueueLock.lock(); 2540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed while(!mRecordFreeQueue.isEmpty()) { 2550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s : Pre-releasing of Encoder buffers!\n", __FUNCTION__); 2560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mm_camera_ch_data_buf_t releasedBuf = mRecordFreeQueue.itemAt(0); 2570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordFreeQueue.removeAt(0); 2580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordFreeQueueLock.unlock(); 2590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s (%d): releasedBuf.idx = %d\n", __FUNCTION__, __LINE__, 2600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed releasedBuf.video.video.idx); 2610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId,&releasedBuf)) 2620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Buf Done Failed",__func__); 2630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordFreeQueueLock.unlock(); 2650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#if 0 2660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed while (!mRecordFreeQueue.isEmpty()) { 2670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Waiting for Encoder to release all buffer!\n", __FUNCTION__); 2680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif 2700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif // mzhu 2710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* unregister the notify fn from the mmmm_camera_t object 2720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * call stop() in parent class to stop the monitor thread */ 2730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = cam_ops_action(mCameraId, FALSE, MM_CAMERA_OPS_VIDEO, 0); 2750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (MM_CAMERA_OK != ret) { 2760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE ("%s ERROR: Video streaming Stop err=%d\n", __func__, ret); 2770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_VIDEO); 2800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(ret != MM_CAMERA_OK){ 2810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s ERROR: Ureg video buf \n", __func__); 2820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 2830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed releaseEncodeBuffer(); 2850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2860ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mActive = false; 2870ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 2880ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2890ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 2900ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 2910ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// QCameraStream_record 2920ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed// --------------------------------------------------------------------------- 2930ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedvoid QCameraStream_record::release() 2940ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 2950ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed status_t ret = NO_ERROR; 2960ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: BEGIN", __func__); 2970ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 2980ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mActive) { 2990ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed stop(); 3000ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3010ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(!mInit) { 3020ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Record stream not initialized",__func__); 3030ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return; 3040ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3050ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3060ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret= QCameraStream::deinitChannel(mCameraId, MM_CAMERA_CH_VIDEO); 3070ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(ret != MM_CAMERA_OK) { 3080ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s:Deinit Video channel failed=%d\n", __func__, ret); 3090ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed (void)cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_VIDEO, 3110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed NULL, 3120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed (mm_camera_register_buf_cb_type_t)NULL, 3130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed NULL, 3140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed NULL); 3150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mInit = false; 3160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s: END", __func__); 3170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 3180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedstatus_t QCameraStream_record::processRecordFrame(void *data) 3200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 3210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s : BEGIN",__func__); 3220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mm_camera_ch_data_buf_t* frame = (mm_camera_ch_data_buf_t*) data; 3230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed Mutex::Autolock lock(mStopCallbackLock); 3250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(!mActive) { 3260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("Recording Stopped. Returning callback"); 3270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return NO_ERROR; 3280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (UNLIKELY(mDebugFps)) { 3310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed debugShowVideoFPS(); 3320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->dumpFrameToFile(frame->video.video.frame, HAL_DUMP_FRM_VIDEO); 3350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mCallbackLock.lock(); 3360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp; 3370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed void *rdata = mHalCamCtrl->mCallbackCookie; 3380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mCallbackLock.unlock(); 3390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed nsecs_t timeStamp = nsecs_t(frame->video.video.frame->ts.tv_sec)*1000000000LL + \ 3410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed frame->video.video.frame->ts.tv_nsec; 3420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("Send Video frame to services/encoder TimeStamp : %lld",timeStamp); 3440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordedFrames[frame->video.video.idx] = *frame; 3450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#ifdef USE_ION 3470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed struct ion_flush_data cache_inv_data; 3480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed int ion_fd; 3490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ion_fd = frame->video.video.frame->ion_dev_fd; 3500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed cache_inv_data.vaddr = (void *)frame->video.video.frame->buffer; 3510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed cache_inv_data.fd = frame->video.video.frame->fd; 3520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed cache_inv_data.handle = frame->video.video.frame->fd_data.handle; 3530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed cache_inv_data.length = frame->video.video.frame->ion_alloc.len; 3540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data, ION_IOC_CLEAN_CACHES) < 0) 3560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: Cache clean for Video buffer %p fd = %d failed", __func__, 3570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed cache_inv_data.vaddr, cache_inv_data.fd); 3580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif 3590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (mHalCamCtrl->mStoreMetaDataInFrame) { 3610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mStopCallbackLock.unlock(); 3620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mActive && (rcb != NULL) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) { 3630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME, 3640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[frame->video.video.idx], 3650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 0, mHalCamCtrl->mCallbackCookie); 3660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } else { 3680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mStopCallbackLock.unlock(); 3690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mActive && (rcb != NULL) && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) { 3700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME, 3710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.camera_memory[frame->video.video.idx], 3720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 0, mHalCamCtrl->mCallbackCookie); 3730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 3750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s : END",__func__); 3770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return NO_ERROR; 3780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 3790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed//Record Related Functions 3810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedstatus_t QCameraStream_record::initEncodeBuffers() 3820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 3830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : BEGIN",__func__); 3840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed status_t ret = NO_ERROR; 3850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed const char *pmem_region; 3860ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed uint32_t frame_len; 3870ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed uint8_t num_planes; 3880ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed uint32_t planes[VIDEO_MAX_PLANES]; 3890ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //cam_ctrl_dimension_t dim; 3900ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed int width = 0; /* width of channel */ 3910ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed int height = 0; /* height of channel */ 3920ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed int buf_cnt; 3930ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed pmem_region = "/dev/pmem_adsp"; 3940ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3950ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 3960ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed memset(&mHalCamCtrl->mRecordingMemory, 0, sizeof(mHalCamCtrl->mRecordingMemory)); 3970ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed memset(&dim, 0, sizeof(cam_ctrl_dimension_t)); 3980ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim); 3990ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (MM_CAMERA_OK != ret) { 4000ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: ERROR - can't get camera dimension!", __func__); 4010ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return BAD_VALUE; 4020ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4030ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed else { 4040ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed width = dim.video_width; 4050ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed height = dim.video_height; 4060ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4070ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed num_planes = 2; 4080ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed planes[0] = dim.video_frame_offset.mp[0].len; 4090ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed planes[1] = dim.video_frame_offset.mp[1].len; 4100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed frame_len = dim.video_frame_offset.frame_len; 4110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed buf_cnt = VIDEO_BUFFER_COUNT; 4130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mHalCamCtrl->isLowPowerCamcorder()) { 4140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: lower power camcorder selected", __func__); 4150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed buf_cnt = VIDEO_BUFFER_COUNT_LOW_POWER_CAMCORDER; 4160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes = new msm_frame[buf_cnt]; 4180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed memset(recordframes,0,sizeof(struct msm_frame) * buf_cnt); 4190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp = new mm_camera_mp_buf_t[buf_cnt * 4210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed sizeof(mm_camera_mp_buf_t)]; 4220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (!mRecordBuf.video.video.buf.mp) { 4230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s Error allocating memory for mplanar struct ", __func__); 4240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return BAD_VALUE; 4250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed memset(mRecordBuf.video.video.buf.mp, 0, 4270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed buf_cnt * sizeof(mm_camera_mp_buf_t)); 4280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed memset(&mHalCamCtrl->mRecordingMemory, 0, sizeof(mHalCamCtrl->mRecordingMemory)); 4300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed for (int i=0; i<MM_CAMERA_MAX_NUM_FRAMES;i++) { 4310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.main_ion_fd[i] = -1; 4320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.fd[i] = -1; 4330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.buffer_count = buf_cnt; 4360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.size = frame_len; 4380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.cbcr_offset = planes[0]; 4390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed for (int cnt = 0; cnt < mHalCamCtrl->mRecordingMemory.buffer_count; cnt++) { 4410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#ifdef USE_ION 4420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mHalCamCtrl->allocate_ion_memory(&mHalCamCtrl->mRecordingMemory, cnt, 4430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed ((0x1 << CAMERA_ION_HEAP_ID) | (0x1 << CAMERA_ION_FALLBACK_HEAP_ID))) < 0) { 4440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s ION alloc failed\n", __func__); 4450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return UNKNOWN_ERROR; 4460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#else 4480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.fd[cnt] = open("/dev/pmem_adsp", O_RDWR|O_SYNC); 4490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mHalCamCtrl->mRecordingMemory.fd[cnt] <= 0) { 4500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: no pmem for frame %d", __func__, cnt); 4510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return UNKNOWN_ERROR; 4520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif 4540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.camera_memory[cnt] = 4550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mGetMemory(mHalCamCtrl->mRecordingMemory.fd[cnt], 4560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.size, 1, (void *)this); 4570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (mHalCamCtrl->mStoreMetaDataInFrame) { 4590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[cnt] = 4600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mGetMemory(-1, 4610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed sizeof(struct encoder_media_buffer_type), 1, (void *)this); 4620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed struct encoder_media_buffer_type * packet = 4630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed (struct encoder_media_buffer_type *) 4640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->data; 4650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed packet->meta_handle = native_handle_create(1, 2); //1 fd, 1 offset and 1 size 4660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed packet->buffer_type = kMetadataBufferTypeCameraSource; 4670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed native_handle_t * nh = const_cast<native_handle_t *>(packet->meta_handle); 4680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed nh->data[0] = mHalCamCtrl->mRecordingMemory.fd[cnt]; 4690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed nh->data[1] = 0; 4700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed nh->data[2] = mHalCamCtrl->mRecordingMemory.size; 4710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 4720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].fd = mHalCamCtrl->mRecordingMemory.fd[cnt]; 4730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].buffer = (uint32_t)mHalCamCtrl->mRecordingMemory.camera_memory[cnt]->data; 4740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].y_off = 0; 4750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].cbcr_off = mHalCamCtrl->mRecordingMemory.cbcr_offset; 4760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].path = OUTPUT_TYPE_V; 4770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].fd_data = mHalCamCtrl->mRecordingMemory.ion_info_fd[cnt]; 4780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].ion_alloc = mHalCamCtrl->mRecordingMemory.alloc[cnt]; 4790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].ion_dev_fd = mHalCamCtrl->mRecordingMemory.main_ion_fd[cnt]; 4800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (NO_ERROR != 4820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->sendMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_VIDEO, cnt, 4830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].fd, mHalCamCtrl->mRecordingMemory.size, mCameraId, 4840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed CAM_SOCK_MSG_TYPE_FD_MAPPING)) 4850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: sending mapping data Msg Failed", __func__); 4860ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4870ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE ("initRecord : record heap , video buffers buffer=%lu fd=%d y_off=%d cbcr_off=%d\n", 4880ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed (unsigned long)recordframes[cnt].buffer, recordframes[cnt].fd, recordframes[cnt].y_off, 4890ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].cbcr_off); 4900ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mNumRecordFrames++; 4910ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 4920ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].frame = recordframes[cnt]; 4930ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].frame_offset = 0; 4940ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].num_planes = num_planes; 4950ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* Plane 0 needs to be set seperately. Set other planes 4960ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed * in a loop. */ 4970ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[0].reserved[0] = 4980ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].frame_offset; 4990ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[0].length = planes[0]; 5000ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[0].m.userptr = 5010ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].fd; 5020ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed for (int j = 1; j < num_planes; j++) { 5030ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[j].length = planes[j]; 5040ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[j].m.userptr = 5050ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed recordframes[cnt].fd; 5060ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[j].reserved[0] = 5070ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[j-1].reserved[0] + 5080ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.buf.mp[cnt].planes[j-1].length; 5090ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5100ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5110ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 5120ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //memset(&mRecordBuf, 0, sizeof(mRecordBuf)); 5130ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.ch_type = MM_CAMERA_CH_VIDEO; 5140ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mRecordBuf.video.video.num = mHalCamCtrl->mRecordingMemory.buffer_count;//kRecordBufferCount; 5150ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mRecordBuf.video.video.frame_offset = &record_offset[0]; 5160ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed //mRecordBuf.video.video.frame = &recordframes[0]; 5170ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : END",__func__); 5180ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return NO_ERROR; 5190ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 5200ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 5210ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedvoid QCameraStream_record::releaseRecordingFrame(const void *opaque) 5220ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 5230ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s : BEGIN, opaque = 0x%p",__func__, opaque); 5240ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(!mActive) 5250ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed { 5260ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Recording already stopped!!! Leak???",__func__); 5270ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return; 5280ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5290ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed for(int cnt = 0; cnt < mHalCamCtrl->mRecordingMemory.buffer_count; cnt++) { 5300ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (mHalCamCtrl->mStoreMetaDataInFrame) { 5310ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mHalCamCtrl->mRecordingMemory.metadata_memory[cnt] && 5320ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->data == opaque) { 5330ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* found the match */ 5340ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mRecordedFrames[cnt])) 5350ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Buf Done Failed",__func__); 5360ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s : END",__func__); 5370ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return; 5380ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5390ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } else { 5400ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(mHalCamCtrl->mRecordingMemory.camera_memory[cnt] && 5410ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mHalCamCtrl->mRecordingMemory.camera_memory[cnt]->data == opaque) { 5420ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed /* found the match */ 5430ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mRecordedFrames[cnt])) 5440ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s : Buf Done Failed",__func__); 5450ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGV("%s : END",__func__); 5460ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return; 5470ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5480ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5490ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5500ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGE("%s: cannot find the matched frame with opaue = 0x%p", __func__, opaque); 5510ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 5520ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 5530ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedvoid QCameraStream_record::debugShowVideoFPS() const 5540ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 5550ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed static int mFrameCount; 5560ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed static int mLastFrameCount = 0; 5570ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed static nsecs_t mLastFpsTime = 0; 5580ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed static float mFps = 0; 5590ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mFrameCount++; 5600ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed nsecs_t now = systemTime(); 5610ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed nsecs_t diff = now - mLastFpsTime; 5620ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed if (diff > ms2ns(250)) { 5630ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mFps = ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff; 5640ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed LOGI("Video Frames Per Second: %.4f", mFps); 5650ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mLastFpsTime = now; 5660ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed mLastFrameCount = mFrameCount; 5670ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed } 5680ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 5690ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 5700ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#if 0 5710ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedsp<IMemoryHeap> QCameraStream_record::getHeap() const 5720ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed{ 5730ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return mRecordHeap != NULL ? mRecordHeap->mHeap : NULL; 5740ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 5750ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 5760ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed#endif 5770ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syedstatus_t QCameraStream_record::takeLiveSnapshot(){ 5780ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed return true; 5790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed} 5800ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 5810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed}//namespace android 5820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed 583