From 3cdc9688f07bcec6aa4fdfa4e34a8054b77ff222 Mon Sep 17 00:00:00 2001 From: Jianqin Zhang Date: Fri, 24 Jul 2015 13:12:26 +0000 Subject: Third party apk compatible Camera Change-Id: I8e6fd40ecf4394f1dc26f76cd41ef8ff75825da6 --- 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 #include +#include #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 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 #include #include +#include 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 +#include +#include +#include +#include +#include +#include +#include +#include +#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(data)->startElementHandler(name, attrs); +} + +// static +void LoadXml::EndElementHandlerWrapper(void *me, const char *name) { + static_cast(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 -- cgit