| /* |
| ** |
| ** Copyright 2013, Samsung Electronics Co. LTD |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #include "SecCameraHyperMotion.h" |
| |
| namespace android { |
| |
| #ifdef SAMSUNG_HYPER_MOTION |
| bool m_hyperMotion_Mode; |
| UniPluginBufferData_t m_hyperMotion_pluginData; |
| UniPluginCameraInfo_t m_hyperMotion_pluginCameraInfo; |
| void *m_hyperMotionPluginHandle; |
| |
| ExynosCameraBuffer m_hyperMotion_OutBuf[NUM_HYPERMOTION_BUFFERS]; |
| int m_hyperMotion_InIndex[NUM_HYPERMOTION_BUFFERS]; |
| int m_hyperMotion_OutIndex[NUM_HYPERMOTION_BUFFERS]; |
| long long int m_hyperMotion_timeStamp[NUM_HYPERMOTION_BUFFERS]; |
| int m_hyperMotion_OutW, m_hyperMotion_OutH, m_hyperMotion_InW, m_hyperMotion_InH; |
| int m_hyperMotion_CameraID; |
| int m_hyperMotion_SensorType; |
| int m_hyperMotion_APType; |
| int m_hyperMotion_FrameNum, m_hyperMotion_Delay; |
| int m_hyperMotion_InQIndex, m_hyperMotion_OutQIndex; |
| char m_hyperMotion_solutionName[40]; |
| bool m_isHyperMotionOn; |
| bool m_canSendFrame; |
| UNI_PLUGIN_OPERATION_MODE m_hyperMotionPlaySpeed; |
| nsecs_t m_hyperMotionTimeStamp; |
| nsecs_t m_hyperMotionTimeBTWFrames; |
| |
| status_t m_hyperMotion_AdjustPreviewSize(int *Width, int *Height) |
| { |
| if (*Width == 2304 && *Height == 1296) { |
| *Width = 1920; |
| *Height = 1080; |
| } else if (*Width == 1536 && *Height == 864) { |
| *Width = 1280; |
| *Height = 720; |
| } else { |
| *Width = (*Width * 5) / 6; |
| *Height = (*Height * 5) / 6; |
| } |
| |
| return NO_ERROR; |
| } |
| |
| status_t m_hyperMotion_init() |
| { |
| int hyperMotion_CameraID; |
| |
| memset(m_hyperMotion_OutBuf, 0x00, sizeof(struct ExynosCameraBuffer) * NUM_HYPERMOTION_BUFFERS); |
| memset(m_hyperMotion_InIndex, 0x00, sizeof(int) * NUM_HYPERMOTION_BUFFERS); |
| memset(m_hyperMotion_OutIndex, 0x00, sizeof(int) * NUM_HYPERMOTION_BUFFERS); |
| memset(m_hyperMotion_timeStamp, 0x00, sizeof(long long int) * NUM_HYPERMOTION_BUFFERS); |
| memset(m_hyperMotion_solutionName, 0x00, sizeof(m_hyperMotion_solutionName)); |
| |
| m_hyperMotion_Mode = true; |
| m_hyperMotion_Delay = 15; |
| m_hyperMotion_FrameNum = 0; |
| |
| m_hyperMotion_OutW = m_hyperMotion_InW; |
| m_hyperMotion_OutH = m_hyperMotion_InH; |
| |
| m_hyperMotion_AdjustPreviewSize(&m_hyperMotion_OutW, &m_hyperMotion_OutH); |
| |
| strncpy(m_hyperMotion_solutionName, HYPER_MOTION_PLUGIN_NAME, sizeof(HYPER_MOTION_PLUGIN_NAME)); |
| |
| m_hyperMotionPluginHandle = uni_plugin_load(m_hyperMotion_solutionName); |
| |
| memset(&m_hyperMotion_pluginData, 0, sizeof(UniPluginBufferData_t)); |
| m_hyperMotion_pluginData.InWidth = m_hyperMotion_InW; |
| m_hyperMotion_pluginData.InHeight = m_hyperMotion_InH; |
| m_hyperMotion_pluginData.OutWidth = m_hyperMotion_OutW; |
| m_hyperMotion_pluginData.OutHeight = m_hyperMotion_OutH; |
| uni_plugin_set(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_BUFFER_INFO, &m_hyperMotion_pluginData); |
| |
| memset(&m_hyperMotion_pluginCameraInfo, 0, sizeof(UniPluginCameraInfo_t)); |
| m_hyperMotion_pluginCameraInfo.CameraType = (UNI_PLUGIN_CAMERA_TYPE)m_hyperMotion_CameraID; |
| m_hyperMotion_pluginCameraInfo.SensorType = (UNI_PLUGIN_SENSOR_TYPE)m_hyperMotion_SensorType; |
| m_hyperMotion_pluginCameraInfo.APType = (UNI_PLUGIN_AP_TYPE)m_hyperMotion_APType; |
| |
| uni_plugin_set(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_CAMERA_INFO, &m_hyperMotion_pluginCameraInfo); |
| |
| m_canSendFrame = false; |
| m_hyperMotionTimeStamp = 0; |
| |
| UniPluginFPS_t fps; |
| uni_plugin_get(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_FPS_INFO, &fps); |
| if (fps.maxFPS.num && fps.maxFPS.den) { |
| m_hyperMotionTimeBTWFrames = (1000000000 * fps.maxFPS.den) / fps.maxFPS.num; |
| ALOGD("[HyperMotion] m_hyperMotionTimeBTWFrames is %lld", m_hyperMotionTimeBTWFrames); |
| } else { |
| ALOGE("[HyperMotion] fps getting is 0!! default set it to 30"); |
| m_hyperMotionTimeBTWFrames = 33333333; |
| } |
| |
| uni_plugin_set(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_OPERATION_MODE, &m_hyperMotionPlaySpeed); |
| |
| uni_plugin_init(m_hyperMotionPluginHandle); |
| |
| ALOGD("HyperMotion_HAL_INIT: HyperMotion_INIT_DONE: Input: %d x %d Output: %d x %d Delay: %d NUM_Buffer: %d", |
| m_hyperMotion_InW, m_hyperMotion_InH, m_hyperMotion_OutW, m_hyperMotion_OutH, m_hyperMotion_Delay, NUM_HYPERMOTION_BUFFERS); |
| return NO_ERROR; |
| } |
| |
| status_t m_hyperMotion_process(ExynosCameraBuffer *hyperMotion_InBuf, int hyperMotion_IndexCount, |
| nsecs_t hyperMotion_timeStamp, nsecs_t hyperMotion_timeStampBoot, int hyperMotion_Lux, int hyperMotion_ZoomLevel, |
| float hyperMotion_ExposureValue) |
| { |
| m_hyperMotion_InIndex[hyperMotion_IndexCount] = hyperMotion_InBuf->index; |
| m_hyperMotion_OutIndex[hyperMotion_IndexCount] = m_hyperMotion_OutBuf[hyperMotion_IndexCount].index; |
| m_hyperMotion_timeStamp[hyperMotion_IndexCount] = hyperMotion_timeStamp; |
| |
| if (m_hyperMotionTimeStamp == 0) |
| m_hyperMotionTimeStamp = hyperMotion_timeStamp; |
| |
| if (hyperMotion_Lux > 20) |
| hyperMotion_Lux = -1*(16777216- hyperMotion_Lux); //2^24 = 16777216 |
| |
| m_hyperMotion_pluginData.InBuffY = (char *)hyperMotion_InBuf->addr[0]; |
| m_hyperMotion_pluginData.InBuffU = (char *)hyperMotion_InBuf->addr[1]; |
| m_hyperMotion_pluginData.OutBuffY = (char *)m_hyperMotion_OutBuf[hyperMotion_IndexCount].addr[0]; |
| m_hyperMotion_pluginData.OutBuffU = (char *)m_hyperMotion_OutBuf[hyperMotion_IndexCount].addr[1]; |
| |
| uni_plugin_set(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_EXPOSURE_VALUE, &hyperMotion_ExposureValue); |
| |
| m_hyperMotion_pluginData.Timestamp = hyperMotion_timeStampBoot; |
| m_hyperMotion_pluginData.BrightnessLux = hyperMotion_Lux; |
| m_hyperMotion_pluginData.ZoomLevel = hyperMotion_ZoomLevel; |
| |
| uni_plugin_set(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_BUFFER_INFO, &m_hyperMotion_pluginData); |
| |
| uni_plugin_process(m_hyperMotionPluginHandle); |
| |
| if (hyperMotion_IndexCount > m_hyperMotion_Delay - 1) { |
| m_hyperMotion_OutQIndex = m_hyperMotion_OutIndex[hyperMotion_IndexCount - m_hyperMotion_Delay]; |
| } else { |
| m_hyperMotion_OutQIndex = m_hyperMotion_OutIndex[hyperMotion_IndexCount + NUM_HYPERMOTION_BUFFERS - m_hyperMotion_Delay]; |
| } |
| |
| UTpoll hyperMotion_FrameToEncodeStatus = UTprocessing; |
| uni_plugin_set(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_BUFFER_INDEX, &m_hyperMotion_OutQIndex); |
| uni_plugin_get(m_hyperMotionPluginHandle, m_hyperMotion_solutionName, UNI_PLUGIN_INDEX_POLLING, &hyperMotion_FrameToEncodeStatus ); |
| if (hyperMotion_FrameToEncodeStatus == UTsuccess) { |
| m_canSendFrame = true; |
| m_hyperMotionTimeStamp += m_hyperMotionTimeBTWFrames; |
| } else { |
| m_canSendFrame = false; |
| } |
| |
| m_hyperMotion_InQIndex = hyperMotion_InBuf->index; |
| m_hyperMotion_FrameNum++; |
| |
| return NO_ERROR; |
| } |
| |
| status_t m_hyperMotion_deinit() |
| { |
| int ret = 0; |
| |
| if (m_hyperMotionPluginHandle != NULL) { |
| uni_plugin_deinit(m_hyperMotionPluginHandle); |
| ret = uni_plugin_unload(&m_hyperMotionPluginHandle); |
| if (ret < 0) { |
| ALOGE("[HyperMotion](%s[%d]):%s plugin unload failed!!", |
| __FUNCTION__, __LINE__, m_hyperMotion_solutionName); |
| } |
| m_hyperMotionPluginHandle = NULL; |
| } |
| |
| m_isHyperMotionOn = false; |
| |
| m_hyperMotion_Mode = false; |
| m_hyperMotion_FrameNum = 0; |
| |
| ALOGD("HyperMotion_HAL: HyperMotion_DEINIT_DONE"); |
| return NO_ERROR; |
| } |
| |
| void m_hyperMotionModeSet(bool mode) |
| { |
| m_isHyperMotionOn = mode; |
| return; |
| } |
| |
| void m_hyperMotionPlaySpeedSet(UNI_PLUGIN_OPERATION_MODE playspeed) |
| { |
| m_hyperMotionPlaySpeed = playspeed; |
| return; |
| } |
| |
| bool m_hyperMotionModeGet() |
| { |
| return m_isHyperMotionOn; |
| } |
| |
| bool m_hyperMotionCanSendFrame() |
| { |
| return m_canSendFrame; |
| } |
| |
| nsecs_t m_hyperMotionTimeStampGet() |
| { |
| return m_hyperMotionTimeStamp; |
| } |
| #endif /*SAMSUNG_HYPER_MOTION*/ |
| }; /* namespace android */ |