1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

391 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (C) 2016 Rockchip Electronics Co., Ltd.
* Authors:
* Zhiqin Wei <wzq@rock-chips.com>
*
* 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.
*/
#define LOG_NDEBUG 0
#define LOG_TAG "main"
#include <stdint.h>
#include <sys/types.h>
#include <math.h>
#include <pthread.h>
#include <fcntl.h>
#include <utils/misc.h>
#include <signal.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <linux/stddef.h>
#include <utils/Atomic.h>
#include <utils/Errors.h>
#include <utils/Log.h>
#include <utils/Thread.h>
#include <android/bitmap.h>
#include <vector>
#include <jni.h>
#include "CameraHal.h"
#include "ExternalCameraMemManager.h"
///////////////////////////////////////////////////////
class AvmXMLParameters {
public:
// Camera parameters
int camera_num; /* Number of cameras */
std::string car_model_path;
std::string calib_result_path;
std::string file_base_path;
std::vector<std::vector<int>> camera_fd;
int readXML(const char* filename);
private:
int setParam(int num, const char* val);
int getParam(const char* name);
int readCamera(const char* src, int index);
};
AvmXMLParameters *rk_avm_param_init = NULL;
using namespace android;
int objectsInit(std::string path);
int auto_calib(void * buf[]);
void objectsFree();
int calib_set_pic_size(int width, int height);
int calib_set_template_mode(int mode);
int calib_set_template_size(int ds, int dh);
int calib_get_input_data(std::string data_input_base_path, unsigned char **input_data);
extern void avm_view_set_offset_en(int val);
extern void avm_view_offset_adjust(int code);
#define RK_AVM_MIDDLEWARE_VERSION 202207121052
#define RUN_AVM_ALGO 1
int algo_status = 0;
CameraHal* gCameraHals[CONFIG_CAMERA_NUM];
MemManagerBase* camMemManager;
BufferProvider* displayBuf;
DisplayAdapter* displayAdapter;
ProcessAdapter* processAdapter;
static int g_start_x[2] = {0, 0};
static int g_start_y[2] = {0, 0};
static int run_algo_count = 0;
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_startAlgo(JNIEnv* env,
jobject thiz)
{
property_set("persist.sys.camera360", "1");
if(run_algo_count == 0)
++run_algo_count;
LOGD("start run algo count %d ==================\n", run_algo_count);
rk_avm_param_init = new AvmXMLParameters;
if(!rk_avm_param_init)
return;
int xml_ret = rk_avm_param_init->readXML("/data/AppData_rk/avm_settings.xml");
if(xml_ret)
LOGE("read xml failed \n");
LOGD("========== [%d %d %d %d] =========== \n", rk_avm_param_init->camera_fd[0][0], rk_avm_param_init->camera_fd[1][0],
rk_avm_param_init->camera_fd[2][0], rk_avm_param_init->camera_fd[3][0]);
LOGD("========== [%s] [%s] [%s] =========== \n", rk_avm_param_init->file_base_path.c_str(), rk_avm_param_init->calib_result_path.c_str(),
rk_avm_param_init->car_model_path.c_str());
#if RUN_AVM_ALGO
if(run_algo_count == 1){
algo_status = 1;
/*Ϊ<><CEAA>ʾ<EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD>̳߳<DFB3>ʼ<EFBFBD><CABC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
if(camMemManager == NULL)
camMemManager = new GrallocDrmMemManager(false);
else
LOGD("=========== camMemManager has been constructed, no need new\n");
if(displayBuf == NULL)
displayBuf = new BufferProvider(camMemManager);
else
LOGD("=========== displayBuf has been constructed, no need new\n");
if(displayAdapter == NULL)
displayAdapter = new DisplayAdapter();
else
LOGD("=========== displayAdapter has been constructed, no need new\n");
if(processAdapter == NULL)
processAdapter = new ProcessAdapter();
else
LOGD("=========== processAdapter has been constructed, no need new\n");
if(processAdapter && displayBuf)
displayAdapter->setDisplayBufProvider(displayBuf);
if(processAdapter && displayAdapter){
processAdapter->setSurroundModelPath(rk_avm_param_init->car_model_path);
processAdapter->setSurroundCalibPath(rk_avm_param_init->calib_result_path);
processAdapter->setSurroundBasePath(rk_avm_param_init->file_base_path);
processAdapter->setDisplayAdapter(displayAdapter);
}
/*ÿ<><C3BF>camera<72><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD>Դ*/
for (int i = 0; i < CONFIG_CAMERA_NUM; i++) {
if(CameraHal::g_myCamFd[i] != -1)
{
close(CameraHal::g_myCamFd[i]);
CameraHal::g_myCamFd[i] = -1;
}
if(xml_ret)
gCameraHals[i] = new CameraHal(i,i);
else
gCameraHals[i] = new CameraHal(i,rk_avm_param_init->camera_fd[i][0]);
gCameraHals[i]->setProcessAdapter(processAdapter);
}
processAdapter->setCameras(gCameraHals);
processAdapter->startProcess(1920, 1080);
displayAdapter->startDisplay(1920, 1080);
for (int i = 0; i < CONFIG_CAMERA_NUM; i++) {
char* param = gCameraHals[i]->getParameters();
CameraParameters params;
String8 str_params(param);
params.unflatten(str_params);
params.setPreviewSize(1920, 1080);
gCameraHals[i]->setParameters(params);
gCameraHals[i]->bufferPrepare();
LOGD("camera %d bufferPrepare over==========", i);
}
for (int i = 0; i < CONFIG_CAMERA_NUM; i++) {
gCameraHals[i]->startPreview();
LOGD("camera %d startPreview over==========", i);
}
}
#endif
//pthread_exit(NULL);
return;
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_stopAlgo(JNIEnv* env,jobject thiz)
{
algo_status = 0;
if(run_algo_count == 1)
--run_algo_count;
LOGD("stop run algo count %d ==================\n", run_algo_count);
#if RUN_AVM_ALGO
if(run_algo_count == 0){
displayAdapter->pauseDisplay();
processAdapter->pauseProcess();
for (int i = 0; i < CONFIG_CAMERA_NUM; i++) {
gCameraHals[i]->stopPreview();
LOGD("camera %d stopPreview over==========", i);
delete gCameraHals[i];
gCameraHals[i] = NULL;
}
delete processAdapter;
processAdapter = NULL;
LOGD("SUCCESS DELETE processAdapter\n");
delete displayAdapter;
displayAdapter = NULL;
LOGD("SUCCESS DELETE displayAdapter\n");
delete displayBuf;
displayBuf = NULL;
LOGD("SUCCESS DELETE displayBuf\n");
delete camMemManager;
camMemManager = NULL;
LOGD("SUCCESS DELETE camMemManager\n");
delete rk_avm_param_init;
rk_avm_param_init = NULL;
}
property_set("persist.sys.camera360", "2");
#endif
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_drawIntoBitmap(JNIEnv* env,
jobject thiz, jobject dstBitmap, jlong elapsedTime)
{
// Grab the dst bitmap info and pixels
AndroidBitmapInfo dstInfo;
void* dstPixels;
AndroidBitmap_getInfo(env, dstBitmap, &dstInfo);
AndroidBitmap_lockPixels(env, dstBitmap, &dstPixels);
if(algo_status){
if(displayAdapter)
displayAdapter->fillDisplayBuffer(dstPixels, dstInfo.width, dstInfo.height);
}else{
uint32_t *dest = (uint32_t *)dstPixels;
int i,j;
for(i=0;i<100;i++){
for(j=0;j<100;j++){
dest[i*dstInfo.width + j] = 0xff0000ff;
}
}
}
AndroidBitmap_unlockPixels(env, dstBitmap);
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_setDiaplaySize(JNIEnv* env,
jobject thiz, jint width, jint height)
{
LOGD("setDisplaySize %d %d\n",width,height);
if(displayAdapter)
displayAdapter->setDisplaySize(width, height);
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_setAlgoType(JNIEnv* env,
jobject thiz, jint type)
{
LOGD("setSurround3dType %d==========", type);
if(algo_status){
if(processAdapter)
processAdapter->setSurround3dType(type);
}
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_onScreenTouch(JNIEnv* env,
jobject thiz, jint sx, jint sy, jint mx, jint my)
{
LOGD("onScreenTouch start(%d,%d) current (%d,%d)",sx,sy,mx,my);
if(sx > 1260)
return;
if(mx > 1260)
mx = 1260;
int dx ,dy;
if(sx != g_start_x[0]){
g_start_x[0] = sx;
g_start_x[1] = mx;
dx = mx - sx;
}
else
{
dx = mx - g_start_x[1];
g_start_x[1] = mx;
}
if(sy != g_start_y[0]){
g_start_y[0] = sy;
g_start_y[1] = my;
dy = my - sy;
}
else
{
dy = my - g_start_y[1];
g_start_y[1] = my;
}
if(algo_status){
if(processAdapter)
processAdapter->setScreenOffset(dx, dy);
}
}
#define TEMPLATE_SIZE_DS 3120
#define TEMPLATE_SIZE_DH 4250
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_ui_main_PlaceholderFragment_startCalib(JNIEnv* env, jobject thiz, jint ab, jint bc, jint ds)
{
LOGD("==============startCalib==========");
#if 0
int ret = 0;
unsigned char* input_data[4] = {NULL, NULL,NULL, NULL};
int rows, cols, channels;
std::string base_path = "/data/AppData";
calib_set_pic_size(1920, 1080);
calib_set_template_mode(0);
calib_set_template_size(TEMPLATE_SIZE_DS, TEMPLATE_SIZE_DH);
LOGD("BASE PATH IS %s %d %d\n", base_path.c_str(), ab, bc);
ret = calib_get_input_data(base_path, input_data);
LOGD("==== SUCCESS GET INPUT DATA\n");
auto_calib((void **)input_data);
for(int index = 0; index < CAMERAS_NUM; index++)
{
if(input_data[index] != NULL)
free(input_data[index]);
}
LOGD("==== RUN HERE %d\n", __LINE__);
#endif
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_setViewAdj(JNIEnv* env, jobject thiz, jint code)
{
LOGD("setViewAdj %d==========",code);
avm_view_offset_adjust(code);
}
extern "C"
JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_setViewAdjEn(JNIEnv* env, jobject thiz, jint en)
{
LOGD("setViewAdjEn %d==========",en);
avm_view_set_offset_en(en);
}
//int main() {
// Java_com_example_myapplication_MainActivity_startAlgo(NULL, NULL);
// return 0;
//}