#include #include #include #include #include #include #include "gstmenudraw.h" #include #include GST_DEBUG_CATEGORY_STATIC (gst_menudraw_debug); #define GST_CAT_DEFAULT gst_menudraw_debug #define USE_EGLIMAGE 1 static GQuark _dsmeta_quark = 0; bool flag = false; static cv::Mat Image_Arr[301]; static DrawParam (*Process_Draw_Update_Func[9])(GstMenuDraw*, GstBuffer*); /* Enum to identify properties */ enum { PROP_0, PROP_UNIQUE_ID, PROP_PROCESSING_WIDTH, PROP_PROCESSING_HEIGHT, PROP_PROCESS_FULL_FRAME, PROP_PAGE_NUM, PROP_CURSOR_POS, PROP_COMMAND, PROP_GPU_DEVICE_ID }; #define CHECK_NVDS_MEMORY_AND_GPUID(object, surface) \ ({ int _errtype=0;\ do { \ if ((surface->memType == NVBUF_MEM_DEFAULT || surface->memType == NVBUF_MEM_CUDA_DEVICE) && \ (surface->gpuId != object->gpu_id)) { \ GST_ELEMENT_ERROR (object, RESOURCE, FAILED, \ ("Input surface gpu-id doesnt match with configured gpu-id for element," \ " please allocate input using unified memory, or use same gpu-ids"),\ ("surface-gpu-id=%d,%s-gpu-id=%d",surface->gpuId,GST_ELEMENT_NAME(object),\ object->gpu_id)); \ _errtype = 1;\ } \ } while(0); \ _errtype; \ }) //// //filepath; #define PATH_MENU_TITLEBAR "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_bar.png" #define PATH_MENU_ICON_TITLE_MENU "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_icon_menu.png" #define PATH_MENU_ICON_TITLE_SCREEN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_icon_scr.png" #define PATH_MENU_ICON_TITLE_CAMERA "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_icon_camera.png" #define PATH_MENU_ICON_TITLE_SOUND "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_icon_sound.png" #define PATH_MENU_ICON_TITLE_TIME "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_icon_time.png" #define PATH_MENU_ICON_TITLE_VERSION "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_icon_ver.png" #define PATH_MENU_ICON_TITLE_EXIT "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_x.png" #define PATH_MENU_CAMERA_FLIP_CAM1_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_cam1_dn.png" #define PATH_MENU_CAMERA_FLIP_CAM1_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_cam1_nor.png" #define PATH_MENU_CAMERA_FLIP_CAM2_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_cam2_dn.png" #define PATH_MENU_CAMERA_FLIP_CAM2_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_cam2_nor.png" #define PATH_MENU_CAMERA_FLIP_VERTICAL_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_reverse_1_dn.png" #define PATH_MENU_CAMERA_FLIP_VERTICAL_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_reverse_1_nor.png" #define PATH_MENU_CAMERA_FLIP_HORIZONTAL_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_reverse_2_dn.png" #define PATH_MENU_CAMERA_FLIP_HORIZONTAL_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_reverse_2_nor.png" #define PATH_MENU_CAMERA_LAYOUT_FULLSCREEN_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_act_1_dn.png" #define PATH_MENU_CAMERA_LAYOUT_FULLSCREEN_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_act_1_nor.png" #define PATH_MENU_CAMERA_LAYOUT_FULLSCREEN_FOCUS "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_act_1_sel.png" #define PATH_MENU_CAMERA_LAYOUT_PIP_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_act_2_dn.png" #define PATH_MENU_CAMERA_LAYOUT_PIP_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_act_2_nor.png" #define PATH_MENU_CAMERA_LAYOUT_PIP_FOCUS "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_act_2_sel.png" #define PATH_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_deact_1_dn.png" #define PATH_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_deact_1_nor.png" #define PATH_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_FOCUS "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_deact_1_sel.png" #define PATH_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_deact_2_dn.png" #define PATH_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_deact_2_nor.png" #define PATH_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_FOCUS "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_deact_2_sel.png" #define PATH_MENU_CAMERA_DETECTLOCATION_LOW "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_alarm_1-3.png" #define PATH_MENU_CAMERA_DETECTLOCATION_MID "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_alarm_2-3.png" #define PATH_MENU_CAMERA_DETECTLOCATION_FULL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/camera_alarm_full.png" #define PATH_MENU_ICON_CAMERA_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_camera_dn.png" #define PATH_MENU_ICON_CAMERA_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_camera_nor.png" #define PATH_MENU_ICON_SAVE "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_save.png" #define PATH_MENU_ICON_SCREEN_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_scr_dn.png" #define PATH_MENU_ICON_SCREEN_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_scr_nor.png" #define PATH_MENU_ICON_SOUND_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_sound_dn.png" #define PATH_MENU_ICON_SOUND_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_sound_nor.png" #define PATH_MENU_ICON_TIME_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_time_dn.png" #define PATH_MENU_ICON_TIME_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_time_nor.png" #define PATH_MENU_ICON_VERSION_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_ver_dn.png" #define PATH_MENU_ICON_VERSION_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/icon_ver_nor.png" #define PATH_MENU_ICON_LOGO_LOADING_FRAME1 "/opt/nvidia/deepstream/deepstream-4.0/samples/images/intro_logo_0.png" #define PATH_MENU_ICON_LOGO_LOADING_FRAME2 "/opt/nvidia/deepstream/deepstream-4.0/samples/images/intro_logo_1.png" #define PATH_MENU_ICON_LOGO_LOADING_FRAME3 "/opt/nvidia/deepstream/deepstream-4.0/samples/images/intro_logo_2.png" #define PATH_MENU_ICON_LOGO_LOADING_FRAME4 "/opt/nvidia/deepstream/deepstream-4.0/samples/images/intro_logo_3.png" #define PATH_MENU_ICON_NEXT "/opt/nvidia/deepstream/deepstream-4.0/samples/images/list_next.png" #define PATH_MENU_ICON_PREV_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/sub_list_closed_dn.png" #define PATH_MENU_ICON_PREV_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/sub_list_closed_nor.png" #define PATH_MENU_LOGO_KIGIS "/opt/nvidia/deepstream/deepstream-4.0/samples/images/logo.png" #define PATH_MENU_LINE_TITLE "/opt/nvidia/deepstream/deepstream-4.0/samples/images/line_title.png" #define PATH_MENU_LINE_MENULIST "/opt/nvidia/deepstream/deepstream-4.0/samples/images/line_menulist.png" #define PATH_MENU_BG_MENUMAIN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/bg_menu_main.png" #define PATH_MENU_BG_MENUSUB "/opt/nvidia/deepstream/deepstream-4.0/samples/images/bg_menu_sub.png" #define PATH_MENU_BTN_MENULIST "/opt/nvidia/deepstream/deepstream-4.0/samples/images/btn_menulist_dn.png" #define PATH_MENU_BOX_TITLE_MINIBOX "/opt/nvidia/deepstream/deepstream-4.0/samples/images/title_box.png" #define PATH_MENU_BOX_POPUP "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_popup.png" #define PATH_MENU_BOX_MENU_SUBLIST_BACK_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/sub_list_closed_dn.png" #define PATH_MENU_BOX_MENU_SUBLIST_BACK_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/sub_list_closed_nor.png" #define PATH_MENU_BOX_SCREEN_AND_ALARM_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_3_dn.png" #define PATH_MENU_BOX_SCREEN_AND_ALARM_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_3_nor.png" #define PATH_MENU_BOX_CAMERA_LAYOUT_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_camera2_dn.png" #define PATH_MENU_BOX_CAMERA_LAYOUT_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_camera2_nor.png" #define PATH_MENU_BOX_CAMERA_DETECTIONRECT_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_camera3_dn.png" #define PATH_MENU_BOX_CAMERA_DETECTIONRECT_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_camera3_nor.png" #define PATH_MENU_BOX_TIME_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_time_dn.png" #define PATH_MENU_BOX_TIME_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_time_nor.png" #define PATH_MENU_BOX_OKCANCEL_DOWN "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_okcancel_dn.png" #define PATH_MENU_BOX_OKCANCEL_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/box_okcancel_nor.png" #define PATH_MENU_RADIO_ON "/opt/nvidia/deepstream/deepstream-4.0/samples/images/radio_sel_on.png" #define PATH_MENU_RADIO_NORMAL "/opt/nvidia/deepstream/deepstream-4.0/samples/images/radio_nor_off.png" #define PATH_MENU_RADIO_OFF "/opt/nvidia/deepstream/deepstream-4.0/samples/images/radio_sel_off.png" #define PATH_MENU_VOLUME_LEVEL_FIVE_ON "/opt/nvidia/deepstream/deepstream-4.0/samples/images/level_5_on.png" #define PATH_MENU_VOLUME_LEVEL_FIVE_OFF "/opt/nvidia/deepstream/deepstream-4.0/samples/images/level_5_off.png" #define PATH_MENU_VOLUME_LEVEL_TEN_ON "/opt/nvidia/deepstream/deepstream-4.0/samples/images/level_10_on.png" #define PATH_MENU_VOLUME_LEVEL_TEN_OFF "/opt/nvidia/deepstream/deepstream-4.0/samples/images/level_10_off.png" //Image index //filepath #define INDEX_MENU_TITLEBAR 1 #define INDEX_MENU_ICON_TITLE_MENU 2 #define INDEX_MENU_ICON_TITLE_SCREEN 3 #define INDEX_MENU_ICON_TITLE_CAMERA 4 #define INDEX_MENU_ICON_TITLE_SOUND 5 #define INDEX_MENU_ICON_TITLE_TIME 6 #define INDEX_MENU_ICON_TITLE_VERSION 7 #define INDEX_MENU_ICON_TITLE_EXIT 8 #define INDEX_MENU_CAMERA_FLIP_CAM1_DOWN 9 #define INDEX_MENU_CAMERA_FLIP_CAM1_NORMAL 10 #define INDEX_MENU_CAMERA_FLIP_CAM2_DOWN 11 #define INDEX_MENU_CAMERA_FLIP_CAM2_NORMAL 12 #define INDEX_MENU_CAMERA_FLIP_VERTICAL_DOWN 13 #define INDEX_MENU_CAMERA_FLIP_VERTICAL_NORMAL 14 #define INDEX_MENU_CAMERA_FLIP_HORIZONTAL_DOWN 15 #define INDEX_MENU_CAMERA_FLIP_HORIZONTAL_NORMAL 16 #define INDEX_MENU_CAMERA_LAYOUT_FULLSCREEN_DOWN 17 #define INDEX_MENU_CAMERA_LAYOUT_FULLSCREEN_NORMAL 18 #define INDEX_MENU_CAMERA_LAYOUT_FULLSCREEN_FOCUS 19 #define INDEX_MENU_CAMERA_LAYOUT_PIP_DOWN 20 #define INDEX_MENU_CAMERA_LAYOUT_PIP_NORMAL 21 #define INDEX_MENU_CAMERA_LAYOUT_PIP_FOCUS 22 #define INDEX_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_DOWN 23 #define INDEX_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_NORMAL 24 #define INDEX_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_FOCUS 25 #define INDEX_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_DOWN 26 #define INDEX_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_NORMAL 27 #define INDEX_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_FOCUS 28 #define INDEX_MENU_CAMERA_DETECTLOCATION_LOW 29 #define INDEX_MENU_CAMERA_DETECTLOCATION_MID 30 #define INDEX_MENU_CAMERA_DETECTLOCATION_FULL 31 #define INDEX_MENU_ICON_CAMERA_DOWN 32 #define INDEX_MENU_ICON_CAMERA_NORMAL 33 #define INDEX_MENU_ICON_SAVE 34 #define INDEX_MENU_ICON_SCREEN_DOWN 35 #define INDEX_MENU_ICON_SCREEN_NORMAL 36 #define INDEX_MENU_ICON_SOUND_DOWN 37 #define INDEX_MENU_ICON_SOUND_NORMAL 38 #define INDEX_MENU_ICON_TIME_DOWN 39 #define INDEX_MENU_ICON_TIME_NORMAL 40 #define INDEX_MENU_ICON_VERSION_DOWN 41 #define INDEX_MENU_ICON_VERSION_NORMAL 42 #define INDEX_MENU_ICON_LOGO_LOADING_FRAME1 43 #define INDEX_MENU_ICON_LOGO_LOADING_FRAME2 44 #define INDEX_MENU_ICON_LOGO_LOADING_FRAME3 45 #define INDEX_MENU_ICON_LOGO_LOADING_FRAME4 46 #define INDEX_MENU_ICON_NEXT 47 #define INDEX_MENU_ICON_PREV_DOWN 48 #define INDEX_MENU_ICON_PREV_NORMAL 49 #define INDEX_MENU_LOGO_KIGIS 50 #define INDEX_MENU_LINE_TITLE 51 #define INDEX_MENU_LINE_MENULIST 52 #define INDEX_MENU_BG_MENUMAIN 53 #define INDEX_MENU_BG_MENUSUB 54 #define INDEX_MENU_BTN_MENULIST 55 #define INDEX_MENU_BOX_TITLE_MINIBOX 56 #define INDEX_MENU_BOX_POPUP 57 #define INDEX_MENU_BOX_MENU_SUBLIST_BACK_DOWN 58 #define INDEX_MENU_BOX_MENU_SUBLIST_BACK_NORMAL 59 #define INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN 60 #define INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL 61 #define INDEX_MENU_BOX_CAMERA_LAYOUT_DOWN 62 #define INDEX_MENU_BOX_CAMERA_LAYOUT_NORMAL 63 #define INDEX_MENU_BOX_CAMERA_DETECTIONRECT_DOWN 64 #define INDEX_MENU_BOX_CAMERA_DETECTIONRECT_NORMAL 65 #define INDEX_MENU_BOX_TIME_DOWN 66 #define INDEX_MENU_BOX_TIME_NORMAL 67 #define INDEX_MENU_BOX_OKCANCEL_DOWN 68 #define INDEX_MENU_BOX_OKCANCEL_NORMAL 69 #define INDEX_MENU_RADIO_ON 70 #define INDEX_MENU_RADIO_NORMAL 71 #define INDEX_MENU_RADIO_OFF 72 #define INDEX_MENU_VOLUME_LEVEL_FIVE_ON 73 #define INDEX_MENU_VOLUME_LEVEL_FIVE_OFF 74 #define INDEX_MENU_VOLUME_LEVEL_TEN_ON 75 #define INDEX_MENU_VOLUME_LEVEL_TEN_OFF 76 #define INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY 150 #define INDEX_MENU_BACKGROUND_FULLSCREEN_BLACK 151 #define INDEX_MENU_BACKGROUND_MENU_MAIN 200 #define INDEX_MENU_BACKGROUND_MENU_SUB 201 #define INDEX_MENU_BACKGROUND_CAMERA_FLIP_CAMERA_RECT 202 #define INDEX_MENU_BACKGROUND_CAMERA_FLIP_SETTING_RECT 203 #define INDEX_MENU_LINE_UNDERTITLE 250 #define INDEX_MENU_LINE_MENU_MAINLIST 251 #define INDEX_MENU_LINE_MENU_SUBLIST 252 #define INDEX_MENU_LINE_DETECTLOCATION_INBOX 253 #define INDEX_MENU_LINE_SCREEN_INBOX 254 //// //draw parameters #define BGCOLOR_BLACK 1; //// /* Default values for properties */ #define DEFAULT_UNIQUE_ID 15 #define DEFAULT_PROCESSING_WIDTH 640 #define DEFAULT_PROCESSING_HEIGHT 480 #define DEFAULT_PROCESS_FULL_FRAME TRUE #define DEFAULT_GPU_ID 0 #define DEFAULT_PAGE_NUM 0 #define DEFAULT_CURSOR_POS 0 #define RGB_BYTES_PER_PIXEL 3 #define RGBA_BYTES_PER_PIXEL 4 #define Y_BYTES_PER_PIXEL 1 #define UV_BYTES_PER_PIXEL 2 #define MIN_INPUT_OBJECT_WIDTH 16 #define MIN_INPUT_OBJECT_HEIGHT 16 #define CHECK_NPP_STATUS(npp_status,error_str) do { \ if ((npp_status) != NPP_SUCCESS) { \ g_print ("Error: %s in %s at line %d: NPP Error %d\n", \ error_str, __FILE__, __LINE__, npp_status); \ goto error; \ } \ } while (0) #define CHECK_CUDA_STATUS(cuda_status,error_str) do { \ if ((cuda_status) != cudaSuccess) { \ g_print ("Error: %s in %s at line %d (%s)\n", \ error_str, __FILE__, __LINE__, cudaGetErrorName(cuda_status)); \ goto error; \ } \ } while (0) /* By default NVIDIA Hardware allocated memory flows through the pipeline. We * will be processing on this type of memory only. */ #define GST_CAPS_FEATURE_MEMORY_NVMM "memory:NVMM" static GstStaticPadTemplate gst_menudraw_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_NVMM, "{ NV12, RGBA, I420 }"))); static GstStaticPadTemplate gst_menudraw_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_NVMM, "{ NV12, RGBA, I420 }"))); /* Define our element type. Standard GObject/GStreamer boilerplate stuff */ #define gst_menudraw_parent_class parent_class G_DEFINE_TYPE (GstMenuDraw, gst_menudraw, GST_TYPE_BASE_TRANSFORM); static void gst_menudraw_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_menudraw_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_menudraw_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps); static gboolean gst_menudraw_start (GstBaseTransform * btrans); static gboolean gst_menudraw_stop (GstBaseTransform * btrans); static GstFlowReturn gst_menudraw_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf); static GstFlowReturn gst_menudraw_transform (GstBaseTransform * btrans, GstBuffer * inbuf, GstBuffer * outbuf); static GstFlowReturn gst_menudraw_prepare_output_buffer(GstBaseTransform * btrans, GstBuffer * inbuf, GstBuffer ** outbuf); static gboolean load_test_img(); static GstFlowReturn Process_Draw_Menu(NvBufSurface *surface, DrawParam *DrawParam); static DrawParam Process_Update_Menu_Main(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Screen(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Alarm(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Camera_Layout(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Camera_Flip(GstMenuDraw *, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Camera_DetectLocation(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Camera_Initialize(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Time(GstMenuDraw *menudraw, GstBuffer *inputbuf); static DrawParam Process_Update_Menu_Version(GstMenuDraw *menudraw, GstBuffer *inputbuf); void FillRoundedRectangle(cv::Mat& src, cv::Point topLeft, cv::Size rectSz, const cv::Scalar lineColor, const cv::Scalar fillColor, const int thickness, const int lineType, const float cornerCurvatureRatio); static gboolean AddText(DrawParam *drawparam, std::string text, cv::Scalar* color, int x, int y ); static gboolean AddImage(DrawParam *drawparam, cv::Mat *mat, int x, int y); static gboolean AddImage(DrawParam *drawparam, cv::Mat *mat, int x, int y, gboolean isalpha); static gpointer copy_user_meta(gpointer data, gpointer user_data); static void release_user_meta(gpointer data, gpointer user_data); /* Install properties, set sink and src pad capabilities, override the required * functions of the base class, These are common to all instances of the * element. */ static void gst_menudraw_class_init (GstMenuDrawClass* klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseTransformClass *gstbasetransform_class; g_print("Start menudraw class init\n"); // Indicates we want to use DS buf api g_setenv ("DS_NEW_BUFAPI", "1", TRUE); gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasetransform_class = (GstBaseTransformClass *) klass; /* Overide base class functions */ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_menudraw_set_property); gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_menudraw_get_property); gstbasetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_menudraw_set_caps); gstbasetransform_class->start = GST_DEBUG_FUNCPTR (gst_menudraw_start); gstbasetransform_class->stop = GST_DEBUG_FUNCPTR (gst_menudraw_stop); //gstbasetransform_class->transform_ip = //GST_DEBUG_FUNCPTR (gst_menudraw_transform_ip); gstbasetransform_class->transform = GST_DEBUG_FUNCPTR (gst_menudraw_transform); gstbasetransform_class->prepare_output_buffer = GST_DEBUG_FUNCPTR(gst_menudraw_prepare_output_buffer); /* Install properties */ g_object_class_install_property (gobject_class, PROP_UNIQUE_ID, g_param_spec_uint ("unique-id", "Unique ID", "Unique ID for the element. Can be used to identify output of the" " element", 0, G_MAXUINT, DEFAULT_UNIQUE_ID, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_PROCESSING_WIDTH, g_param_spec_int ("processing-width", "Processing Width", "Width of the input buffer to algorithm", 1, G_MAXINT, DEFAULT_PROCESSING_WIDTH, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_PROCESSING_HEIGHT, g_param_spec_int ("processing-height", "Processing Height", "Height of the input buffer to algorithm", 1, G_MAXINT, DEFAULT_PROCESSING_HEIGHT, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_PROCESS_FULL_FRAME, g_param_spec_boolean ("full-frame", "Full frame", "Enable to process full frame or disable to process objects detected" "by primary detector", DEFAULT_PROCESS_FULL_FRAME, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_PAGE_NUM, g_param_spec_int ("page-num", "Menu Page Num", "page num", 0, G_MAXINT, DEFAULT_PAGE_NUM, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_CURSOR_POS, g_param_spec_int ("cursor-pos", "Menu Cursor Position", "position", -1, G_MAXINT, DEFAULT_CURSOR_POS, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_COMMAND, g_param_spec_int ("command", "Command Button Hit", "Command", 0, G_MAXINT, DEFAULT_CURSOR_POS, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); g_object_class_install_property (gobject_class, PROP_GPU_DEVICE_ID, g_param_spec_uint ("gpu-id", "Set GPU Device ID", "Set GPU Device ID", 0,G_MAXUINT, 0, GParamFlags (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY))); /* Set sink and src pad capabilities */ gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gst_menudraw_src_template)); gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&gst_menudraw_sink_template)); /* Set metadata describing the element */ gst_element_class_set_details_simple (gstelement_class, "MenuDraw plugin", "MenuDraw Plugin", "for IView Menu Drawing", "KIGIS" "@ "); } static void gst_menudraw_init (GstMenuDraw* menudraw) { GstBaseTransform *btrans = GST_BASE_TRANSFORM (menudraw); g_print("Start menudraw init\n"); /* We will not be generating a new buffer. Just adding / updating * metadata. */ gst_base_transform_set_in_place (GST_BASE_TRANSFORM (btrans), FALSE); /* We do not want to change the input caps. Set to passthrough. transform_ip * is still called. */ gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (btrans), FALSE); /* Initialize all property variables to default values */ menudraw->unique_id = DEFAULT_UNIQUE_ID; menudraw->processing_width = DEFAULT_PROCESSING_WIDTH; menudraw->processing_height = DEFAULT_PROCESSING_HEIGHT; menudraw->process_full_frame = DEFAULT_PROCESS_FULL_FRAME; menudraw->page_num = DEFAULT_PAGE_NUM; menudraw->cursor_pos = DEFAULT_CURSOR_POS; menudraw->gpu_id = DEFAULT_GPU_ID; /* This quark is required to identify NvDsMeta when iterating through * the buffer metadatas */ if (!_dsmeta_quark) _dsmeta_quark = g_quark_from_static_string (NVDS_META_STRING); g_print("try to read the image\n"); if(load_test_img()==FALSE) { g_print("Failed To Load Test Image\n"); }else g_print("Successed To Load Test Image\n"); Process_Draw_Update_Func[0] = Process_Update_Menu_Main; Process_Draw_Update_Func[1] = Process_Update_Menu_Screen; Process_Draw_Update_Func[2] = Process_Update_Menu_Alarm; Process_Draw_Update_Func[3] = Process_Update_Menu_Camera_Flip; Process_Draw_Update_Func[4] = Process_Update_Menu_Camera_Layout; Process_Draw_Update_Func[5] = Process_Update_Menu_Camera_DetectLocation; Process_Draw_Update_Func[6] = Process_Update_Menu_Camera_Initialize; Process_Draw_Update_Func[7] = Process_Update_Menu_Time; Process_Draw_Update_Func[8] = Process_Update_Menu_Version; } /* Function called when a property of the element is set. Standard boilerplate. */ static void gst_menudraw_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstMenuDraw *menudraw = GST_MENUDRAW (object); switch (prop_id) { case PROP_UNIQUE_ID: g_print("set uid\n"); menudraw->unique_id = g_value_get_uint (value); break; case PROP_PROCESSING_WIDTH: g_print("set pw\n"); menudraw->processing_width = g_value_get_int (value); break; case PROP_PROCESSING_HEIGHT: g_print("set ph\n"); menudraw->processing_height = g_value_get_int (value); break; case PROP_PROCESS_FULL_FRAME: g_print("set ff\n"); menudraw->process_full_frame = g_value_get_boolean (value); break; case PROP_GPU_DEVICE_ID: g_print("set gid\n"); menudraw->gpu_id = g_value_get_uint (value); break; case PROP_PAGE_NUM: g_print("set pn\n"); menudraw->page_num = g_value_get_int (value); break; case PROP_CURSOR_POS: g_print("set cp\n"); menudraw->cursor_pos = g_value_get_int (value); break; case PROP_COMMAND: g_print("set cm\n"); menudraw->command_btn = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* Function called when a property of the element is requested. Standard * boilerplate. */ static void gst_menudraw_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstMenuDraw *menudraw = GST_MENUDRAW (object); switch (prop_id) { case PROP_UNIQUE_ID: g_value_set_uint (value, menudraw->unique_id); break; case PROP_PROCESSING_WIDTH: g_value_set_int (value, menudraw->processing_width); break; case PROP_PROCESSING_HEIGHT: g_value_set_int (value, menudraw->processing_height); break; case PROP_PROCESS_FULL_FRAME: g_value_set_boolean (value, menudraw->process_full_frame); break; case PROP_GPU_DEVICE_ID: g_value_set_uint (value, menudraw->gpu_id); break; case PROP_PAGE_NUM: g_value_set_int (value, menudraw->page_num); break; case PROP_CURSOR_POS: g_value_set_int (value, menudraw->cursor_pos); break; case PROP_COMMAND: g_value_set_int (value, menudraw->command_btn); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /** * Initialize all resources and start the output thread */ static gboolean gst_menudraw_start (GstBaseTransform * btrans) { GstMenuDraw * menudraw = GST_MENUDRAW (btrans); NvBufSurfaceCreateParams create_params; MenuDrawInitParams init_params = { menudraw->processing_width, menudraw->processing_height, menudraw->process_full_frame }; GstQuery *queryparams = NULL; guint batch_size = 1; /* Algorithm specific initializations and resource allocation. */ menudraw->menudrawlib_ctx = MenuDrawCtxInit (&init_params); GST_DEBUG_OBJECT (menudraw, "ctx lib %p \n", menudraw->menudrawlib_ctx); CHECK_CUDA_STATUS (cudaSetDevice (menudraw->gpu_id), "Unable to set cuda device"); menudraw->batch_size = 1; queryparams = gst_nvquery_batch_size_new (); if (gst_pad_peer_query (GST_BASE_TRANSFORM_SINK_PAD (btrans), queryparams) || gst_pad_peer_query (GST_BASE_TRANSFORM_SRC_PAD (btrans), queryparams)) { if (gst_nvquery_batch_size_parse (queryparams, &batch_size)) { g_print("parsed batch size = %u\n",batch_size); menudraw->batch_size = batch_size; } } GST_DEBUG_OBJECT (menudraw, "Setting batch-size %d \n", menudraw->batch_size); gst_query_unref (queryparams); CHECK_CUDA_STATUS (cudaStreamCreate (&menudraw->cuda_stream), "Could not create cuda stream"); if (menudraw->inter_buf) NvBufSurfaceDestroy (menudraw->inter_buf); menudraw->inter_buf = NULL; g_print("parsed process w%u,h%d\n",menudraw->processing_width, menudraw->processing_height); g_print("parsed page-num %d, parsed cursorpos %d\n",menudraw->page_num, menudraw->cursor_pos); /* An intermediate buffer for NV12/RGBA to BGR conversion will be * required. Can be skipped if custom algorithm can work directly on NV12/RGBA. */ create_params.gpuId = menudraw->gpu_id; create_params.width = menudraw->processing_width; create_params.height = menudraw->processing_height; create_params.size = 0; create_params.colorFormat = NVBUF_COLOR_FORMAT_RGBA; create_params.layout = NVBUF_LAYOUT_PITCH; #ifdef __aarch64__ create_params.memType = NVBUF_MEM_DEFAULT; g_print("set surface memtype nvbuf_mem_dafault\n"); #else create_params.memType = NVBUF_MEM_CUDA_UNIFIED; #endif //Make GST Buffer if (NvBufSurfaceCreate (&(menudraw->inter_buf), 1, &create_params) != 0) { GST_ERROR ("Error: Could not allocate internal buffer for menudraw"); goto error; } // Create host memory for storing converted/scaled interleaved RGB data CHECK_CUDA_STATUS (cudaMallocHost (&menudraw->host_rgb_buf, menudraw->processing_width * menudraw->processing_height * RGBA_BYTES_PER_PIXEL), "Could not allocate cuda host buffer"); GST_DEBUG_OBJECT (menudraw, "allocated cuda buffer %p \n", menudraw->host_rgb_buf); // CV Mat containing interleaved RGB data. This call does not allocate memory. // It uses host_rgb_buf as data. menudraw->cvmat = new cv::Mat (menudraw->processing_height, menudraw->processing_width, CV_8UC3, menudraw->host_rgb_buf, menudraw->processing_width * RGBA_BYTES_PER_PIXEL); if (!menudraw->cvmat) goto error; GST_DEBUG_OBJECT (menudraw, "created CV Mat\n"); return TRUE; error: if (menudraw->host_rgb_buf) { cudaFreeHost (menudraw->host_rgb_buf); menudraw->host_rgb_buf = NULL; } if (menudraw->cuda_stream) { cudaStreamDestroy (menudraw->cuda_stream); menudraw->cuda_stream = NULL; } if (menudraw->menudrawlib_ctx) MenuDrawCtxDeinit (menudraw->menudrawlib_ctx); return FALSE; } /** * Stop the output thread and free up all the resources */ static gboolean gst_menudraw_stop (GstBaseTransform * btrans) { GstMenuDraw *menudraw = GST_MENUDRAW (btrans); if (menudraw->inter_buf) NvBufSurfaceDestroy(menudraw->inter_buf); menudraw->inter_buf = NULL; if (menudraw->cuda_stream) cudaStreamDestroy (menudraw->cuda_stream); menudraw->cuda_stream = NULL; delete menudraw->cvmat; menudraw->cvmat = NULL; if (menudraw->host_rgb_buf) { cudaFreeHost (menudraw->host_rgb_buf); menudraw->host_rgb_buf = NULL; } GST_DEBUG_OBJECT (menudraw, "deleted CV Mat \n"); // Deinit the algorithm library MenuDrawCtxDeinit (menudraw->menudrawlib_ctx); menudraw->menudrawlib_ctx = NULL; GST_DEBUG_OBJECT (menudraw, "ctx lib released \n"); return TRUE; } /** * Called when source / sink pad capabilities have been negotiated. */ static gboolean gst_menudraw_set_caps (GstBaseTransform * btrans, GstCaps * incaps, GstCaps * outcaps) { GstMenuDraw *menudraw = GST_MENUDRAW (btrans); /* Save the input video information, since this will be required later. */ gst_video_info_from_caps (&menudraw->video_info, incaps); CHECK_CUDA_STATUS (cudaSetDevice (menudraw->gpu_id), "Unable to set cuda device"); return TRUE; error: return FALSE; } /** * Scale the entire frame to the processing resolution maintaining aspect ratio. * Or crop and scale objects to the processing resolution maintaining the aspect * ratio. Remove the padding required by hardware and convert from RGBA to RGB * using openCV. These steps can be skipped if the algorithm can work with * padded data and/or can work with RGBA. */ static GstFlowReturn get_converted_mat (GstMenuDraw * menudraw, NvBufSurface *input_buf, gint idx, NvOSD_RectParams * crop_rect_params, gdouble & ratio, gint input_width, gint input_height) { cv::Mat in_mat; ; if (NvBufSurfaceMap (input_buf, 0, 0, NVBUF_MAP_READ_WRITE) != 0){ return GST_FLOW_ERROR; } NvBufSurfaceSyncForCpu (input_buf, 0, 0); in_mat = cv::Mat (input_buf->surfaceList[idx].planeParams.height[0],input_buf->surfaceList[idx].planeParams.width[0], CV_8UC4, input_buf->surfaceList[idx].mappedAddr.addr[0], input_buf->surfaceList[idx].planeParams.pitch[0]); //g_print("mat pitch %u\n",input_buf->surfaceList[idx].planeParams.pitch[0]); //g_print("src w %u h %u\n",in_mat.cols, in_mat.rows); //g_print("img_titlebar w %u h %u\n",img_titlebar.cols, img_titlebar.rows); //g_print("imageROI w %u h %u\n",imageROI.cols, imageROI.rows); NvBufSurfaceSyncForDevice (input_buf, 0, 0); if (NvBufSurfaceUnMap (input_buf, 0, 0)){ goto error; } return GST_FLOW_OK; error: g_print("Convert Error"); return GST_FLOW_ERROR; } static GstFlowReturn gst_menudraw_prepare_output_buffer(GstBaseTransform * btrans, GstBuffer * inbuf, GstBuffer ** outbuf) { GstMenuDraw *menudraw = GST_MENUDRAW (btrans); GstFlowReturn flow_ret = GST_FLOW_ERROR; GstMapInfo out_map_info; DrawParam DrawParam; NvBufSurface *outsurface = NULL; NvBufSurfaceCreateParams create_params; NvDsBatchMeta *batch_meta = NULL; NvDsFrameMeta *frame_meta = NULL; NvDsMeta *meta = NULL; //g_print ("Prepare start\n"); //*outbuf = inbuf; //return GST_FLOW_OK; if (menudraw->inter_buf) NvBufSurfaceDestroy (menudraw->inter_buf); menudraw->inter_buf = NULL; /* An intermediate buffer for NV12/RGBA to BGR conversion will be * required. Can be skipped if custom algorithm can work directly on NV12/RGBA. */ create_params.gpuId = menudraw->gpu_id; create_params.width = menudraw->processing_width; create_params.height = menudraw->processing_height; create_params.size = 0; create_params.colorFormat = NVBUF_COLOR_FORMAT_RGBA; create_params.layout = NVBUF_LAYOUT_PITCH; #ifdef __aarch64__ create_params.memType = NVBUF_MEM_DEFAULT; //g_print("set surface memtype nvbuf_mem_dafault\n"); #else create_params.memType = NVBUF_MEM_CUDA_UNIFIED; #endif //Make GST Buffer if (NvBufSurfaceCreate (&(menudraw->inter_buf), 1, &create_params) != 0) { GST_ERROR ("Error: Could not allocate internal buffer for menudraw"); goto error; } menudraw->inter_buf->numFilled = 1; *outbuf = NULL; *outbuf = gst_buffer_new_wrapped_full (GST_MEMORY_FLAG_ZERO_PREFIXED, menudraw->inter_buf, sizeof(NvBufSurface), 0, sizeof(NvBufSurface), NULL, NULL); //g_print("m1\n"); batch_meta = nvds_create_batch_meta(1); //g_print("m2\n"); meta = gst_buffer_add_nvds_meta (*outbuf , batch_meta, NULL, copy_user_meta, release_user_meta); //g_print("m3\n"); meta->meta_type = NVDS_BATCH_GST_META; batch_meta->base_meta.batch_meta = batch_meta; batch_meta->base_meta.copy_func = copy_user_meta; batch_meta->base_meta.release_func = release_user_meta; batch_meta->max_frames_in_batch = 1; frame_meta = nvds_acquire_frame_meta_from_pool(batch_meta); //g_print("m4\n"); nvds_add_frame_meta_to_batch(batch_meta, frame_meta); //g_print("m5\n"); // Some important parameters to fill frame_meta->pad_index = 0; frame_meta->source_id = 0; frame_meta->buf_pts = 0; frame_meta->ntp_timestamp = 0; frame_meta->frame_num = 0; frame_meta->batch_id = 0; frame_meta->source_frame_width = 1024; frame_meta->source_frame_height = 600; frame_meta->num_surfaces_per_frame = 1 ; CHECK_CUDA_STATUS (cudaSetDevice (menudraw->gpu_id), "Unable to set cuda device"); memset (&out_map_info, 0, sizeof (out_map_info)); if (!gst_buffer_map (*outbuf, &out_map_info, GST_MAP_READWRITE)) { g_print ("Error: Failed to out map gst buffer\n"); goto error; } outsurface = (NvBufSurface *) out_map_info.data; GST_DEBUG_OBJECT (menudraw,"Processing Frame Surface %p\n",outsurface); if (CHECK_NVDS_MEMORY_AND_GPUID (menudraw, outsurface)) { g_print ("Error: Check NVDS Memory And Gpu id\n"); goto error; } //NvBufSurfaceMemSet(outsurface, 0, 0, 0); /*g_print("debug surface batchsize %u\n", outsurface->batchSize); g_print("debug surface numfilled %u\n", outsurface->numFilled); g_print("debug surface gpuid %u\n", outsurface->gpuId); g_print("debug surface0 num planes %u\n", outsurface->surfaceList[0].planeParams.num_planes); g_print("debug surface0 width %u\n", outsurface->surfaceList[0].planeParams.width[0]); g_print("debug surface0 height %u\n", outsurface->surfaceList[0].planeParams.height[0]); g_print("debug surface0 pitch %u\n", outsurface->surfaceList[0].planeParams.pitch[0]); g_print("debug surface0 offset %u\n", outsurface->surfaceList[0].planeParams.offset[0]); g_print("debug surface0 psize %u\n", outsurface->surfaceList[0].planeParams.psize[0]); g_print("debug surface0 mapaddr %u\n", outsurface->surfaceList[0].mappedAddr.addr[0]); g_print("debug surface0 bytesPerPix %u\n", outsurface->surfaceList[0].planeParams.bytesPerPix[0]); */ if (NvBufSurfaceMap (outsurface, 0, 0, NVBUF_MAP_READ_WRITE) != 0){ g_print("Draw surface map Error\n"); return GST_FLOW_ERROR; } NvBufSurfaceSyncForCpu (outsurface, 0,0); DrawParam = Process_Draw_Update_Func[menudraw->page_num](menudraw, inbuf); Process_Draw_Menu(outsurface, &DrawParam ); NvBufSurfaceSyncForDevice (outsurface, 0,0); if (NvBufSurfaceUnMap (outsurface, 0,0)){ g_print("Draw surface unmap Error\n"); goto error; } //g_print ("Prepare OK\n"); flow_ret = GST_FLOW_OK; error: gst_buffer_unmap (*outbuf, &out_map_info); return flow_ret; } static GstFlowReturn gst_menudraw_transform (GstBaseTransform * btrans, GstBuffer * inbuf, GstBuffer * outbuf) { GstMenuDraw *menudraw = GST_MENUDRAW (btrans); GstFlowReturn flow_ret = GST_FLOW_ERROR; flow_ret = GST_FLOW_OK; //g_print ("TransForm OK\n"); error: return flow_ret; } /** * Called when element recieves an input buffer from upstream element. */ static GstFlowReturn gst_menudraw_transform_ip (GstBaseTransform * btrans, GstBuffer * inbuf) { GstMenuDraw *menudraw = GST_MENUDRAW (btrans); GstMapInfo in_map_info; GstFlowReturn flow_ret = GST_FLOW_ERROR; gdouble scale_ratio = 1.0; NvBufSurface *surface = NULL; NvDsBatchMeta *batch_meta = NULL; NvDsFrameMeta *frame_meta = NULL; NvDsMetaList * l_frame = NULL; NvBufSurfaceCreateParams create_params; DrawParam DrawParam; //int nn = 0; guint i = 0; //g_print("Transform Start\n"); menudraw->frame_num++; // batch_meta = gst_buffer_get_nvds_batch_meta (inbuf); // if (batch_meta == nullptr) { // GST_ELEMENT_ERROR (menudraw, STREAM, FAILED, // ("NvDsBatchMeta not found for input buffer."), (NULL)); // return GST_FLOW_ERROR; // } ////Process_Draw_Menu(menudraw); ////flag = !flag; // if (menudraw->process_full_frame ) { // for (l_frame = batch_meta->frame_meta_list; l_frame != NULL; // l_frame = l_frame->next) // { // frame_meta = (NvDsFrameMeta *) (l_frame->data); // NvOSD_RectParams rect_params; ////Scale the entire frame to processing resolution // rect_params.left = 0; // rect_params.top = 0; // rect_params.width = menudraw->video_info.width; // rect_params.height = menudraw->video_info.height; // g_print("Frame - %u Padidx %d batchID %u source%u bufpts %u \n",menudraw->frame_num, frame_meta->pad_index, frame_meta->batch_id, frame_meta->source_id, frame_meta->buf_pts); ////g_print("Frame - %u Padidx %d batchID %u\n",menudraw->frame_num, frame_meta->pad_index, frame_meta->batch_id); // if(frame_meta->source_id == 0) // { if (get_converted_mat (menudraw, surface, frame_meta->source_id, &rect_params, // scale_ratio, menudraw->video_info.width, // menudraw->video_info.height) != GST_FLOW_OK) { // goto error; // } // } // i++; // } // } flow_ret = GST_FLOW_OK; g_print("TransformIP OK\n"); error: //gst_buffer_unmap (inbuf, &in_map_info); return flow_ret; } /** * Boiler plate for registering a plugin and an element. */ static gboolean menudraw_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_menudraw_debug, "menudraw", 0, "menudraw plugin"); return gst_element_register (plugin, "menudraw", GST_RANK_PRIMARY, GST_TYPE_MENUDRAW); } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, nvdsgst_menudraw, DESCRIPTION, menudraw_plugin_init, VERSION, LICENSE, BINARY_PACKAGE, URL) ///////////YIH CUSTOM////////////// static gboolean load_test_img() { gboolean ret = TRUE; Image_Arr[1] = cv::imread(PATH_MENU_TITLEBAR, cv::IMREAD_UNCHANGED); Image_Arr[2] = cv::imread(PATH_MENU_ICON_TITLE_MENU, cv::IMREAD_UNCHANGED); Image_Arr[3] = cv::imread(PATH_MENU_ICON_TITLE_SCREEN, cv::IMREAD_UNCHANGED); Image_Arr[4] = cv::imread(PATH_MENU_ICON_TITLE_CAMERA, cv::IMREAD_UNCHANGED); Image_Arr[5] = cv::imread(PATH_MENU_ICON_TITLE_SOUND, cv::IMREAD_UNCHANGED); Image_Arr[6] = cv::imread(PATH_MENU_ICON_TITLE_TIME, cv::IMREAD_UNCHANGED); Image_Arr[7] = cv::imread(PATH_MENU_ICON_TITLE_VERSION, cv::IMREAD_UNCHANGED); Image_Arr[8] = cv::imread(PATH_MENU_ICON_TITLE_EXIT, cv::IMREAD_UNCHANGED); Image_Arr[9] = cv::imread(PATH_MENU_CAMERA_FLIP_CAM1_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[10] = cv::imread(PATH_MENU_CAMERA_FLIP_CAM1_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[11] = cv::imread(PATH_MENU_CAMERA_FLIP_CAM2_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[12] = cv::imread(PATH_MENU_CAMERA_FLIP_CAM2_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[13] = cv::imread(PATH_MENU_CAMERA_FLIP_VERTICAL_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[14] = cv::imread(PATH_MENU_CAMERA_FLIP_VERTICAL_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[15] = cv::imread(PATH_MENU_CAMERA_FLIP_HORIZONTAL_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[16] = cv::imread(PATH_MENU_CAMERA_FLIP_HORIZONTAL_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[17] = cv::imread(PATH_MENU_CAMERA_LAYOUT_FULLSCREEN_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[18] = cv::imread(PATH_MENU_CAMERA_LAYOUT_FULLSCREEN_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[19] = cv::imread(PATH_MENU_CAMERA_LAYOUT_FULLSCREEN_FOCUS, cv::IMREAD_UNCHANGED); Image_Arr[20] = cv::imread(PATH_MENU_CAMERA_LAYOUT_PIP_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[21] = cv::imread(PATH_MENU_CAMERA_LAYOUT_PIP_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[22] = cv::imread(PATH_MENU_CAMERA_LAYOUT_PIP_FOCUS, cv::IMREAD_UNCHANGED); Image_Arr[23] = cv::imread(PATH_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[24] = cv::imread(PATH_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[25] = cv::imread(PATH_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_FOCUS, cv::IMREAD_UNCHANGED); Image_Arr[26] = cv::imread(PATH_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[27] = cv::imread(PATH_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[28] = cv::imread(PATH_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_FOCUS, cv::IMREAD_UNCHANGED); Image_Arr[29] = cv::imread(PATH_MENU_CAMERA_DETECTLOCATION_LOW, cv::IMREAD_UNCHANGED); Image_Arr[30] = cv::imread(PATH_MENU_CAMERA_DETECTLOCATION_MID, cv::IMREAD_UNCHANGED); Image_Arr[31] = cv::imread(PATH_MENU_CAMERA_DETECTLOCATION_FULL, cv::IMREAD_UNCHANGED); Image_Arr[32] = cv::imread(PATH_MENU_ICON_CAMERA_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[33] = cv::imread(PATH_MENU_ICON_CAMERA_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[34] = cv::imread(PATH_MENU_ICON_SAVE, cv::IMREAD_UNCHANGED); Image_Arr[35] = cv::imread(PATH_MENU_ICON_SCREEN_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[36] = cv::imread(PATH_MENU_ICON_SCREEN_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[37] = cv::imread(PATH_MENU_ICON_SOUND_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[38] = cv::imread(PATH_MENU_ICON_SOUND_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[39] = cv::imread(PATH_MENU_ICON_TIME_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[40] = cv::imread(PATH_MENU_ICON_TIME_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[41] = cv::imread(PATH_MENU_ICON_VERSION_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[42] = cv::imread(PATH_MENU_ICON_VERSION_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[43] = cv::imread(PATH_MENU_ICON_LOGO_LOADING_FRAME1, cv::IMREAD_UNCHANGED); Image_Arr[44] = cv::imread(PATH_MENU_ICON_LOGO_LOADING_FRAME2, cv::IMREAD_UNCHANGED); Image_Arr[45] = cv::imread(PATH_MENU_ICON_LOGO_LOADING_FRAME3, cv::IMREAD_UNCHANGED); Image_Arr[46] = cv::imread(PATH_MENU_ICON_LOGO_LOADING_FRAME4, cv::IMREAD_UNCHANGED); Image_Arr[47] = cv::imread(PATH_MENU_ICON_NEXT, cv::IMREAD_UNCHANGED); Image_Arr[48] = cv::imread(PATH_MENU_ICON_PREV_DOWN, cv::IMREAD_UNCHANGED); Image_Arr[49] = cv::imread(PATH_MENU_ICON_PREV_NORMAL, cv::IMREAD_UNCHANGED); Image_Arr[50] = cv::imread(PATH_MENU_LOGO_KIGIS, cv::IMREAD_UNCHANGED); Image_Arr[51] = cv::imread(PATH_MENU_LINE_TITLE, cv::IMREAD_UNCHANGED); Image_Arr[52] = cv::imread(PATH_MENU_LINE_MENULIST, cv::IMREAD_UNCHANGED); Image_Arr[53] = cv::imread(PATH_MENU_BG_MENUMAIN, cv::IMREAD_UNCHANGED); Image_Arr[54] = cv::imread(PATH_MENU_BG_MENUSUB, cv::IMREAD_UNCHANGED); Image_Arr[55] = cv::imread(PATH_MENU_BTN_MENULIST, cv::IMREAD_UNCHANGED); //Box, line, BackGround Image_Arr[56] = cv::imread(PATH_MENU_BOX_TITLE_MINIBOX, cv::IMREAD_UNCHANGED); Image_Arr[57] = cv::imread(PATH_MENU_BOX_POPUP , cv::IMREAD_UNCHANGED); Image_Arr[58] = cv::imread(PATH_MENU_BOX_MENU_SUBLIST_BACK_DOWN , cv::IMREAD_UNCHANGED); Image_Arr[59] = cv::imread(PATH_MENU_BOX_MENU_SUBLIST_BACK_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[60] = cv::imread(PATH_MENU_BOX_SCREEN_AND_ALARM_DOWN , cv::IMREAD_UNCHANGED); Image_Arr[61] = cv::imread(PATH_MENU_BOX_SCREEN_AND_ALARM_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[62] = cv::imread(PATH_MENU_BOX_CAMERA_LAYOUT_DOWN , cv::IMREAD_UNCHANGED); Image_Arr[63] = cv::imread(PATH_MENU_BOX_CAMERA_LAYOUT_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[64] = cv::imread(PATH_MENU_BOX_CAMERA_DETECTIONRECT_DOWN , cv::IMREAD_UNCHANGED); Image_Arr[65] = cv::imread(PATH_MENU_BOX_CAMERA_DETECTIONRECT_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[66] = cv::imread(PATH_MENU_BOX_TIME_DOWN , cv::IMREAD_UNCHANGED); Image_Arr[67] = cv::imread(PATH_MENU_BOX_TIME_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[68] = cv::imread(PATH_MENU_BOX_OKCANCEL_DOWN , cv::IMREAD_UNCHANGED); Image_Arr[69] = cv::imread(PATH_MENU_BOX_OKCANCEL_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[70] = cv::imread(PATH_MENU_RADIO_ON , cv::IMREAD_UNCHANGED); Image_Arr[71] = cv::imread(PATH_MENU_RADIO_NORMAL , cv::IMREAD_UNCHANGED); Image_Arr[72] = cv::imread(PATH_MENU_RADIO_OFF , cv::IMREAD_UNCHANGED); Image_Arr[73] = cv::imread(PATH_MENU_VOLUME_LEVEL_FIVE_ON , cv::IMREAD_UNCHANGED); Image_Arr[74] = cv::imread(PATH_MENU_VOLUME_LEVEL_FIVE_OFF , cv::IMREAD_UNCHANGED); Image_Arr[75] = cv::imread(PATH_MENU_VOLUME_LEVEL_TEN_ON , cv::IMREAD_UNCHANGED); Image_Arr[76] = cv::imread(PATH_MENU_VOLUME_LEVEL_TEN_OFF , cv::IMREAD_UNCHANGED); //////BG Image_Arr[150] = cv::Mat (600, 1024, CV_8UC4, cv::Scalar(0x3C,0x3C,0x3C,0xFF)); //Gray BackGround; Image_Arr[151] = cv::Mat (600, 1024, CV_8UC4, cv::Scalar(0x1E,0x1E,0x1E,0xFF)); //Black BackGround; Image_Arr[200] = cv::Mat (508, 392, CV_8UC4, cv::Scalar(0x3C,0x3C,0x3C,0xFF)); //Main Menu Main BackGround; Image_Arr[201] = cv::Mat (508, 512, CV_8UC4, cv::Scalar(0x1E,0x1E,0x1E,0xFF)); //Main Menu Sub BackGround; Image_Arr[202] = cv::Mat (508, 904, CV_8UC4, cv::Scalar(0x00,0x00,0xFF,0xFF)); //Camera_FLIP CAMERA RECT BackGround; Image_Arr[203] = cv::Mat (508, 120, CV_8UC4, cv::Scalar(0x1E,0x1E,0x1E,0xFF)); //Camera_FLIP SETTING RECT BackGround; //////Line Image_Arr[250] = cv::Mat (2, 1024, CV_8UC4, cv::Scalar(0x5A,0x5A,0x5A,0xFF));//Menu Title Line Image_Arr[251] = cv::Mat (2, 344, CV_8UC4, cv::Scalar(0x5A,0x5A,0x5A,0xFF));//Menu Main List Line Image_Arr[252] = cv::Mat (2, 464, CV_8UC4, cv::Scalar(0x3C,0x3C,0x3C,0xFF));//Menu Sub List Line Image_Arr[253] = cv::Mat (166, 2, CV_8UC4, cv::Scalar(0x3C,0x3C,0x3C,0xFF));//Detect Location Roundbox Vertical line Image_Arr[254] = cv::Mat (2, 252, CV_8UC4, cv::Scalar(0x3C,0x3C,0x3C,0xFF));//Screen Roundbox Horizontal line //Change Image Format (only Loaded Png Files) for(int i = 1 ; i<= 76 ; i++) { if(Image_Arr[i].empty()) { g_print("failed to read the Image %d\n",i); ret = FALSE; } else { cv::cvtColor (Image_Arr[i], Image_Arr[i], cv::COLOR_RGBA2BGRA ); } } return ret; } void FillRoundedRectangle(cv::Mat& src, cv::Point topLeft, cv::Size rectSz, const cv::Scalar lineColor, const cv::Scalar fillColor, const int thickness, const int lineType, const float cornerCurvatureRatio) { // corners: // p1 - p2 // | | // p4 - p3 // cv::Point p1 = topLeft; cv::Point p2 = cv::Point (p1.x + rectSz.width, p1.y); cv::Point p3 = cv::Point (p1.x + rectSz.width, p1.y + rectSz.height); cv::Point p4 = cv::Point (p1.x, p1.y + rectSz.height); float cornerRadius = rectSz.height*cornerCurvatureRatio; // draw straight lines cv::line(src, cv::Point (p1.x + cornerRadius, p1.y), cv::Point (p2.x - cornerRadius, p2.y), lineColor, thickness, lineType); cv::line(src, cv::Point (p2.x, p2.y + cornerRadius), cv::Point (p3.x, p3.y - cornerRadius), lineColor, thickness, lineType); cv::line(src, cv::Point (p4.x + cornerRadius, p4.y), cv::Point (p3.x - cornerRadius, p3.y), lineColor, thickness, lineType); cv::line(src, cv::Point (p1.x, p1.y + cornerRadius), cv::Point (p4.x, p4.y - cornerRadius), lineColor, thickness, lineType); // draw arcs cv::Size rad = cv::Size(cornerRadius, cornerRadius); cv::ellipse(src, p1 + cv::Point(cornerRadius, cornerRadius), rad, 180.0, 0, 90, lineColor, thickness, lineType); cv::ellipse(src, p2 + cv::Point(-cornerRadius, cornerRadius), rad, 270.0, 0, 90, lineColor, thickness, lineType); cv::ellipse(src, p3 + cv::Point(-cornerRadius, -cornerRadius), rad, 0.0, 0, 90, lineColor, thickness, lineType); cv::ellipse(src, p4 + cv::Point(cornerRadius, -cornerRadius), rad, 90.0, 0, 90, lineColor, thickness, lineType); //cv::Point fillFrom(topLeft.x, topLeft.y); // You may want to use `lineColor` instead of `fillColor` //cv::floodFill(src, fillFrom, fillColor); } static gboolean AddText(DrawParam *drawparam, std::string text, cv::Scalar color, int x, int y ) { drawparam->textparams.vec_text.push_back(text); drawparam->textparams.vec_point.push_back(cv::Point(x, y+30)); drawparam->textparams.vec_color.push_back(color); drawparam->text_num += 1; return true; } static gboolean AddImage(DrawParam *drawparam, cv::Mat *mat, int x, int y) { return AddImage(drawparam, mat, x, y, FALSE); } static gboolean AddImage(DrawParam *drawparam, cv::Mat *mat, int x, int y, gboolean isalpha) { drawparam->imageparams.vec_image.push_back(mat); drawparam->imageparams.vec_rect.push_back(cv::Rect(x, y, mat->cols, mat->rows)); drawparam->imageparams.isalpha = isalpha; drawparam->image_num += 1; return true; } static GstFlowReturn Process_Draw_Menu(NvBufSurface *surface, DrawParam *drawparam) { cv::Mat screen; cv::Mat roi; cv::Mat mask; GstFlowReturn flow_ret = GST_FLOW_ERROR; //g_print("Draw Start image count = %d\n",drawparam->image_num); //Todo Draw Process; screen = cv::Mat (surface->surfaceList[0].planeParams.height[0],surface->surfaceList[0].planeParams.width[0], CV_8UC4, surface->surfaceList[0].mappedAddr.addr[0], surface->surfaceList[0].planeParams.pitch[0]); g_print("mat make ok\n"); screen.setTo(cv::Scalar(90,90,90,255)); g_print("mat set background ok\n"); std::vector::iterator itr_mat; std::vector::iterator itr_Rect; for(int i = 0 ; i< drawparam->image_num; i++) { itr_mat = drawparam->imageparams.vec_image.begin() + i; itr_Rect = drawparam->imageparams.vec_rect.begin() + i; //g_print("mat size %u, %u\n ",itr_mat->cols, itr_mat->rows); //g_print("roi rect %u, %u, %u, %u\n ",itr_Rect->x, itr_Rect->y, itr_Rect->width, itr_Rect->height); roi = screen(*itr_Rect); cv::cvtColor(**itr_mat,mask,cv::COLOR_BGRA2GRAY); cv::threshold(mask, mask, 1, 255, cv::THRESH_BINARY ); //cv::cvtColor (*itr_mat, roi, cv::COLOR_RGBA2BGRA); (*itr_mat)->copyTo(roi,mask); } std::vector::iterator itr_text; std::vector::iterator itr_point; std::vector::iterator itr_color; //g_print("Draw Start text count = %d\n",drawparam->text_num); for(int i = 0 ; i< drawparam->text_num; i++) { itr_text = drawparam->textparams.vec_text.begin() + i; itr_point = drawparam->textparams.vec_point.begin() + i; itr_color = drawparam->textparams.vec_color.begin() + i; //g_print("string %s\n",(*itr_text).c_str()); cv::putText(screen, (*itr_text).c_str(), *itr_point, cv::FONT_ITALIC , 1, *itr_color, 2); } flow_ret = GST_FLOW_OK; g_print("Draw Complete\n"); error: drawparam->imageparams.vec_image.clear(); drawparam->imageparams.vec_rect.clear(); drawparam->textparams.vec_text.clear(); drawparam->textparams.vec_point.clear(); drawparam->textparams.vec_color.clear(); return flow_ret; } static DrawParam Process_Update_Menu_Main(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 4) menudraw->cursor_pos =0; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =4; if(menudraw->cursor_pos_sub > 3) menudraw->cursor_pos_sub =0; if(menudraw->cursor_pos_sub < 0) menudraw->cursor_pos_sub =3; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_MENU], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); AddText(&DrawParam,"Menu",cv::Scalar(0xFF,0xFF,0xFF), 103, 26); //Menu BG AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_MENU_MAIN], 120, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_MENU_SUB], 512, 92); //Main Menu List -> Selected icon must be draws last switch(menudraw->cursor_pos) { case 0://Screen AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SOUND_NORMAL], 0, 194); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_CAMERA_NORMAL], 0, 296); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TIME_NORMAL], 0, 398); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_VERSION_NORMAL], 0 , 500); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SCREEN_DOWN], 0, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BTN_MENULIST], 120, 92); AddText(&DrawParam,"Screen",cv::Scalar(0xEF,0x7D,0x00), 150, 126); AddText(&DrawParam,"Alarm",cv::Scalar(0xFF,0xFF,0xFF), 150, 228); AddText(&DrawParam,"Camera",cv::Scalar(0xFF,0xFF,0xFF), 150, 330); AddText(&DrawParam,"Time",cv::Scalar(0xFF,0xFF,0xFF), 150, 432); AddText(&DrawParam,"Version",cv::Scalar(0xFF,0xFF,0xFF), 150, 534); break; case 1://Alarm AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SCREEN_NORMAL], 0, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_CAMERA_NORMAL], 0, 296); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TIME_NORMAL], 0, 398); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_VERSION_NORMAL], 0 , 500); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SOUND_DOWN], 0, 194); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BTN_MENULIST], 120, 194); AddText(&DrawParam,"Screen",cv::Scalar(0xFF,0xFF,0xFF), 150, 126); AddText(&DrawParam,"Alarm",cv::Scalar(0xEF,0x7D,0x00), 150, 228); AddText(&DrawParam,"Camera",cv::Scalar(0xFF,0xFF,0xFF), 150, 330); AddText(&DrawParam,"Time",cv::Scalar(0xFF,0xFF,0xFF), 150, 432); AddText(&DrawParam,"Version",cv::Scalar(0xFF,0xFF,0xFF), 150, 534); break; case 2://Camera AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SCREEN_NORMAL], 0, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SOUND_NORMAL], 0, 194); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TIME_NORMAL], 0, 398); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_VERSION_NORMAL], 0 , 500); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_CAMERA_DOWN], 0, 296); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BTN_MENULIST], 120, 296); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_NEXT], 459, 326); AddText(&DrawParam,"Screen",cv::Scalar(0xFF,0xFF,0xFF), 150, 126); AddText(&DrawParam,"Alarm",cv::Scalar(0xFF,0xFF,0xFF), 150, 228); AddText(&DrawParam,"Camera",cv::Scalar(0xEF,0x7D,0x00), 150, 330); AddText(&DrawParam,"Time",cv::Scalar(0xFF,0xFF,0xFF), 150, 432); AddText(&DrawParam,"Version",cv::Scalar(0xFF,0xFF,0xFF), 150, 534); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_MENU_SUBLIST_BACK_NORMAL], 860, 523); if(menudraw->menudepth == 1) { if(menudraw->cursor_pos_sub == 0) AddText(&DrawParam,"Screen Flip",cv::Scalar(0xEF,0x7D,0x00), 542, 126); else AddText(&DrawParam,"Screen Flip",cv::Scalar(0xFF,0xFF,0xFF), 542, 126); if(menudraw->cursor_pos_sub == 1) AddText(&DrawParam,"Layout",cv::Scalar(0xEF,0x7D,0x00), 542, 228); else AddText(&DrawParam,"Layout",cv::Scalar(0xFF,0xFF,0xFF), 542, 228); if(menudraw->cursor_pos_sub == 2) AddText(&DrawParam,"Detection Rect",cv::Scalar(0xEF,0x7D,0x00), 542, 330); else AddText(&DrawParam,"Detection Rect",cv::Scalar(0xFF,0xFF,0xFF), 542, 330); if(menudraw->cursor_pos_sub == 3) AddText(&DrawParam,"Initialize",cv::Scalar(0xEF,0x7D,0x00), 542, 432); else AddText(&DrawParam,"Initialize",cv::Scalar(0xFF,0xFF,0xFF), 542, 432); } else { AddText(&DrawParam,"Screen Flip",cv::Scalar(0xFF,0xFF,0xFF), 542, 126); AddText(&DrawParam,"Layout",cv::Scalar(0xFF,0xFF,0xFF), 542, 228); AddText(&DrawParam,"Detection Rect",cv::Scalar(0xFF,0xFF,0xFF), 542, 330); AddText(&DrawParam,"Initialize",cv::Scalar(0xFF,0xFF,0xFF), 542, 432); } break; case 3://Time AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SCREEN_NORMAL], 0, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SOUND_NORMAL], 0, 194); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_CAMERA_NORMAL], 0, 296); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_VERSION_NORMAL], 0 , 500); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TIME_DOWN], 0, 398); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BTN_MENULIST], 120, 398); AddText(&DrawParam,"Screen",cv::Scalar(0xFF,0xFF,0xFF), 150, 126); AddText(&DrawParam,"Alarm",cv::Scalar(0xFF,0xFF,0xFF), 150, 228); AddText(&DrawParam,"Camera",cv::Scalar(0xFF,0xFF,0xFF), 150, 330); AddText(&DrawParam,"Time",cv::Scalar(0xEF,0x7D,0x00), 150, 432); AddText(&DrawParam,"Version",cv::Scalar(0xFF,0xFF,0xFF), 150, 534); break; case 4://Version AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SCREEN_NORMAL], 0, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_SOUND_NORMAL], 0, 194); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_CAMERA_NORMAL], 0, 296); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TIME_NORMAL], 0, 398); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_VERSION_DOWN], 0 , 500); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BTN_MENULIST], 120 , 500); AddText(&DrawParam,"Screen",cv::Scalar(0xFF,0xFF,0xFF), 150, 126); AddText(&DrawParam,"Alarm",cv::Scalar(0xFF,0xFF,0xFF), 150, 228); AddText(&DrawParam,"Camera",cv::Scalar(0xFF,0xFF,0xFF), 150, 330); AddText(&DrawParam,"Time",cv::Scalar(0xFF,0xFF,0xFF), 150, 432); AddText(&DrawParam,"Version",cv::Scalar(0xEF,0x7D,0x00), 150, 534); break; } //Sub Menu List -> switch(menudraw->cursor_pos) { case 2: //Camera //todo using subcursorpos break; case 0: //other case 1: case 3: case 4: AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LOGO_KIGIS], 659 , 494); break; } //split line AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_MAINLIST], 144, 192); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_MAINLIST], 144, 294); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_MAINLIST], 144, 396); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_MAINLIST], 144, 498); if(menudraw->cursor_pos == 2)//camera { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_SUBLIST], 536, 192); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_SUBLIST], 536, 294); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_SUBLIST], 536, 396); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_MENU_SUBLIST], 536, 498); } switch(menudraw->command_btn) { case 3://in switch(menudraw->cursor_pos) { case 0: menudraw->page_num = 1; menudraw->cursor_pos = 0; break; case 1: menudraw->page_num = 2; menudraw->cursor_pos = 0; break; case 2://camera if(menudraw->menudepth == 0) { menudraw->menudepth = 1; menudraw->cursor_pos = 2; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 1) { if(menudraw->cursor_pos_sub == 0) { menudraw->page_num = 3; } if(menudraw->cursor_pos_sub == 1) { menudraw->page_num = 4; } if(menudraw->cursor_pos_sub == 2) { menudraw->page_num = 5; } if(menudraw->cursor_pos_sub == 3) { menudraw->page_num = 6; } menudraw->cursor_pos = 0; menudraw->cursor_pos_sub = 0; menudraw->menudepth = 0; } break; case 3: menudraw->page_num = 7; menudraw->cursor_pos = 0; break; case 4: menudraw->page_num = 8; menudraw->cursor_pos = 0; break; } break; case 4://out if(menudraw->cursor_pos == 2 && menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } break; } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Screen(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 2) menudraw->cursor_pos =2; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_SCREEN], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Box if(menudraw->cursor_pos == 0) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN], 36 , 122); AddText(&DrawParam,"Bright",cv::Scalar(0xEF,0x7D,0x00), 138, 143); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL], 36 , 122); AddText(&DrawParam,"Bright",cv::Scalar(0xFF,0xFF,0xFF), 138, 143); } if(menudraw->cursor_pos == 1) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN], 362 , 122); AddText(&DrawParam,"LED Speed",cv::Scalar(0xEF,0x7D,0x00), 430, 143); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL], 362 , 122); AddText(&DrawParam,"LED Speed",cv::Scalar(0xFF,0xFF,0xFF), 430, 143); } if(menudraw->cursor_pos == 2) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN], 688 , 122); AddText(&DrawParam,"Language",cv::Scalar(0xEF,0x7D,0x00), 770, 143); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL], 688 , 122); AddText(&DrawParam,"Language",cv::Scalar(0xFF,0xFF,0xFF), 770, 143); } switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 0; menudraw->cursor_pos = 0; menudraw->cursor_pos_sub = 0; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Alarm(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 2) menudraw->cursor_pos =2; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_SOUND], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Box if(menudraw->cursor_pos == 0) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN], 36 , 122); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL], 36 , 122); if(menudraw->cursor_pos == 1) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN], 362 , 122); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL], 362 , 122); if(menudraw->cursor_pos == 2) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_DOWN], 688 , 122); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_SCREEN_AND_ALARM_NORMAL], 688 , 122); switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 0; menudraw->cursor_pos = 1; menudraw->cursor_pos_sub = 0; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Camera_Flip(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 1) menudraw->cursor_pos =1; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_CAMERA], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Background AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_CAMERA_FLIP_CAMERA_RECT], 0, 92); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_CAMERA_FLIP_SETTING_RECT], 904, 92); //Side buttons if(menudraw->cursor_pos == 0) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_FLIP_CAM1_DOWN], 904, 92); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_FLIP_CAM1_NORMAL], 904, 92); if(menudraw->cursor_pos == 1) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_FLIP_CAM2_DOWN], 904, 172); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_FLIP_CAM2_NORMAL], 904, 172); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_FLIP_VERTICAL_DOWN], 936, 381); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_FLIP_HORIZONTAL_NORMAL], 936, 509); switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 1; menudraw->cursor_pos = 2; menudraw->cursor_pos_sub = 0; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Camera_Layout(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 1) menudraw->cursor_pos =1; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_CAMERA], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Menu BOX //Box1 Layout if(menudraw->cursor_pos ==0) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_LAYOUT_DOWN], 36 , 122); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_LAYOUT_NORMAL], 36 , 122); } AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_LAYOUT_SPLIT_HORIZONTAL_NORMAL], 322 , 204); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_LAYOUT_SPLIT_VERTICAL_NORMAL], 484 , 204); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_LAYOUT_PIP_NORMAL], 646 , 204); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_LAYOUT_PIP_NORMAL], 808 , 204); //Box2 Layout if(menudraw->cursor_pos ==1) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_LAYOUT_DOWN], 36 , 356); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_LAYOUT_NORMAL], 36 , 356); } AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_LAYOUT_FULLSCREEN_DOWN], 322 , 438); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_LAYOUT_PIP_NORMAL], 484 , 438); switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 1; menudraw->cursor_pos = 2; menudraw->cursor_pos_sub = 1; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Camera_DetectLocation(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 2) menudraw->cursor_pos =2; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_CAMERA], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Menu BOX //Box1 Layout if(menudraw->cursor_pos ==0) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_DETECTIONRECT_DOWN], 36 , 122); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_DETECTIONRECT_NORMAL], 36 , 122); } AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_DETECTLOCATION_FULL], 124 , 150); //Box2 Layout if(menudraw->cursor_pos ==1) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_DETECTIONRECT_DOWN], 36 , 278); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_DETECTIONRECT_NORMAL], 36 , 278); } AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_DETECTLOCATION_MID], 124 , 306); //Box3 Layout if(menudraw->cursor_pos ==2) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_DETECTIONRECT_DOWN], 36 , 434); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_CAMERA_DETECTIONRECT_NORMAL], 36 , 434); } AddImage(&DrawParam, &Image_Arr[INDEX_MENU_CAMERA_DETECTLOCATION_LOW], 124 , 462); switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 1; menudraw->cursor_pos = 2; menudraw->cursor_pos_sub = 2; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Camera_Initialize(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 1) menudraw->cursor_pos =1; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_CAMERA], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Menu BOX //Box1 Layout if(menudraw->cursor_pos ==0) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_DOWN], 36 , 490); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_NORMAL], 36 , 490); } //Box1 Layout if(menudraw->cursor_pos ==1) { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_DOWN], 530 , 490); } else { AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_NORMAL], 530 , 490); } switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 1; menudraw->cursor_pos = 2; menudraw->cursor_pos_sub = 3; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Time(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 4) menudraw->cursor_pos =4; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; DrawParam.image_num = 0; DrawParam.text_num = 0; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_TIME], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Box if(menudraw->cursor_pos == 0) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_DOWN], 224 , 179); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_NORMAL], 224 , 179); if(menudraw->cursor_pos == 1) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_DOWN], 454 , 179); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_NORMAL], 454 , 179); if(menudraw->cursor_pos == 2) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_DOWN], 684 , 179); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_NORMAL], 684 , 179); if(menudraw->cursor_pos == 3) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_DOWN], 224 , 300); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_NORMAL], 224 , 300); if(menudraw->cursor_pos == 4) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_DOWN], 454 , 300); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TIME_NORMAL], 454 , 300); switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 0; menudraw->cursor_pos = 3; menudraw->cursor_pos_sub = 0; } } menudraw->command_btn = 0; return DrawParam; } static DrawParam Process_Update_Menu_Version(GstMenuDraw * menudraw, GstBuffer *inputbuf) { DrawParam DrawParam; DrawParam.image_num = 0; DrawParam.text_num = 0; switch(menudraw->command_btn)//command updown { case 1://up if(menudraw->menudepth == 1) menudraw->cursor_pos_sub += 1; else menudraw->cursor_pos += 1; break; case 2://down if(menudraw->menudepth == 1) menudraw->cursor_pos_sub -= 1; else menudraw->cursor_pos -= 1; break; } if(menudraw->cursor_pos > 1) menudraw->cursor_pos =1; if(menudraw->cursor_pos < 0) menudraw->cursor_pos =0; //Main BackGround DrawParam.bgcolor = BGCOLOR_BLACK; AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BACKGROUND_FULLSCREEN_GRAY], 0, 0); //titlebar AddImage(&DrawParam, &Image_Arr[INDEX_MENU_TITLEBAR], 0 , 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_ICON_TITLE_VERSION], 0, 0); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_TITLE_MINIBOX], 848, 16); AddImage(&DrawParam, &Image_Arr[INDEX_MENU_LINE_TITLE], 0, 90); //Box if(menudraw->cursor_pos == 0) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_DOWN], 36 , 490); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_NORMAL], 36 , 490); if(menudraw->cursor_pos == 1) AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_DOWN], 540 , 490); else AddImage(&DrawParam, &Image_Arr[INDEX_MENU_BOX_OKCANCEL_NORMAL], 540 , 490); switch(menudraw->command_btn)//command in out { case 3://in break; case 4://out if(menudraw->menudepth == 1) { menudraw->menudepth= 0; menudraw->cursor_pos_sub = 0; } else if(menudraw->menudepth == 0) { menudraw->page_num = 0; menudraw->menudepth = 0; menudraw->cursor_pos = 4; menudraw->cursor_pos_sub = 0; } } menudraw->command_btn = 0; return DrawParam; } /* copy function set by user. "data" holds a pointer to NvDsBatchMeta*/ static gpointer copy_user_meta(gpointer data, gpointer user_data) { NvDsBatchMeta *src_batch_metadata = (NvDsBatchMeta*)data; NvDsBatchMeta *dst_batch_metadata = (NvDsBatchMeta*)g_malloc0(sizeof(NvDsBatchMeta)); memcpy(dst_batch_metadata, src_batch_metadata, sizeof(NvDsBatchMeta)); return (gpointer)dst_batch_metadata; } /* release function set by user. "data" holds a pointer to NvDsBatchMeta*/ static void release_user_meta(gpointer data, gpointer user_data) { NvDsBatchMeta *batch_meta = (NvDsBatchMeta *) data; if(batch_meta) { g_free(batch_meta); batch_meta = NULL; } }