// Copyright 2020 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include #include #include #include #include #include #include #include #include #include #include "json-c/json.h" #include "mediaserver.h" #include "dbserver.h" #include "mediaserver_proxy.h" #include "dbus_connection.h" #include "libipcpro_log_control.h" extern int ipc_pro_log_ctl; #define MEDIA_DBUSSEND(path, interface, member, id, argout) \ dbus_mutex_lock(); \ try { \ DBus::Connection conn = get_dbus_conn(); \ auto proxy_ = std::make_shared(conn, path, interface); \ if (proxy_) \ argout = proxy_->SetParam(member, id); \ } catch (DBus::Error err) { \ ipc_pro_log_ctl && printf("DBus::Error - %s\n", err.what()); \ } \ dbus_mutex_unlock(); #define MEDIA_DBUSSEND_PARAM(path, interface, member, id, param, argout) \ dbus_mutex_lock(); \ try { \ DBus::Connection conn = get_dbus_conn(); \ auto proxy_ = std::make_shared(conn, path, interface); \ if (proxy_) \ argout = proxy_->SetParam(member, id, param); \ } catch (DBus::Error err) { \ ipc_pro_log_ctl && printf("DBus::Error - %s\n", err.what()); \ } \ dbus_mutex_unlock(); /* bitrate set in setBitRate */ static struct KeyTable g_encoder_table[] = { { "iGOP", "SetGOP", PARAM_TYPE_INT, ACTION_TYPE_SET}, // { "iMaxRate", "SetMaxRate", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iStreamSmooth", "SetStreamSmooth", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "sFrameRate", "SetFrameRate", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sResolution", "SetResolution", PARAM_TYPE_STRING, ACTION_TYPE_RESET_PIPE}, { "sRCQuality", "SetRCQuality", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sOutputDataType", "SetOutputDataType", PARAM_TYPE_STRING, ACTION_TYPE_RESET_PIPE}, { "sRCMode", "SetRCMode", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sH264Profile", "SetH264Profile", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sSmart", "SetSmart", PARAM_TYPE_STRING, ACTION_TYPE_RESET_PIPE}, { "sSVC", "SetSVC", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sVideoType", "SetVideoType", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sGrayScaleMode", "SetFullRange", PARAM_TYPE_STRING, ACTION_TYPE_RESET_PIPE}, }; static struct KeyTable g_advanced_encoder_table[] = { { NULL, "SSetQp", PARAM_TYPE_ARRAY, ACTION_TYPE_SET}, { NULL, "SSetSplit", PARAM_TYPE_ARRAY, ACTION_TYPE_SET}, }; static struct KeyTable g_audio_table[] = { { "iSampleRate", "SetSampleRate", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iVolume", "SetVolume", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iBitRate", "SetBitRate", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "sInput", "SetInput", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sEncodeType", "SetEncodeType", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sANS", "SetANS", PARAM_TYPE_STRING, ACTION_TYPE_SET}, }; static struct KeyTable g_camera_table[] = { { NULL, "StartCamera", PARAM_TYPE_NONE, ACTION_TYPE_RESET_PIPE}, { NULL, "StopCamera", PARAM_TYPE_NONE, ACTION_TYPE_RESET_PIPE}, }; static struct KeyTable g_feature_table[] = { { NULL, "TakePicture", PARAM_TYPE_INT, ACTION_TYPE_SET}, { NULL, "StartRecord", PARAM_TYPE_NONE, ACTION_TYPE_SET}, { NULL, "StopRecord", PARAM_TYPE_NONE, ACTION_TYPE_SET}, { NULL, "SetOsd", PARAM_TYPE_ARRAY_DICT, ACTION_TYPE_SET}, { NULL, "SetROI", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { NULL, "SetRegionInvade", PARAM_TYPE_ARRAY, ACTION_TYPE_SET}, { NULL, "SetMoveDetect", PARAM_TYPE_ARRAY, ACTION_TYPE_SET}, { NULL, "SetFaceDetectEn", PARAM_TYPE_INT, ACTION_TYPE_SET}, { NULL, "SetDrawFaceEn", PARAM_TYPE_INT, ACTION_TYPE_SET}, { NULL, "SetFaceCaptureEn", PARAM_TYPE_INT, ACTION_TYPE_SET}, { NULL, "SetFaceRegEn", PARAM_TYPE_INT, ACTION_TYPE_SET}, }; static struct KeyTable g_face_config_table[] = { { "iPromptVolume", "SetPromptVolume", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iLiveDetectThreshold", "SetLiveDetectThreshold", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iFaceDetectionThreshold", "SetFaceDetectionThreshold", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iFaceRecognitionThreshold", "SetFaceRecognitionThreshold", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iFaceMinPixel", "SetFaceMinPixel", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iLeftCornerX", "SetLeftCornerX", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iLeftCornerY", "SetLeftCornerY", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iDetectWidth", "SetDetectWidth", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "iDetectHeight", "SetDetectHeight", PARAM_TYPE_INT, ACTION_TYPE_SET}, { "sLiveDetect", "SetLiveDetectEn", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sLiveDetectBeginTime", "SetLiveDetectBeginTime", PARAM_TYPE_STRING, ACTION_TYPE_SET}, { "sLiveDetectEndTime", "SetLiveDetectEndTime", PARAM_TYPE_STRING, ACTION_TYPE_SET}, }; static int mediaserver_cmd(const char *path, const char *interface, const char *cmd, int id) { int ret; MEDIA_DBUSSEND(path, interface, cmd, id, ret); return ret; } static int mediaserver_cmd_int(const char *path, const char *interface, const char *cmd, int id, int param) { int ret; MEDIA_DBUSSEND_PARAM(path, interface, cmd, id, param, ret); return ret; } static int mediaserver_cmd_array(const char *path, const char *interface, const char *cmd, int id, void *param, int size) { int ret; int32_t *values = (int32_t *)param; std::vector params; for (int i = 0; i < size; i++) params.push_back(values[i]); MEDIA_DBUSSEND_PARAM(path, interface, cmd, id, params, ret); return ret; } static int mediaserver_cmd_string(const char *path, const char *interface, const char *cmd, int id, const char *param) { int ret; std::string params = param; MEDIA_DBUSSEND_PARAM(path, interface, cmd, id, params, ret); return ret; } static int mediaserver_cmd_array_dict(const char *path, const char *interface, const char *cmd, int id, const char *param) { int ret; std::map params; json_object *new_obj = json_tokener_parse(param); json_object_object_foreach(new_obj, key, val) { const char * value_str = json_object_get_string(val); params.emplace(key, value_str); } json_object_put(new_obj); MEDIA_DBUSSEND_PARAM(path, interface, cmd, id, params, ret); return ret; } static int find_method_index(struct KeyTable *table,int table_size, const char* key) { for (int index = 0; index < table_size; index++) { if (!strcmp(key, table[index].name)) return index; } return -1; } static int find_need_reset_index(struct KeyTable *table, int table_size, const char* key) { for (int index = 0; index < table_size; index++) { if (!strcmp(key, table[index].name) && table[index].action_type == ACTION_TYPE_RESET_PIPE) { return index; } } return -1; } static int do_mediaserver_cmd(const char * path, const char * interface, const char * method, int type, int id, const char* value_str) { int ret = 0; if (type == PARAM_TYPE_STRING) { ret = mediaserver_cmd_string(path, interface, method, id, value_str); } else if (type == PARAM_TYPE_INT) { int value = atoi(value_str); ret = mediaserver_cmd_int(path, interface, method, id, value); } else if (type == PARAM_TYPE_NONE) { ret = mediaserver_cmd(path, interface, method, id); } else if (type == PARAM_TYPE_ARRAY_DICT) { ret = mediaserver_cmd_array_dict(path, interface, method, id, value_str); } return ret; } static int do_mediaserver_set(const char * path, const char * interface, struct KeyTable *table, int table_size, int id, const char *data) { int ret = 0; json_object *new_obj = json_tokener_parse(data); json_object_object_foreach(new_obj, find_key, find_val) { const char * value_str = json_object_get_string(find_val); int index = find_need_reset_index(table, table_size, find_key); if (index >= 0) { const char * method = table[index].method; int type = table[index].param_type; ret = do_mediaserver_cmd(path, interface, method, type, id, value_str); json_object_put(new_obj); return ret; } } json_object_object_foreach(new_obj, key, val) { const char * value_str = json_object_get_string(val); int index = find_method_index(table, table_size, key); if (index >= 0) { const char * method = table[index].method; int type = table[index].param_type; ret = do_mediaserver_cmd(path, interface, method, type, id, value_str); } } json_object_put(new_obj); return ret; } static int mediaserver_video_set(int id, const char *data) { int ret = 0; int table_size = sizeof(g_encoder_table) / sizeof(struct KeyTable); ret = do_mediaserver_set(MEDIASERVER_ENCODER_PATH, MEDIASERVER_ENCODER_INTERFACE, g_encoder_table, table_size, id, data); return ret; } static int mediaserver_audio_set(int id, const char *data) { int ret = 0; int table_size = sizeof(g_audio_table) / sizeof(struct KeyTable); ret = do_mediaserver_set(MEDIASERVER_AUDIO_PATH, MEDIASERVER_AUDIO_INTERFACE, g_audio_table, table_size, id, data); return ret; } static int mediaserver_osd_set(int id, const char *data) { int ret = 0; ret = mediaserver_cmd_array_dict(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "SetOsd", id, data); return ret; } static int mediaserver_roi_set(int id, const char *data) { int ret = 0; ret = mediaserver_cmd_string(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "SetRoi", id, data); return ret; } static int mediaserver_move_detect_set(int id, const char *data) { int ret = 0; ret = mediaserver_cmd_array_dict(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "SetMoveDetect", id, data); return ret; } static int mediaserver_region_invade_set(int id, const char *data) { int ret = 0; ret = mediaserver_cmd_array_dict(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "SetRegionInvade", id, data); return ret; } static int mediaserver_face_config_set(int id, const char *data) { int ret = 0; int table_size = sizeof(g_face_config_table) / sizeof(struct KeyTable); ret = do_mediaserver_set(MEDIASERVER_FACE_RECOGNIZE_PATH, MEDIASERVER_FACE_RECOGNIZE_INTERFACE, g_face_config_table, table_size, id, data); return ret; } int mediaserver_set(char *table, int id, const char *data) { int ret = 0; if (!strcmp(table, TABLE_VIDEO)) { ret = mediaserver_video_set(id, data); }else if (!strcmp(table, TABLE_AUDIO)) { ret = mediaserver_audio_set(id, data); } else if (!strcmp(table, TABLE_OSD)) { ret = mediaserver_osd_set(id, data); } else if (!strcmp(table, TABLE_ROI)) { ret = mediaserver_roi_set(id, data); } else if (!strcmp(table, TABLE_MOVE_DETECTION)) { ret = mediaserver_move_detect_set(id, data); } else if (!strcmp(table, TABLE_REGIONAL_INVASION)) { ret = mediaserver_region_invade_set(id, data); } else if (!strcmp(table, TABLE_FACE_CONFIG)) { mediaserver_face_config_set(id, data); } return ret; } int mediaserver_bitrate_set(int id, const char *json) { int ret = 0; ret = mediaserver_cmd_string(MEDIASERVER_ENCODER_PATH, MEDIASERVER_ENCODER_INTERFACE, "SetBitRate", id, json); return ret; } int mediaserver_advanced_enc_set(int id, int table_id, void* param, int size) { int ret = 0; ret =mediaserver_cmd_array(MEDIASERVER_ADVANCED_ENCODER_PATH, MEDIASERVER_ADVANCED_ENCODER_INTERFACE, g_advanced_encoder_table[table_id].method, id, param, size); return ret; } int mediaserver_take_photo(int id, int count) { int ret = 0; ret = mediaserver_cmd_int(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "TakePicture", id, count); return ret; } int mediaserver_start_record(int id) { int ret = 0; ret = mediaserver_cmd(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "StartRecord", id); return ret; } int mediaserver_stop_record(int id) { int ret = 0; ret = mediaserver_cmd(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "StopRecord", id); return ret; } int mediaserver_get_record_status(int id) { int ret = 0; ret = mediaserver_cmd(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "GetRecordStatus", id); return ret; } int mediaserver_feature_id_int(char * method, int id, int enable) { int ret = 0; ret = mediaserver_cmd_int(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, method, id, enable); return ret; } int mediaserver_sync_schedules() { int ret = 0; ret = mediaserver_cmd(MEDIASERVER_FEATURE_PATH, MEDIASERVER_FEATURE_INTERFACE, "SyncSchedules", 0); return ret; } int mediaserver_set_face_image(int id, const char *path) { int ret = 0; ret = mediaserver_cmd_string(MEDIASERVER_FACE_RECOGNIZE_PATH, MEDIASERVER_FACE_RECOGNIZE_INTERFACE, "SetImageToRegn", id, path); return ret; } int mediaserver_delete_face(int id, int face_id) { int ret = 0; ret = mediaserver_cmd_int(MEDIASERVER_FACE_RECOGNIZE_PATH, MEDIASERVER_FACE_RECOGNIZE_INTERFACE, "DeleteFaceInfo", id, face_id); return ret; } int mediaserver_clear_face_db() { int ret = 0; ret = mediaserver_cmd_int(MEDIASERVER_FACE_RECOGNIZE_PATH, MEDIASERVER_FACE_RECOGNIZE_INTERFACE, "ClearFaceDB", 0, 0); return ret; } void mediaserver_stop_flow() { mediaserver_cmd(MEDIASERVER_ENCODER_PATH, MEDIASERVER_ENCODER_INTERFACE, "StopFlow", 0); } void mediaserver_restart_flow() { mediaserver_cmd(MEDIASERVER_ENCODER_PATH, MEDIASERVER_ENCODER_INTERFACE, "RestartFlow", 0); }