From 54721f5501473f0cc234f9d350b2ad42b01d98c4 Mon Sep 17 00:00:00 2001 From: Tae-Young Chung Date: Thu, 13 Oct 2022 15:17:47 +0900 Subject: [PATCH] mv3d: update depthstream_test_suite to use vision-source [Version]: 0.23.38-0 [Issue type]: update To test with camera, replace gstreamer based codes with vision-source internal api. Note that vision-source is internal api and unavailable in TV so that some test suites aren't built in TV profile. Change-Id: Iefc285f0d19ed2c4f6dbe4fba70f6991f4244229 Signed-off-by: Tae-Young Chung --- packaging/capi-media-vision.spec | 8 +- test/testsuites/mv3d/CMakeLists.txt | 61 ++- test/testsuites/mv3d/depthstream_test_suite.cpp | 488 +++++------------------- 3 files changed, 130 insertions(+), 427 deletions(-) diff --git a/packaging/capi-media-vision.spec b/packaging/capi-media-vision.spec index 0f015d9..25c396b 100644 --- a/packaging/capi-media-vision.spec +++ b/packaging/capi-media-vision.spec @@ -1,6 +1,6 @@ Name: capi-media-vision Summary: Media Vision library for Tizen Native API -Version: 0.23.37 +Version: 0.23.38 Release: 0 Group: Multimedia/Framework License: Apache-2.0 and BSD-3-Clause @@ -47,12 +47,16 @@ BuildRequires: pkgconfig(grpc++) # 0 : disable Mediavision inference engine profiler, 1 : enable Mediavision inference engine profiler. %if "%{tizen_profile_name}" == "tv" %define enable_ml_face_recognition 0 +%define build_depth_stream_testsuite 0 %else %define enable_ml_face_recognition 1 BuildRequires: pkgconfig(training-engine-interface-common) Requires: training-engine-interface-common + +%define build_depth_stream_testsuite 1 +BuildRequires: pkgconfig(vision-source) %endif -%define build_options -DENABLE_INFERENCE_PROFILER=0 -DENABLE_ML_FACE_RECOGNITION=%{enable_ml_face_recognition} +%define build_options -DENABLE_INFERENCE_PROFILER=0 -DENABLE_ML_FACE_RECOGNITION=%{enable_ml_face_recognition} -DBUILD_DEPTH_STREAM_TESTSUITE=%{build_depth_stream_testsuite} Requires: %{name}-machine_learning Requires: inference-engine-interface-common diff --git a/test/testsuites/mv3d/CMakeLists.txt b/test/testsuites/mv3d/CMakeLists.txt index 1b27aeb..a59eb25 100644 --- a/test/testsuites/mv3d/CMakeLists.txt +++ b/test/testsuites/mv3d/CMakeLists.txt @@ -32,43 +32,37 @@ install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) ## mv_depthstream_test_sutie -pkg_check_modules(GLIB_PKG glib-2.0) +if (${BUILD_DEPTH_STREAM_TESTSUITE}) + pkg_check_modules(GLIB_PKG glib-2.0) -if (NOT GLIB_PKG_FOUND) - message(SEND_ERROR "Failed to find glib") - return() -else() - include_directories(${GLIB_PKG_INCLUDE_DIRS}) -endif() - -SET(dependents "gstreamer-1.0 gstreamer-app-1.0 gstreamer-video-1.0") + if (NOT GLIB_PKG_FOUND) + message(SEND_ERROR "Failed to find glib") + return() + else() + include_directories(${GLIB_PKG_INCLUDE_DIRS}) + endif() -INCLUDE(FindPkgConfig) -pkg_check_modules(${PROJECT_NAME} REQUIRED ${dependents}) -FOREACH(flag ${${PROJECT_NAME}_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") - SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}") -ENDFOREACH(flag) + SET(dependents "gstreamer-1.0 gstreamer-app-1.0 gstreamer-video-1.0 vision-source") -SET(CMAKE_CXX_FLAGS "-I./include -I./include/headers ${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fPIC -Wall") -SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g") + INCLUDE(FindPkgConfig) + pkg_check_modules(${PROJECT_NAME}_DEP REQUIRED ${dependents}) -add_executable(mv_depthstream_test_suite depthstream_test_suite.cpp) + add_executable(mv_depthstream_test_suite depthstream_test_suite.cpp) -target_link_libraries(mv_depthstream_test_suite ${MV_3D_LIB_NAME} - ${OpenCV_LIBS} - gstreamer-1.0 - glib-2.0 - capi-system-info - dlog - mv_image_helper - mv_video_helper - mv_testsuite_common) -if(BUILD_VISUALIZER) - target_link_libraries(mv_depthstream_test_suite mv_visualizer) -endif() - -install(TARGETS mv_depthstream_test_suite DESTINATION ${CMAKE_INSTALL_BINDIR}) + target_link_libraries(mv_depthstream_test_suite ${MV_3D_LIB_NAME} + ${${PROJECT_NAME}_DEP_LIBRARIES} + ${OpenCV_LIBS} + glib-2.0 + capi-system-info + dlog + mv_image_helper + mv_video_helper + mv_testsuite_common) + if(BUILD_VISUALIZER) + target_link_libraries(mv_depthstream_test_suite mv_visualizer) + endif() + target_include_directories(${PROJECT_NAME} PUBLIC include ${${PROJECT_NAME}_DEP_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/include) + install(TARGETS mv_depthstream_test_suite DESTINATION ${CMAKE_INSTALL_BINDIR}) ## mv_test_3d by gtest project(mv_test_3d) @@ -83,4 +77,5 @@ target_link_libraries(${TEST_3D} gtest gtest_main mv_image_helper ) -install(TARGETS ${TEST_3D} DESTINATION ${CMAKE_INSTALL_BINDIR}) \ No newline at end of file +install(TARGETS ${TEST_3D} DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif() \ No newline at end of file diff --git a/test/testsuites/mv3d/depthstream_test_suite.cpp b/test/testsuites/mv3d/depthstream_test_suite.cpp index 16a4d4e..0a29ef6 100644 --- a/test/testsuites/mv3d/depthstream_test_suite.cpp +++ b/test/testsuites/mv3d/depthstream_test_suite.cpp @@ -33,6 +33,7 @@ #include #include "mv_3d.h" #include +#include #include #include @@ -45,22 +46,22 @@ #define MAX_STRING_LENGTH 1024 #define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0])) -#define MAX_FRAMES 1800 // 30 fps * 60s -#define INTRINSIC_FILE_PATH "/usr/share/capi-media-vision/stereoCalibZedVGA.json" #ifdef MV_3D_POINTCLOUD_IS_AVAILABLE using namespace open3d; #endif +#define VISION_SOURCE_DEVICE_ID 3 + class StopWatch { public: - StopWatch() - { - start = std::chrono::steady_clock::now(); - } + StopWatch() = default; ~StopWatch() = default; + void resetTime() { + start = std::chrono::steady_clock::now(); + } std::chrono::milliseconds elapsedTime() { return std::chrono::duration_cast( @@ -73,80 +74,39 @@ private: typedef struct _appdata { - std::chrono::milliseconds diffMs; + StopWatch stopWatch; std::string dataPath; std::string intrinsicName; std::string rgbName; std::string datasetName; + std::string dispResultFile; float minDisp; float maxDisp; int fmt; -} appdata; - -static float *vertex3d = NULL; -mv_source_h mv_source3d; - -gulong handler; - -// Gstreamer -GstElement *pipeline; - -// Gstreamer - camera src -GstElement *pipecam, *source, *filter, *queue1; -GstElement *vrate, *vrfilter; -GstElement *vconv, *vcfilter, *fsink; -// Gstreamer - depth handling -GstElement *pipedepth, *appsource; -GstElement *asfilter; -GstElement *queue2; -GstElement *asvconv, *mjpegenc; -GstElement *flsink; -GstElement *fsink2; -GstElement *sink; + int imgWidth; + int imgHeight; + unsigned char *buffer; + mv_source_h mv_source; + mv_3d_h mv3d_handle; +} appdata; -typedef struct _SrcData -{ - GstElement *src; - int numFrame; -} SrcData; +static appdata app; // MediaVision mv_engine_config_h engine_config; -mv_source_h mv_source; -mv_3d_h mv3d_handle; - -/* internal functions for testsuite */ -GCond g_thread_cond; -GMutex g_thread_mutex; - -void __wait() -{ - g_mutex_lock(&g_thread_mutex); - g_print("\t[__wait] waiting... until finishing\n"); - g_cond_wait(&g_thread_cond, &g_thread_mutex); - g_print("\t[__wait] get signal from callback\n"); - g_mutex_unlock(&g_thread_mutex); -} -void __signal() -{ - g_mutex_lock(&g_thread_mutex); - g_cond_signal(&g_thread_cond); - g_print("\t[__signal] send signal to test proc\n"); - g_mutex_unlock(&g_thread_mutex); -} +static GMainLoop *loop; static bool isLive; static bool isAsync; -static double depth_scale; -static double depth_trunc; static int camWidth; static int camHeight; static int minDisp; static int maxDisp; static int display_xpos; static int display_ypos; + void int_handler(int sig) { char c; @@ -156,24 +116,9 @@ void int_handler(int sig) c = getchar(); if (c == 'y' || c == 'Y') { - g_signal_handler_disconnect(fsink, handler); - printf("delete buffer, used by visualize 3d\n"); - - gst_element_send_event(pipecam, gst_event_new_eos()); - gst_element_send_event(pipedepth, gst_event_new_eos()); - - if (vertex3d != NULL) { - delete [] vertex3d; - vertex3d = NULL; - } - - if (mv_source3d != NULL) { - mv_destroy_source(mv_source3d); - mv_source3d = NULL; - } - sleep(1); + g_main_loop_quit(loop); } else { printf("no"); signal(SIGINT, int_handler); @@ -182,280 +127,43 @@ void int_handler(int sig) getchar(); // Get new line character } -static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data) -{ - GMainLoop *loop = (GMainLoop *) data; - - switch (GST_MESSAGE_TYPE(msg)) { - case GST_MESSAGE_EOS: - printf("End of stream\n"); - g_main_loop_quit(loop); - break; - - case GST_MESSAGE_ERROR: { - gchar *debug; - GError *error; - - gst_message_parse_error(msg, &error, &debug); - g_free(debug); - - printf("Error: %s\n", error->message); - g_error_free(error); - - g_main_loop_quit(loop); - break; - } - default: - break; - } - - return TRUE; -} - -#ifdef MV_3D_POINTCLOUD_IS_AVAILABLE -void WritePointCloud(const char* data_path, - const char* color_filename, - const char* depth_filename, - unsigned int width, - unsigned int height, - const camera::PinholeCameraIntrinsic& intrinsic) -{ - geometry::Image img_color, img_depth; - - io::ReadImage(color_filename, img_color); - io::ReadImage(depth_filename, img_depth); - - utility::LogInfo("depth filename : {}", depth_filename); - utility::LogInfo("Reading RGBD image : "); - utility::LogInfo(" Color : {:d} x {:d} x {:d} ({:d} bits per channel)", - img_color.width_, img_color.height_, img_color.num_of_channels_, - img_color.bytes_per_channel_ * 8); - utility::LogInfo(" Depth : {:d} x {:d} x {:d} ({:d} bits per channel)", - img_depth.width_, img_depth.height_, img_depth.num_of_channels_, - img_depth.bytes_per_channel_ * 8); - double depth_scale = 1000.0, depth_trunc = 200.0; - bool convert_rgb_to_intensity = true; - std::shared_ptr rgbd_image = - geometry::RGBDImage::CreateFromColorAndDepth( - img_color, img_depth, depth_scale, depth_trunc, - convert_rgb_to_intensity); - - auto pcd = geometry::PointCloud::CreateFromRGBDImage(*rgbd_image, intrinsic); - std::string dataPath = std::string(data_path); - const std::string filename_ply(std::string(data_path) + std::string("/") + - dataPath.substr(dataPath.find_last_of("/\\") + 1) + - std::string(".ply")); - - if (io::WritePointCloud(filename_ply, *pcd)) { - utility::LogInfo("Successfully wrote {}", filename_ply); - } else { - utility::LogError("Failed to write {}", filename_ply); - } -} -#endif - void _depth_stereo_cb(mv_source_h source, unsigned short *depth, unsigned int width, unsigned int height, void *user_data) { -#ifdef MV_3D_POINTCLOUD_IS_AVAILABLE - double maxDepth = 2000.0; - double minDepth = 175.0; - double depthDenom = static_cast(maxDepth - minDepth); - - camera::PinholeCameraIntrinsic intrinsic; - io::ReadIJsonConvertible(INTRINSIC_FILE_PATH, intrinsic); - - vertex3d = new float[width * height * 4]; - memset(vertex3d, 0, width * height * 4); - utility::LogInfo("focal_x = {}", intrinsic.GetFocalLength().first); - utility::LogInfo("focal_y = {}", intrinsic.GetFocalLength().second); - utility::LogInfo("cx = {}", intrinsic.GetPrincipalPoint().first); - utility::LogInfo("cy = {}", intrinsic.GetPrincipalPoint().second); - - // depth (16bit) - geometry::Image img_depth; - img_depth.Prepare(width, height, 1, sizeof(unsigned short)); - uint16_t *pImg_depth_data = (unsigned short*)img_depth.data_.data(); - memcpy(pImg_depth_data, depth, width*height*sizeof(unsigned short)); - auto pcd = geometry::PointCloud::CreateFromDepthImage( - img_depth, intrinsic, - Eigen::Matrix4d::Identity(), - 1000.0, 2.0, 1, - false); - - cv::Mat colorMap = cv::Mat(cv::Size(width,height), CV_8UC1); - for (unsigned int j = 0; j < height; ++j) { - for (unsigned int i = 0; i < width; ++i) { - int idx = j * width + i; - int idxInv = width * height - idx - 1; - auto depth_raw = pcd->points_.data()[idx][2] * 1000.0; - auto depthCut = std::min(std::max(depth_raw, minDepth), maxDepth); - colorMap.at(height -j - 1, width -i - 1) = - static_cast( - (depthCut - minDepth) * 255.0 / depthDenom); - - // 175 ~ 1900 - auto inverseDepthCut = maxDepth - depthCut; - if (inverseDepthCut <= (maxDepth - 1900)) { - vertex3d[idxInv] = 0.0f; - } else if (inverseDepthCut > (maxDepth - 1900) && inverseDepthCut < 1825) { - vertex3d[idxInv] = inverseDepthCut * 0.001f; - } else { - vertex3d[idxInv] = 0.0f; - } - } - } + auto mv3d = static_cast(user_data); - cv::Mat colorized_depth; - cv::applyColorMap(colorMap, colorized_depth, cv::COLORMAP_JET); + cv::Mat dump(cv::Size(width, height), CV_16U); - int err; - if (mv_source3d == NULL) { - err = mv_create_source(&mv_source3d); - if (MEDIA_VISION_ERROR_NONE != err) { - LOGE("Errors were occurred during creating the source!!! code : %i", err); + for (int y = 0; y < height; y++) { + unsigned short *ptr = depth + y * width; + for (int x = 0; x < width; x++) { + dump.at(y,x) = static_cast( 440.92750f * 21.87095f / static_cast(ptr[x])); } } - mv_source_fill_by_buffer(mv_source3d, - colorized_depth.ptr(), - colorized_depth.elemSize() * colorized_depth.size().width - * colorized_depth.size().height, - colorized_depth.size().width, - colorized_depth.size().height, - MEDIA_VISION_COLORSPACE_RGB888); -#ifdef BUILD_VISUALIZER - mv_util_visualizer_3d(mv_source3d, vertex3d, display_xpos, display_ypos); -#endif - mv_destroy_source(mv_source3d); - mv_source3d = NULL; - delete [] vertex3d; - vertex3d = NULL; - __signal(); -#endif + cv::imwrite(mv3d->dispResultFile, dump); } -static void stereo_handoff(GstElement *object, GstBuffer *buffer, GstPad *pad, - gpointer userData) +static int _vision_source_cb(vision_source_buffer_s *buffer, void *user_data) { - GstMapInfo map; - SrcData *srcData = static_cast(userData); - int ret = MEDIA_VISION_ERROR_NONE; - if (srcData->numFrame >= MAX_FRAMES) { - GstFlowReturn ret; - g_signal_emit_by_name(srcData->src, "end-of-stream", &ret); - return; + auto app = static_cast(user_data); + if (app->mv_source == nullptr || app->mv3d_handle == nullptr) { + printf("mv_source or mv3d_handle is null\n"); + return 0; } - if (buffer != NULL) { - gst_buffer_map(buffer, &map, GST_MAP_READ); - - mv_source_fill_by_buffer(mv_source, map.data, 1344 * 376 * 1, 1344, 376, - MEDIA_VISION_COLORSPACE_Y800); - - gst_buffer_unmap(buffer, &map); - - if (isAsync) { - ret = mv_3d_run_async(mv_source, NULL, NULL, mv3d_handle); - __wait(); - } else { - ret = mv_3d_run(mv_source, NULL, NULL, mv3d_handle); - } - - if (ret != MEDIA_VISION_ERROR_NONE) { - LOGE("Fail to mv_3d_run_async()"); - } + printf("_vision_source_cb: %lld ms\n", static_cast(app->stopWatch.elapsedTime().count())); - mv_source_clear(mv_source); + for (unsigned int h = 0; h < buffer->resolution.height; h++) { + memcpy(app->buffer + buffer->resolution.width * h, + buffer->planes[0].data + (buffer->planes[0].align_width * h), + buffer->resolution.width); } -} + mv_source_fill_by_buffer(app->mv_source, app->buffer, app->imgWidth * app->imgHeight, + app->imgWidth, app->imgHeight, MEDIA_VISION_COLORSPACE_Y800); -int createPipelineCam(SrcData &srcData) -{ - /* - v4l2src device=/dev/video0 ! - video/x-raw, width=1344, height=376, framerate=30/1, format=YUY2 ! - queue ! videorate ! video/x-raw, framerate=30/1 ! - videoconvert ! video/x-raw, format=GRAY8 ! fakesink -v -e - */ - printf("enter - createPipelineCam\n"); - source = gst_element_factory_make("v4l2src", "src"); - filter = gst_element_factory_make("capsfilter", "filter"); - - vconv = gst_element_factory_make("videoconvert", "convert"); - vcfilter = gst_element_factory_make("capsfilter", "vcfilter"); - fsink = gst_element_factory_make("fakesink", "fsink"); - - if (!pipecam || !source || !filter || !vconv || !vcfilter || !fsink) { - printf("pipecam[%p]\n", pipecam); - printf("source [%p], filter [%p]\n", source, filter); - printf("vconv [%p], vcfilter [%p] \n", vconv, vcfilter); - printf("fsink [%p] \n ", fsink); - return -1; - } - - /* set up the pipeline */ - g_object_set(G_OBJECT(source), "device", "/dev/video0", NULL); - g_object_set( - G_OBJECT(filter), "caps", - gst_caps_from_string( - "video/x-raw, width=1344, height=376, framerate=30/1, format=YUY2"), - NULL); - g_object_set(G_OBJECT(vcfilter), "caps", - gst_caps_from_string("video/x-raw, format=GRAY8"), NULL); - g_object_set(G_OBJECT(fsink), "sync", FALSE, NULL); - - g_object_set(G_OBJECT(fsink), "signal-handoffs", TRUE, NULL); - handler = g_signal_connect(fsink, "handoff", G_CALLBACK(stereo_handoff), - &srcData); - - /* add elements into the pipeline */ - gst_bin_add_many(GST_BIN(pipecam), source, filter, vconv, vcfilter, fsink, - NULL); - - /* link elements */ - gst_element_link_many(source, filter, /*queue1, vrate, vrfilter,*/ - vconv, vcfilter, fsink, NULL); - return 0; -} - -int createPipelineDepth() -{ - /* - appsrc ! video/x-raw, width=672, height=376, framerate=30/1, format=GRAY8 ! - videoconvert ! fakesink -v -e - */ - appsource = gst_element_factory_make("appsrc", "appsrc"); - asfilter = gst_element_factory_make("capsfilter", "asfilter"); - asvconv = gst_element_factory_make("videoconvert", "asvconv"); - //sink = gst_element_factory_make("tizenwlsink", "sink"); - sink = gst_element_factory_make("fakesink", "sink"); - - if (!pipedepth || !appsource || !asfilter || !asvconv || !sink) { - printf("pipeline[%p]\n", pipedepth); - printf("appsrc [%p], asfilter[%p] \n", appsource, asfilter); - printf("asvconv [%p], sink [%p] \n", asvconv, sink); - return -1; - } - - /* set up the pipeline */ - GstCaps *caps = gst_caps_from_string( - "video/x-raw, width=672, height=376, framerate=30/1, format=GRAY16_LE"); - gst_app_src_set_caps((GstAppSrc *) appsource, caps); - g_object_set( - G_OBJECT(asfilter), "caps", - gst_caps_from_string( - "video/x-raw, width=672, height=376, framerate=30/1, format=GRAY16_LE"), - NULL); - g_object_set(G_OBJECT(sink), "use-tbm", FALSE, NULL); - g_object_set(G_OBJECT(sink), "sync", FALSE, NULL); - - /* add elements into the pipeline */ - gst_bin_add_many(GST_BIN(pipedepth), appsource, asfilter, asvconv, sink, - NULL); - - /* link elements */ - gst_element_link_many(appsource, asfilter, asvconv, sink, NULL); + mv_3d_run_async(app->mv3d_handle, app->mv_source, nullptr, nullptr); + mv_source_clear(app->mv_source); return 0; } @@ -464,36 +172,29 @@ int main(int argc, char *argv[]) { signal(SIGINT, int_handler); - gst_init(&argc, &argv); - GMainLoop *loop; - GstBus *bus; - guint busWatchIdCam; - guint busWatchIdDepth; - camWidth = 672; - camHeight = 376; - + camWidth = 640; + camHeight = 400; isLive = true; isAsync = true; - depth_scale = 1000.0; - depth_trunc = 200.0; + std::string stereoConfigFile; + std::string dispResultFile; + // mv_depthstream_test_suite 1 8 96 0 0 640 400 /usr/share/dfs-qcmv/stereoCalibDA.yaml /tmp/test.png if (argc > 1) { - isLive = atoi(argv[1]) !=0 ? true : false; - depth_scale = static_cast(atof(argv[2])); - depth_trunc = static_cast(atof(argv[3])); - - isAsync = atoi(argv[4]) !=0 ? true : false; - minDisp = atoi(argv[5]); - maxDisp = atoi(argv[6]); - display_xpos = atoi(argv[7]); - display_ypos = atoi(argv[8]); + isAsync = (atoi(argv[1])!=0); + minDisp = atoi(argv[2]); + maxDisp = atoi(argv[3]); + display_xpos = atoi(argv[4]); + display_ypos = atoi(argv[5]); + camWidth = atoi(argv[6]); + camHeight = atoi(argv[7]); + stereoConfigFile = argv[8]; + dispResultFile = argv[9]; } #ifdef MV_3D_POINTCLOUD_IS_AVAILABLE utility::SetVerbosityLevel(utility::VerbosityLevel::Debug); #endif - SrcData srcData; int ret = MEDIA_VISION_ERROR_NONE; - printf("enter main\n"); // mediavision @@ -529,81 +230,84 @@ int main(int argc, char *argv[]) ret = mv_engine_config_set_string_attribute( engine_config, MV_3D_DEPTH_STEREO_CONFIG_FILE_PATH, - "/usr/share/capi-media-vision/stereoCalibZedVGA.yaml"); - + stereoConfigFile.c_str()); if (ret != MEDIA_VISION_ERROR_NONE) { return -1; } + app.dispResultFile = dispResultFile; // mv3d handle - ret = mv_3d_create(&mv3d_handle); + ret = mv_3d_create(&app.mv3d_handle); if (ret != MEDIA_VISION_ERROR_NONE) { return -1; } - ret = mv_3d_configure(mv3d_handle, engine_config); + ret = mv_3d_configure(app.mv3d_handle, engine_config); if (ret != MEDIA_VISION_ERROR_NONE) { return -1; } - ret = mv_3d_set_depth_cb(mv3d_handle, _depth_stereo_cb, nullptr); + ret = mv_3d_set_depth_cb(app.mv3d_handle, _depth_stereo_cb, &app); if (ret != MEDIA_VISION_ERROR_NONE) { return -1; } - ret = mv_3d_prepare(mv3d_handle); + ret = mv_3d_prepare(app.mv3d_handle); if (ret != MEDIA_VISION_ERROR_NONE) { return -1; } // source - ret = mv_create_source(&mv_source); + ret = mv_create_source(&app.mv_source); if (ret != MEDIA_VISION_ERROR_NONE) { return -1; } - // gstreamer - loop = g_main_loop_new(NULL, FALSE); - pipedepth = gst_pipeline_new("pipedepth"); - pipecam = gst_pipeline_new("pipecam"); - - // create depth and prepare - ret = createPipelineDepth(); - if (ret != 0) + vision_source_format_s format { + .pixel_format = VISION_SOURCE_PIXEL_FORMAT_NV12, + .resolution = { camWidth << 1, camHeight }, + .fps = 10, + .quality = 0, + .bitrate = 0 + }; + + app.imgWidth = camWidth << 1; + app.imgHeight = camHeight; + app.buffer = new unsigned char [app.imgWidth * app.imgHeight]; + app.stopWatch.resetTime(); + + // vision-source + vision_source_h vision_source_handle = nullptr; + ret = vision_source_init(&vision_source_handle); + if (ret != VISION_SOURCE_ERROR_NONE) { return -1; + } - srcData.src = appsource; - srcData.numFrame = 0; - // create camera - ret = createPipelineCam(srcData); - if (ret != 0) + ret = vision_source_open_device(vision_source_handle, VISION_SOURCE_DEVICE_ID); + if (ret != VISION_SOURCE_ERROR_NONE) { return -1; + } - bus = gst_pipeline_get_bus(GST_PIPELINE(pipecam)); - busWatchIdCam = gst_bus_add_watch(bus, bus_call, loop); - gst_object_unref(bus); - - bus = gst_pipeline_get_bus(GST_PIPELINE(pipedepth)); - busWatchIdDepth = gst_bus_add_watch(bus, bus_call, loop); - gst_object_unref(bus); - - gst_element_set_state(pipecam, GST_STATE_PLAYING); - gst_element_set_state(pipedepth, GST_STATE_PLAYING); + loop = g_main_loop_new(NULL,false); + ret = vision_source_set_stream_format(vision_source_handle, &format); + if (ret != VISION_SOURCE_ERROR_NONE) { + return -1; + } + vision_source_start_stream(vision_source_handle, _vision_source_cb, &app); + printf("starting...\n"); g_main_loop_run(loop); + printf("stop\n"); - gst_element_set_state(pipecam, GST_STATE_NULL); - gst_element_set_state(pipedepth, GST_STATE_NULL); + delete [] app.buffer; - gst_object_unref(GST_OBJECT(pipecam)); - gst_object_unref(GST_OBJECT(pipedepth)); - g_source_remove(busWatchIdCam); - g_source_remove(busWatchIdDepth); - g_main_loop_unref(loop); + vision_source_stop_stream(vision_source_handle); + vision_source_close_device(vision_source_handle); + vision_source_exit(vision_source_handle); - mv_3d_destroy(mv3d_handle); + mv_destroy_source(app.mv_source); + mv_3d_destroy(app.mv3d_handle); mv_destroy_engine_config(engine_config); - mv_destroy_source(mv_source); return 0; } -- 2.7.4