summaryrefslogtreecommitdiff
authorJianqin Zhang <jianqin.zhang@amlogic.com>2015-07-24 13:12:26 (GMT)
committer Lei Qian <lei.qian@amlogic.com>2015-07-27 02:39:13 (GMT)
commit3cdc9688f07bcec6aa4fdfa4e34a8054b77ff222 (patch)
treed7de135f238d778d3edf3d1e89f4cfa6f23603c0
parent145d68a78458287f6655a64b00158913bc5f95a7 (diff)
downloadcamera-3cdc9688f07bcec6aa4fdfa4e34a8054b77ff222.zip
camera-3cdc9688f07bcec6aa4fdfa4e34a8054b77ff222.tar.gz
camera-3cdc9688f07bcec6aa4fdfa4e34a8054b77ff222.tar.bz2
Third party apk compatible Camera
Change-Id: I8e6fd40ecf4394f1dc26f76cd41ef8ff75825da6
Diffstat
-rw-r--r--[-rwxr-xr-x]v3/Android.mk9
-rw-r--r--[-rwxr-xr-x]v3/EmulatedFakeCamera3.cpp52
-rw-r--r--[-rwxr-xr-x]v3/EmulatedFakeCamera3.h3
-rw-r--r--v3/LoadXml.cpp208
-rw-r--r--v3/LoadXml.h48
5 files changed, 298 insertions, 22 deletions
diff --git a/v3/Android.mk b/v3/Android.mk
index c6ddc9a..47680f2 100755..100644
--- a/v3/Android.mk
+++ b/v3/Android.mk
@@ -55,7 +55,8 @@ LOCAL_SHARED_LIBRARIES:= \
libui \
libdl \
libjpeg \
- libjhead
+ libjhead \
+ libexpat
# JPEG conversion libraries and includes.
LOCAL_SHARED_LIBRARIES += \
@@ -73,7 +74,8 @@ LOCAL_C_INCLUDES += external/jpeg \
$(TOP)/system/core/libion/kernel-headers \
$(TOP)/hardware/amlogic/gralloc \
$(LOCAL_PATH)/inc \
- $(call include-path-for, camera)
+ $(call include-path-for, camera) \
+ $(TOP)/external/expat/lib \
LOCAL_SRC_FILES := \
EmulatedCameraHal.cpp \
@@ -101,7 +103,8 @@ LOCAL_SRC_FILES := \
EmulatedFakeCamera3.cpp \
EmulatedFakeCamera3Info.cpp \
fake-pipeline2/camera_hw.cpp \
- VendorTags.cpp
+ VendorTags.cpp \
+ LoadXml.cpp \
ifeq ($(TARGET_PRODUCT),vbox_x86)
LOCAL_MODULE := camera.vbox_x86
diff --git a/v3/EmulatedFakeCamera3.cpp b/v3/EmulatedFakeCamera3.cpp
index 1d59eeb..12f5eda 100755..100644
--- a/v3/EmulatedFakeCamera3.cpp
+++ b/v3/EmulatedFakeCamera3.cpp
@@ -38,6 +38,7 @@
#include "fake-pipeline2/JpegCompressor.h"
#include <cmath>
#include <gralloc_priv.h>
+#include <binder/IPCThreadState.h>
#if defined(LOG_NNDEBUG) && LOG_NNDEBUG == 0
#define ALOGVV ALOGV
@@ -178,6 +179,8 @@ EmulatedFakeCamera3::EmulatedFakeCamera3(int cameraId, struct hw_module_t* modul
mSupportCap = 0;
mSupportRotate = 0;
mFullMode = 0;
+
+ gLoadXml.parseXMLFile();
}
EmulatedFakeCamera3::~EmulatedFakeCamera3() {
@@ -380,6 +383,8 @@ status_t EmulatedFakeCamera3::closeCamera() {
status_t EmulatedFakeCamera3::getCameraInfo(struct camera_info *info) {
char property[PROPERTY_VALUE_MAX];
+ char* tempApkName = gLoadXml.getApkPackageName(IPCThreadState::self()->getCallingPid());
+ List_Or * temp=new List_Or();
info->facing = mFacingBack ? CAMERA_FACING_BACK : CAMERA_FACING_FRONT;
if (mSensorType == SENSOR_USB) {
if (mFacingBack) {
@@ -388,6 +393,15 @@ status_t EmulatedFakeCamera3::getCameraInfo(struct camera_info *info) {
property_get("hw.camera.orientation.front", property, "0");
}
int32_t orientation = atoi(property);
+
+ if (gLoadXml.findApkCp(tempApkName, temp)) {
+ orientation = atoi(temp->pro);
+ }
+ if (temp != NULL) {
+ delete temp;
+ temp = NULL;
+ }
+
property_get("hw.camera.usb.orientation_offset", property, "0");
orientation += atoi(property);
orientation %= 360;
@@ -419,15 +433,15 @@ void EmulatedFakeCamera3::getValidJpegSize(uint32_t picSizes[], uint32_t availab
}
if (valid) {
availablejpegsize[j] = picSizes[i+1];
- availablejpegsize[j+1] = picSizes[i+2];
+ availablejpegsize[j+1] = picSizes[i+2];
j+=2;
}
- valid = true;
+ valid = true;
}
}
status_t EmulatedFakeCamera3::checkValidJpegSize(uint32_t width, uint32_t height) {
-
+
int validsizecount = 0;
uint32_t count = sizeof(mAvailableJpegSize)/sizeof(mAvailableJpegSize[0]);
for (uint32_t f = 0; f < count; f+=2) {
@@ -490,7 +504,7 @@ status_t EmulatedFakeCamera3::configureStreams(
isRestart = true;//mSensor->isNeedRestart(newStream->width, newStream->height, newStream->format);
DBG_LOGB("format=%x, w*h=%dx%d, stream_type=%d, max_buffers=%d, isRestart=%d\n",
newStream->format, newStream->width, newStream->height,
- newStream->stream_type, newStream->max_buffers,
+ newStream->stream_type, newStream->max_buffers,
isRestart);
}
ALOGV("%s: Stream %p (id %zu), type %d, usage 0x%x, format 0x%x",
@@ -532,7 +546,7 @@ status_t EmulatedFakeCamera3::configureStreams(
if (ret != OK) {
return BAD_VALUE;
}
-
+
}
mInputStream = inputStream;
width = 0;
@@ -765,7 +779,7 @@ const camera_metadata_t* EmulatedFakeCamera3::constructDefaultRequestSettings(
static const uint8_t flashstate = ANDROID_FLASH_STATE_UNAVAILABLE;
settings.update(ANDROID_FLASH_STATE, &flashstate, 1);
-
+
static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
@@ -945,7 +959,7 @@ const camera_metadata_t* EmulatedFakeCamera3::constructDefaultRequestSettings(
}
settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
-
+
static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
@@ -1022,7 +1036,7 @@ const camera_metadata_t* EmulatedFakeCamera3::constructDefaultRequestSettings(
static const uint8_t afstate = ANDROID_CONTROL_AF_STATE_INACTIVE;
settings.update(ANDROID_CONTROL_AF_STATE,&afstate,1);
-
+
// settings.update(ANDROID_CONTROL_AF_REGIONS, controlRegions, 5);
static const uint8_t aestate = ANDROID_CONTROL_AE_STATE_CONVERGED;
@@ -1109,7 +1123,7 @@ status_t EmulatedFakeCamera3::processCaptureRequest(
#if 0
if (!priv->alive || !priv->registered) {
ALOGE("%s: Request %d: Buffer %zu: Unregistered or dead stream! alive=%d, registered=%d\n",
- __FUNCTION__, frameNumber, idx,
+ __FUNCTION__, frameNumber, idx,
priv->alive, priv->registered);
//return BAD_VALUE;
}
@@ -1600,7 +1614,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
char property[PROPERTY_VALUE_MAX];
unsigned int supportrotate;
availablejpegsize = ARRAY_SIZE(mAvailableJpegSize);
- memset(mAvailableJpegSize,0,(sizeof(uint32_t))*availablejpegsize);
+ memset(mAvailableJpegSize,0,(sizeof(uint32_t))*availablejpegsize);
sp<Sensor> s = new Sensor();
ret = s->startUp(mCameraID);
if (ret != OK) {
@@ -1772,7 +1786,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
static const uint8_t flashstate = ANDROID_FLASH_STATE_UNAVAILABLE;
info.update(ANDROID_FLASH_STATE, &flashstate, 1);
-
+
static const int64_t flashChargeDuration = 0;
info.update(ANDROID_FLASH_INFO_CHARGE_DURATION, &flashChargeDuration, 1);
@@ -1789,7 +1803,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
static const uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;
info.update(ANDROID_SCALER_CROPPING_TYPE, &croppingType, 1);
-
+
info.update(ANDROID_SCALER_AVAILABLE_FORMATS,
kAvailableFormats,
sizeof(kAvailableFormats)/sizeof(int32_t));
@@ -1809,7 +1823,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
availablejpegsize = count;
}
getValidJpegSize(picSizes,mAvailableJpegSize,availablejpegsize);
-
+
maxJpegResolution = getMaxJpegResolution(picSizes,count);
int32_t full_size[4];
if (mFacingBack) {
@@ -1824,7 +1838,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
full_size[3] = maxJpegResolution.height;
}
info.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
- (int32_t*)full_size,
+ (int32_t*)full_size,
sizeof(full_size)/sizeof(full_size[0]));
duration = new int64_t[count];
if (duration == NULL) {
@@ -1904,7 +1918,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY;
info.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
-
+
static const uint8_t availableSceneModes[] = {
// ANDROID_CONTROL_SCENE_MODE_DISABLED,
ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY
@@ -1958,7 +1972,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
static const uint8_t afstate = ANDROID_CONTROL_AF_STATE_INACTIVE;
info.update(ANDROID_CONTROL_AF_STATE,&afstate,1);
-
+
static const uint8_t availableAfModesFront[] = {
ANDROID_CONTROL_AF_MODE_OFF
};
@@ -2062,7 +2076,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
uint8_t len[] = {1};
info.update(ANDROID_REQUEST_PIPELINE_DEPTH, (uint8_t *)len, 1);
-
+
uint8_t maxlen[] = {2};
info.update(ANDROID_REQUEST_PIPELINE_MAX_DEPTH, (uint8_t *)maxlen, 1);
uint8_t cap[] = {
@@ -2093,7 +2107,7 @@ status_t EmulatedFakeCamera3::constructStaticInfo() {
if (duration != NULL) {
delete [] duration;
}
-
+
s->shutDown();
s.clear();
mPlugged = true;
@@ -2124,7 +2138,7 @@ status_t EmulatedFakeCamera3::process3A(CameraMetadata &settings) {
return BAD_VALUE;
}
uint8_t sceneMode = e.data.u8[0];
-
+
if (controlMode == ANDROID_CONTROL_MODE_OFF) {
mAeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
mAfState = ANDROID_CONTROL_AF_STATE_INACTIVE;
diff --git a/v3/EmulatedFakeCamera3.h b/v3/EmulatedFakeCamera3.h
index 3c47531..4968f28 100755..100644
--- a/v3/EmulatedFakeCamera3.h
+++ b/v3/EmulatedFakeCamera3.h
@@ -30,6 +30,7 @@
#include <camera/CameraMetadata.h>
#include <utils/List.h>
#include <utils/Mutex.h>
+#include <LoadXml.h>
namespace android {
@@ -215,6 +216,8 @@ private:
/* Full mode (true) or limited mode (false) switch */
bool mFullMode;
+ LoadXml gLoadXml;
+
enum sensor_type_e mSensorType;
/**
diff --git a/v3/LoadXml.cpp b/v3/LoadXml.cpp
new file mode 100644
index 0000000..3d7ed01
--- a/dev/null
+++ b/v3/LoadXml.cpp
@@ -0,0 +1,208 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <cutils/properties.h>
+#include <gui/Surface.h>
+#include <utils/Log.h>
+#include <expat.h>
+#include "LoadXml.h"
+namespace android {
+
+char* LoadXml::getApkPackageName(int callingPid) {
+ cameraCallProcess[0] = 0x00;
+ sprintf(cameraCallProcess,"/proc/%d/cmdline",callingPid);
+ int id = open(cameraCallProcess, O_RDONLY);
+ if (id < 0) {
+ memset(cameraCallProcess,0x00,sizeof(cameraCallProcess));
+ } else {
+ memset(cameraCallProcess,0x00,sizeof(cameraCallProcess));
+ read(id, cameraCallProcess, 64);
+ close(id);
+ id = -1;
+ }
+ return cameraCallProcess;
+}
+
+int LoadXml::destroyList_Open(List_Open *head) {
+ List_Open *p;
+ if (head == NULL) {
+ return 0;
+ }
+ while (head) {
+ p = head->next;
+ delete head;
+ head = NULL;
+ head = p;
+ }
+ return 1;
+}
+
+int LoadXml::destroyList_Or(List_Or *head) {
+ List_Or *p;
+ if (head == NULL) {
+ return 0;
+ }
+ while (head) {
+ p = head->next;
+ delete head;
+ head = NULL;
+ head = p;
+ }
+ return 1;
+}
+
+List_Or::~List_Or() {
+ delete apk_name;
+ apk_name = NULL;
+ delete pro;
+ pro = NULL;
+ delete capo;
+ capo = NULL;
+}
+
+List_Open::~List_Open() {
+ delete apk_name;
+ apk_name = NULL;
+ delete camera_number;
+ camera_number = NULL;
+}
+
+LoadXml::~LoadXml() {
+ destroyList_Open(Lo_Head);
+ destroyList_Or(Lr_Head);
+}
+
+List_Open::List_Open(char const* apk,char const*camera) {
+ apk_name = new char[strlen(apk) + 1];
+ strcpy(apk_name, apk);
+ camera_number = new char[strlen(camera) + 1];
+ strcpy(camera_number, camera);
+}
+
+List_Or::List_Or(char const* apk,char const* pr,char const* cap) {
+ apk_name=new char[strlen(apk) + 1];
+ strcpy(apk_name, apk);
+ pro=new char[strlen(pr) + 1];
+ strcpy(pro, pr);
+ capo=new char[strlen(cap) + 1];
+ strcpy(capo, cap);
+}
+
+List_Or::List_Or() {
+ apk_name = NULL;
+ pro = NULL;
+ capo = NULL;
+}
+
+LoadXml::LoadXml() {
+ Lo_Head = NULL;
+ Lr_Head = NULL;
+ indent = 0;
+}
+
+bool LoadXml::findApkOp(char * apk_name) {
+ List_Open* Lo_temp = Lo_Head;
+ while (Lo_temp != NULL) {
+ if (!strcmp(Lo_temp->apk_name,apk_name)) {
+ return true;
+ }
+ Lo_temp = Lo_temp->next;
+ }
+ return false;
+}
+
+int LoadXml::findApkCp(char * apk_name,List_Or* temp) {
+ List_Or* Lr_temp = Lr_Head;
+ while (Lr_temp != NULL) {
+ if (!strcmp(Lr_temp->apk_name, apk_name)) {
+ temp->apk_name = new char[strlen(Lr_temp->apk_name) + 1];
+ strcpy(temp->apk_name, Lr_temp->apk_name);
+ temp->pro = new char[strlen(Lr_temp->pro) + 1];
+ strcpy(temp->pro, Lr_temp->pro);
+ temp->capo = new char[strlen(Lr_temp->capo) + 1];
+ strcpy(temp->capo, Lr_temp->capo);
+ return 1;
+ }
+ Lr_temp = Lr_temp->next;
+ }
+ return 0;
+}
+
+void LoadXml::print() {
+ List_Open* Lo_temp = Lo_Head;
+ List_Or* Lr_temp = Lr_Head;
+ while (Lo_temp != NULL) {
+ Lo_temp = Lo_temp->next;
+ }
+ while (Lr_temp != NULL) {
+ Lr_temp = Lr_temp->next;
+ }
+}
+
+// static
+void LoadXml::StartElementHandlerWrapper (void *data ,const char *name, const char **attrs) {
+ static_cast<LoadXml *>(data)->startElementHandler(name, attrs);
+}
+
+// static
+void LoadXml::EndElementHandlerWrapper(void *me, const char *name) {
+ static_cast<LoadXml *>(me)->endElementHandler(name);
+}
+
+void LoadXml::startElementHandler(const char *name, const char **attrs) {
+ int i;
+ int j;
+ List_Open* q = NULL;
+ List_Or* l = NULL;
+ if (attrs[4] == NULL) {
+ for (i = 0; attrs[i]; i += 4) {
+ q = new List_Open(attrs[i + 1], attrs[i + 3]);
+ q->next = Lo_Head;
+ Lo_Head = q;
+ }
+ }else{
+ for (j = 0; attrs[j]; j += 6) {
+ l = new List_Or(attrs[j + 1], attrs[j + 3], attrs[j + 5]);
+ l->next = Lr_Head;
+ Lr_Head = l;
+ }
+ }
+ ++indent;
+}
+
+void LoadXml::endElementHandler(const char *name) {
+ --indent;
+}
+
+void LoadXml::parseXMLFile() {
+ FILE* fp;
+ const int BUFF_SIZE = 1024;
+ const char* filename = "/etc/Third_party_apk_camera.xml";
+ if ((fp = fopen(filename, "r")) == NULL) {
+ return ;
+ }
+ if (NULL == fp) {
+ return;
+ }
+ XML_Parser parser = ::XML_ParserCreate(NULL);
+ ::XML_SetUserData(parser, this);
+ ::XML_SetElementHandler(parser, StartElementHandlerWrapper, EndElementHandlerWrapper);
+ void *buff = ::XML_GetBuffer(parser, BUFF_SIZE);
+ if (buff == NULL) {
+ //LOG1("failed to in call to XML_GetBuffer()");
+ }
+ int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp);
+ if (bytes_read < 0) {
+ //LOG1("failed in call to read");
+ }
+ if (::XML_ParseBuffer(parser, bytes_read, bytes_read == 0)!= XML_STATUS_OK) {
+ //LOG1("failed parser xml");
+ }
+ ::XML_ParserFree(parser);
+ fclose(fp);
+ fp=NULL;
+}
+}
+
diff --git a/v3/LoadXml.h b/v3/LoadXml.h
new file mode 100644
index 0000000..c25971d
--- a/dev/null
+++ b/v3/LoadXml.h
@@ -0,0 +1,48 @@
+#ifndef ANDROID_SERVERS_CAMERA_FINDAPK_H
+#define ANDROID_SERVERS_CAMERA_FINDAPK_H
+namespace android {
+class List_Open
+{
+public:
+ List_Open(char const* apk,char const*camera);
+ ~List_Open();
+ char* apk_name;
+ char* camera_number;
+ List_Open* next;
+};
+class List_Or
+{
+public:
+ List_Or(char const*apk,char const*pr,char const* cap);
+ List_Or();
+ ~List_Or();
+ char* apk_name;
+ char* pro; //preview oritation
+ char* capo; //capture oritation
+ List_Or* next;
+};
+class LoadXml
+{
+public:
+ char* getApkPackageName(int callingPid);
+ int findApkCp(char * apk_name, List_Or* temp);
+ bool findApkOp(char * apk_name);
+ void print();
+ int destroyList_Or(List_Or *head);
+ int destroyList_Open(List_Open *head);
+ void parseXMLFile();
+ static void StartElementHandlerWrapper(void *data,const char *name, const char **attrs);
+ static void EndElementHandlerWrapper(void *me, const char *name);
+ void startElementHandler(const char *name, const char **attrs);
+ void endElementHandler(const char *name);
+ LoadXml();
+ ~LoadXml();
+private:
+ char cameraCallProcess[64];
+ int callingId;
+ List_Open* Lo_Head;
+ List_Or* Lr_Head;
+ int indent;
+};
+}
+#endif