From 7fff4767588f034b85ae17b7d2a356010e383295 Mon Sep 17 00:00:00 2001 From: "Joshua M. Doe" Date: Fri, 12 Mar 2010 14:24:43 -0500 Subject: [PATCH] Initial commit of two preliminary plugins, videolevels and niimaqsrc --- .gitignore | 29 ++ .gitignore.bak | 29 ++ CMakeLists.txt | 60 +++ cmake/modules/FindATK.cmake | 11 + cmake/modules/FindCairo.cmake | 11 + cmake/modules/FindGTK2.cmake | 44 ++ cmake/modules/FindGlew.cmake | 17 + cmake/modules/FindGlib2.cmake | 43 ++ cmake/modules/FindGstreamer.cmake | 134 ++++++ cmake/modules/FindLibIconv.cmake | 11 + cmake/modules/FindLibXml2.cmake | 11 + cmake/modules/FindLibpng.cmake | 17 + cmake/modules/FindNIIMAQ.cmake | 17 + cmake/modules/FindOpenGL.cmake.off | 30 ++ cmake/modules/FindZlib.cmake | 17 + config.h | 13 + gst/CMakeLists.txt | 19 + gst/gstvideolevels.c | 489 +++++++++++++++++++++ gst/gstvideolevels.h | 80 ++++ set_paths_and_run_cmake.bat | 21 + sys/CMakeLists.txt | 20 + sys/gstniimaq.c | 660 +++++++++++++++++++++++++++++ sys/gstniimaq.h | 82 ++++ 23 files changed, 1865 insertions(+) create mode 100644 .gitignore create mode 100644 .gitignore.bak create mode 100644 CMakeLists.txt create mode 100644 cmake/modules/FindATK.cmake create mode 100644 cmake/modules/FindCairo.cmake create mode 100644 cmake/modules/FindGTK2.cmake create mode 100644 cmake/modules/FindGlew.cmake create mode 100644 cmake/modules/FindGlib2.cmake create mode 100644 cmake/modules/FindGstreamer.cmake create mode 100644 cmake/modules/FindLibIconv.cmake create mode 100644 cmake/modules/FindLibXml2.cmake create mode 100644 cmake/modules/FindLibpng.cmake create mode 100644 cmake/modules/FindNIIMAQ.cmake create mode 100644 cmake/modules/FindOpenGL.cmake.off create mode 100644 cmake/modules/FindZlib.cmake create mode 100644 config.h create mode 100644 gst/CMakeLists.txt create mode 100644 gst/gstvideolevels.c create mode 100644 gst/gstvideolevels.h create mode 100644 set_paths_and_run_cmake.bat create mode 100644 sys/CMakeLists.txt create mode 100644 sys/gstniimaq.c create mode 100644 sys/gstniimaq.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3529ad9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ + +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.exe +*.pdb +*.user +*.aps +*.pch +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.cache +*.ilk +*.log +[Bb]in +[Dd]ebug*/ +*.lib +*.sbr +obj/ +[Rr]elease*/ +_ReSharper*/ +[Tt]est[Rr]esult* \ No newline at end of file diff --git a/.gitignore.bak b/.gitignore.bak new file mode 100644 index 0000000..3529ad9 --- /dev/null +++ b/.gitignore.bak @@ -0,0 +1,29 @@ + +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.exe +*.pdb +*.user +*.aps +*.pch +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.cache +*.ilk +*.log +[Bb]in +[Dd]ebug*/ +*.lib +*.sbr +obj/ +[Rr]elease*/ +_ReSharper*/ +[Tt]est[Rr]esult* \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d265d01 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,60 @@ +cmake_minimum_required ( VERSION "2.6.0" ) + +list ( APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ) + +project ( gst-plugins-vision ) + +find_package ( Glib2 REQUIRED ) +find_package ( Gstreamer COMPONENTS gstbase ) +find_package ( LibXml2 ) +find_package ( LibIconv ) +find_package ( NIIMAQ REQUIRED ) # make this optional + +function ( check_package name LEVEL ) + if ( ${name}_FOUND ) + message ( STATUS "Found ${name}... YES" ) + else ( ${name}_FOUND ) + message ( STATUS "Found ${name}... NO" ) + if ( LEVEL ) + if ( WIN32 ) + message ( FATAL_ERROR "You should set the env variable ${name}_DIR" ) + else ( WIN32 ) + message ( FATAL_ERROR "You should install ${name} dev package" ) + endif ( WIN32 ) + endif ( LEVEL ) + endif ( ${name}_FOUND ) +endfunction ( check_package ) + +# required packages +check_package ( GLIB2 1 ) +check_package ( GSTREAMER 1 ) + +# conditionnal required packages +INCLUDE ( CheckIncludeFiles ) +CHECK_INCLUDE_FILES ( "${GSTREAMER_gstconfig_INCLUDE_DIR}/gst/gstconfig.h" GST_USING_BINARY_REGISTRY ) +if ( NOT GST_USING_BINARY_REGISTRY ) + check_package ( LIBXML2 1 ) + check_package ( LIBICONV 1 ) +endif ( NOT GST_USING_BINARY_REGISTRY ) + +# debug +message ( "****" ${GLIB2_INCLUDE_DIR} ) +message ( "****" ${GLIB2_LIBRARIES} ) +message ( "****" ${GSTREAMER_INCLUDE_DIR} ) +message ( "****" ${GSTREAMER_LIBRARIES} ) +message ( "****" ${NIIMAQ_INCLUDE_DIR} ) +message ( "****" ${NIIMAQ_LIBRARIES} ) + +include_directories ( + . + ${GSTREAMER_INCLUDE_DIR} + ${GLIB2_INCLUDE_DIR} ) + +if ( NOT GST_USING_BINARY_REGISTRY ) + include_directories ( AFTER + ${LIBXML2_INCLUDE_DIR} + ${LIBICONV_INCLUDE_DIR} ) +endif ( NOT GST_USING_BINARY_REGISTRY ) + +add_subdirectory ( gst ) +add_subdirectory ( sys ) diff --git a/cmake/modules/FindATK.cmake b/cmake/modules/FindATK.cmake new file mode 100644 index 0000000..762e144 --- /dev/null +++ b/cmake/modules/FindATK.cmake @@ -0,0 +1,11 @@ +FILE(TO_CMAKE_PATH "$ENV{ATK_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${ATK_DIR}" TRY2_DIR) +FILE(GLOB ATK_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(ATK_INCLUDE_DIR atk/atk.h + PATHS ${ATK_DIR}/include /usr/local/include/atk-1.0 /usr/include/atk-1.0 + ENV INCLUDE DOC "Directory containing atk/atk.h include file") + +IF (ATK_INCLUDE_DIR) + SET(ATK_FOUND TRUE) +ENDIF (ATK_INCLUDE_DIR) diff --git a/cmake/modules/FindCairo.cmake b/cmake/modules/FindCairo.cmake new file mode 100644 index 0000000..9ad0be4 --- /dev/null +++ b/cmake/modules/FindCairo.cmake @@ -0,0 +1,11 @@ +FILE(TO_CMAKE_PATH "$ENV{CAIRO_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${CAIRO_DIR}" TRY2_DIR) +FILE(GLOB CAIRO_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(CAIRO_INCLUDE_DIR cairo.h + PATHS ${CAIRO_DIR}/include /usr/local/include/cairo /usr/include/cairo + ENV INCLUDE DOC "Directory containing cairo.h include file") + +IF (CAIRO_INCLUDE_DIR) + SET(CAIRO_FOUND TRUE) +ENDIF (CAIRO_INCLUDE_DIR) diff --git a/cmake/modules/FindGTK2.cmake b/cmake/modules/FindGTK2.cmake new file mode 100644 index 0000000..58e8af4 --- /dev/null +++ b/cmake/modules/FindGTK2.cmake @@ -0,0 +1,44 @@ +FILE(TO_CMAKE_PATH "$ENV{GTK2_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${GTK2_DIR}" TRY2_DIR) +FILE(GLOB GTK_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(GTK_gtk_2_INCLUDE_DIR gtk/gtk.h + PATHS ${GTK_DIR}/include /usr/local/include/gtk-2.0 /usr/include/gtk-2.0 + ENV INCLUDE DOC "Directory containing gtk/gtk.h include file") + +FIND_PATH(GTK_gdk_2_INCLUDE_DIR gdk/gdk.h + PATHS ${GTK_DIR}/include /usr/local/include/gtk-2.0 /usr/include/gtk-2.0 + ENV INCLUDE DOC "Directory containing gdk/gdk.h include file") + +FIND_PATH(GTK_gdkconfig_2_INCLUDE_DIR gdkconfig.h + PATHS ${GTK_DIR}/include ${GTK_DIR}/lib/include /usr/local/include/gtk-2.0 /usr/include/gtk-2.0 /usr/lib/gtk-2.0/include /usr/local/lib/gtk-2.0/include + ENV INCLUDE DOC "Directory containing gdkconfig.h include file") + +FIND_LIBRARY(GTK_gdk_pixbuf_2_LIBRARY NAMES gdk_pixbuf-2.0 + PATHS ${GTK_DIR}/lib ${GTK_DIR}/bin ${GTK_DIR}/win32/bin ${GTK_DIR}/lib ${GTK_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gdk_pixbuf library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GTK_gdk_2_LIBRARY NAMES gdk-win32-2.0 gdk-x11-2.0 + PATHS ${GTK_DIR}/lib ${GTK_DIR}/bin ${GTK_DIR}/win32/bin ${GTK_DIR}/lib ${GTK_DIR}/win32/lib /usr/lib /usr/local/lib + ENV LIB + DOC "gdk2 library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GTK_gtk_2_LIBRARY NAMES gtk-win32-2.0 gtk-x11-2.0 + PATHS ${GTK_DIR}/lib ${GTK_DIR}/bin ${GTK_DIR}/win32/bin ${GTK_DIR}/lib ${GTK_DIR}/win32/lib /usr/lib /usr/local/lib + ENV LIB + DOC "gtk2 library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + + +IF (GTK_gtk_2_INCLUDE_DIR AND GTK_gdk_2_INCLUDE_DIR AND GTK_gdkconfig_2_INCLUDE_DIR AND + GTK_gdk_pixbuf_2_LIBRARY AND GTK_gdk_2_LIBRARY AND GTK_gtk_2_LIBRARY) + SET(GTK2_INCLUDE_DIR ${GTK_gtk_2_INCLUDE_DIR} ${GTK_gdk_2_INCLUDE_DIR} ${GTK_gdkconfig_2_INCLUDE_DIR}) + list(REMOVE_DUPLICATES GTK2_INCLUDE_DIR) + SET(GTK2_LIBRARIES ${GTK_gdk_pixbuf_2_LIBRARY} ${GTK_gdk_2_LIBRARY} ${GTK_gtk_2_LIBRARY}) + list(REMOVE_DUPLICATES GTK2_LIBRARIES) + SET(GTK2_FOUND TRUE) +ENDIF (GTK_gtk_2_INCLUDE_DIR AND GTK_gdk_2_INCLUDE_DIR AND GTK_gdkconfig_2_INCLUDE_DIR AND + GTK_gdk_pixbuf_2_LIBRARY AND GTK_gdk_2_LIBRARY AND GTK_gtk_2_LIBRARY) diff --git a/cmake/modules/FindGlew.cmake b/cmake/modules/FindGlew.cmake new file mode 100644 index 0000000..463d705 --- /dev/null +++ b/cmake/modules/FindGlew.cmake @@ -0,0 +1,17 @@ +FILE(TO_CMAKE_PATH "$ENV{GLEW_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${GLEW_DIR}" TRY2_DIR) +FILE(GLOB GLEW_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(GLEW_INCLUDE_DIR GL/glew.h + PATHS ${GLEW_DIR}/include /usr/local/include /usr/include + ENV INCLUDE DOC "Directory containing GL/glew.h include file") + +FIND_LIBRARY(GLEW_LIBRARY NAMES glew32 GLEW glew32s + PATHS ${GLEW_DIR}/bin ${GLEW_DIR}/win32/bin ${GLEW_DIR}/lib ${GLEW_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "glew library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +IF (GLEW_INCLUDE_DIR AND GLEW_LIBRARY) + SET(GLEW_FOUND TRUE) +ENDIF (GLEW_INCLUDE_DIR AND GLEW_LIBRARY) diff --git a/cmake/modules/FindGlib2.cmake b/cmake/modules/FindGlib2.cmake new file mode 100644 index 0000000..821296c --- /dev/null +++ b/cmake/modules/FindGlib2.cmake @@ -0,0 +1,43 @@ +FILE(TO_CMAKE_PATH "$ENV{GLIB2_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${GLIB2_DIR}" TRY2_DIR) +FILE(GLOB GLIB2_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(GLIB_glib_2_INCLUDE_DIR glib.h + PATHS ${GLIB2_DIR}/include ${GLIB2_DIR}/include/glib-2.0 /usr/local/include/glib-2.0 /usr/include/glib-2.0 /opt/local/include/glib-2.0 + ENV INCLUDE DOC "Directory containing glib.h include file") + +FIND_PATH(GLIB_glibconfig_2_INCLUDE_DIR glibconfig.h + PATHS ${GLIB2_DIR}/include ${GLIB2_DIR}/include/glib-2.0 ${GLIB2_DIR}/lib/include ${GLIB2_DIR}/lib/glib-2.0/include /usr/local/include/glib-2.0 /usr/include/glib-2.0 /usr/lib/glib-2.0/include /usr/local/lib/glib-2.0/include /opt/local/lib/glib-2.0/include + ENV INCLUDE DOC "Directory containing glibconfig.h include file") + +FIND_LIBRARY(GLIB_glib_2_LIBRARY NAMES glib-2.0 + PATHS ${GLIB2_DIR}/bin ${GLIB2_DIR}/win32/bin ${GLIB2_DIR}/lib ${GLIB2_DIR}/win32/lib /usr/local/lib /usr/lib /opt/local/lib + ENV LIB + DOC "glib library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GLIB_gmodule_2_LIBRARY NAMES gmodule-2.0 + PATHS ${GLIB2_DIR}/bin ${GLIB2_DIR}/win32/bin ${GLIB2_DIR}/lib ${GLIB2_DIR}/win32/lib /usr/local/lib /usr/lib /opt/local/lib + ENV LIB + DOC "gmodule library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GLIB_gobject_2_LIBRARY NAMES gobject-2.0 + PATHS ${GLIB2_DIR}/bin ${GLIB2_DIR}/win32/bin ${GLIB2_DIR}/lib ${GLIB2_DIR}/win32/lib /usr/local/lib /usr/lib /opt/local/lib + ENV LIB + DOC "gobject library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GLIB_gthread_2_LIBRARY NAMES gthread-2.0 + PATHS ${GLIB2_DIR}/bin ${GLIB2_DIR}/win32/bin ${GLIB2_DIR}/lib ${GLIB2_DIR}/win32/lib /usr/local/lib /usr/lib /opt/local/lib + ENV LIB + DOC "gthread library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +IF (GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY AND GLIB_gmodule_2_LIBRARY AND GLIB_gobject_2_LIBRARY AND GLIB_gthread_2_LIBRARY) + SET(GLIB2_INCLUDE_DIR ${GLIB_glib_2_INCLUDE_DIR} ${GLIB_glibconfig_2_INCLUDE_DIR}) + list(REMOVE_DUPLICATES GLIB2_INCLUDE_DIR) + SET(GLIB2_LIBRARIES ${GLIB_glib_2_LIBRARY} ${GLIB_gmodule_2_LIBRARY} ${GLIB_gobject_2_LIBRARY} ${GLIB_gthread_2_LIBRARY}) + list(REMOVE_DUPLICATES GLIB2_LIBRARIES) + SET(GLIB2_FOUND TRUE) +ENDIF (GLIB_glib_2_INCLUDE_DIR AND GLIB_glibconfig_2_INCLUDE_DIR AND GLIB_glib_2_LIBRARY AND GLIB_gmodule_2_LIBRARY AND GLIB_gobject_2_LIBRARY AND GLIB_gthread_2_LIBRARY) diff --git a/cmake/modules/FindGstreamer.cmake b/cmake/modules/FindGstreamer.cmake new file mode 100644 index 0000000..64fa90a --- /dev/null +++ b/cmake/modules/FindGstreamer.cmake @@ -0,0 +1,134 @@ +FILE(TO_CMAKE_PATH "$ENV{GSTREAMER_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${GSTREAMER_DIR}" TRY2_DIR) +FILE(GLOB GSTREAMER_DIR ${TRY1_DIR} ${TRY2_DIR}) +message(STATUS ": GSTREAMER_DIR=${GSTREAMER_DIR}") + +FIND_PATH(GSTREAMER_gst_INCLUDE_DIR gst/gst.h + PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/include/gstreamer-0.10 /usr/local/include/gstreamer-0.10 /usr/include/gstreamer-0.10 C:/gstreamer/include/gstreamer-0.10/gst + ENV INCLUDE DOC "Directory containing gst/gst.h include file") +message(STATUS "GSTREAMER_gst_INCLUDE_DIR = ${GSTREAMER_gst_INCLUDE_DIR}") + +FIND_PATH(GSTREAMER_gstconfig_INCLUDE_DIR gst/gstconfig.h + PATHS ${GSTREAMER_DIR}/include ${GSTREAMER_DIR}/lib/include ${GSTREAMER_DIR}/include/gstreamer-0.10 /usr/local/include/gstreamer-0.10 /usr/include/gstreamer-0.10 /usr/local/lib/include/gstreamer-0.10 /usr/lib/include/gstreamer-0.10 + ENV INCLUDE DOC "Directory containing gst/gstconfig.h include file") +message(STATUS "GSTREAMER_gstconfig_INCLUDE_DIR = ${GSTREAMER_gstconfig_INCLUDE_DIR}") + +FIND_LIBRARY(GSTREAMER_gstaudio_LIBRARY NAMES gstaudio-0.10 libgstaudio-0.10 gstaudio + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstaudio library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) +message(STATUS "GSTREAMER_gstaudio_LIBRARY = ${GSTREAMER_gstaudio_LIBRARY}") + +FIND_LIBRARY(GSTREAMER_gstbase_LIBRARY NAMES gstbase-0.10 libgstbase-0.10 gstbase + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstbase library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GLIB_gstcdda_LIBRARY NAMES gstcdda-0.10 libgstcdda-0.10 gstcdda + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstcdda library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstcontroller_LIBRARY NAMES gstcontroller-0.10 libgstcontroller-0.10 gstcontroller + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstcontroller library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstdataprotocol_LIBRARY NAMES gstdataprotocol-0.10 libgstdataprotocol-0.10 gstdataprotocol + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstdataprotocol library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstinterfaces_LIBRARY NAMES gstinterfaces-0.10 libgstinterfaces-0.10 gstinterfaces + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstinterfaces library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstnet_LIBRARY NAMES gstnet-0.10 libgstnet-0.10 gstnet + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstnet library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstnetbuffer_LIBRARY NAMES gstnetbuffer-0.10 libgstnetbuffer-0.10 gstnetbuffer + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstnetbuffer library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstpbutils_LIBRARY NAMES gstpbutils-0.10 libgstpbutils-0.10 gstpbutils + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstpbutils library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstreamer_LIBRARY NAMES gstreamer-0.10 libgstreamer-0.10 gstreamer + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstreamer library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstriff_LIBRARY NAMES gstriff-0.10 libgstriff-0.10 gstriff + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstriff library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstrtp_LIBRARY NAMES gstrtp-0.10 libgstrtp-0.10 gstrtp + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstrtp library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstrtsp_LIBRARY NAMES gstrtsp-0.10 libgstrtsp-0.10 gstrtsp + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstrtsp library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +#FIND_LIBRARY(GSTREAMER_gstsdp_LIBRARY NAMES gstsdp-0.10 libgstsdp-0.10 +# PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib +# ENV LIB +# DOC "gstsdp library to link with" +# NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gsttag_LIBRARY NAMES gsttag-0.10 libgsttag-0.10 gsttag + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gsttag library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(GSTREAMER_gstvideo_LIBRARY NAMES gstvideo-0.10 libgstvideo-0.10 gstvideo + PATHS ${GSTREAMER_DIR}/bin ${GSTREAMER_DIR}/win32/bin ${GSTREAMER_DIR}/bin/bin C:/gstreamer/bin ${GSTREAMER_DIR}/lib ${GSTREAMER_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gstvideo library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + + +#IF (GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstconfig_INCLUDE_DIR AND +# GSTREAMER_gstaudio_LIBRARY AND GSTREAMER_gstbase_LIBRARY AND GSTREAMER_gstcontroller_LIBRARY AND +# GSTREAMER_gstdataprotocol_LIBRARY AND GSTREAMER_gstinterfaces_LIBRARY AND GSTREAMER_gstnet_LIBRARY AND +# GSTREAMER_gstnetbuffer_LIBRARY AND GSTREAMER_gstpbutils_LIBRARY AND GSTREAMER_gstreamer_LIBRARY AND +# GSTREAMER_gstriff_LIBRARY AND GSTREAMER_gstrtp_LIBRARY AND GSTREAMER_gstrtsp_LIBRARY AND GSTREAMER_gstsdp_LIBRARY AND +# GSTREAMER_gsttag_LIBRARY AND GSTREAMER_gstvideo_LIBRARY) + SET(GSTREAMER_INCLUDE_DIR ${GSTREAMER_gst_INCLUDE_DIR} ${GSTREAMER_gstconfig_INCLUDE_DIR}) + list(REMOVE_DUPLICATES GSTREAMER_INCLUDE_DIR) + SET(GSTREAMER_LIBRARIES ${GSTREAMER_gstaudio_LIBRARY} ${GSTREAMER_gstbase_LIBRARY} + ${GSTREAMER_gstcontroller_LIBRARY} ${GSTREAMER_gstdataprotocol_LIBRARY} ${GSTREAMER_gstinterfaces_LIBRARY} + ${GSTREAMER_gstnet_LIBRARY} ${GSTREAMER_gstnetbuffer_LIBRARY} ${GSTREAMER_gstpbutils_LIBRARY} + ${GSTREAMER_gstreamer_LIBRARY} ${GSTREAMER_gstriff_LIBRARY} ${GSTREAMER_gstrtp_LIBRARY} + ${GSTREAMER_gstrtsp_LIBRARY} ${GSTREAMER_gstsdp_LIBRARY} ${GSTREAMER_gsttag_LIBRARY} ${GSTREAMER_gstvideo_LIBRARY}) + list(REMOVE_DUPLICATES GSTREAMER_LIBRARIES) + SET(GSTREAMER_FOUND TRUE) +#ENDIF (GSTREAMER_gst_INCLUDE_DIR AND GSTREAMER_gstconfig_INCLUDE_DIR AND +# GSTREAMER_gstaudio_LIBRARY AND GSTREAMER_gstbase_LIBRARY AND GSTREAMER_gstcontroller_LIBRARY AND +# GSTREAMER_gstdataprotocol_LIBRARY AND GSTREAMER_gstinterfaces_LIBRARY AND GSTREAMER_gstnet_LIBRARY AND +# GSTREAMER_gstnetbuffer_LIBRARY AND GSTREAMER_gstpbutils_LIBRARY AND GSTREAMER_gstreamer_LIBRARY AND +# GSTREAMER_gstriff_LIBRARY AND GSTREAMER_gstrtp_LIBRARY AND GSTREAMER_gstrtsp_LIBRARY AND GSTREAMER_gstsdp_LIBRARY AND +# GSTREAMER_gsttag_LIBRARY AND GSTREAMER_gstvideo_LIBRARY) diff --git a/cmake/modules/FindLibIconv.cmake b/cmake/modules/FindLibIconv.cmake new file mode 100644 index 0000000..0934202 --- /dev/null +++ b/cmake/modules/FindLibIconv.cmake @@ -0,0 +1,11 @@ +FILE(TO_CMAKE_PATH "$ENV{LIBICONV_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${LIBICONV_DIR}" TRY2_DIR) +FILE(GLOB LIBICONV_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(LIBICONV_INCLUDE_DIR iconv.h + PATHS ${LIBICONV_DIR}/include /usr/local/include /usr/include + ENV INCLUDE DOC "Directory containing iconv.h include file") + +IF (LIBICONV_INCLUDE_DIR) + SET(LIBICONV_FOUND TRUE) +ENDIF (LIBICONV_INCLUDE_DIR) diff --git a/cmake/modules/FindLibXml2.cmake b/cmake/modules/FindLibXml2.cmake new file mode 100644 index 0000000..399f5a2 --- /dev/null +++ b/cmake/modules/FindLibXml2.cmake @@ -0,0 +1,11 @@ +FILE(TO_CMAKE_PATH "$ENV{LIBXML2_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${LIBXML2_DIR}" TRY2_DIR) +FILE(GLOB LIBXML2_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(LIBXML2_INCLUDE_DIR libxml/parser.h + PATHS ${LIBXML2_DIR}/include ${LIBXML2_DIR}/include/libxml2 /usr/local/include/libxml2 /usr/include/libxml2 + ENV INCLUDE DOC "Directory containing libxml/parser.h include file") + +IF (LIBXML2_INCLUDE_DIR) + SET(LIBXML2_FOUND TRUE) +ENDIF (LIBXML2_INCLUDE_DIR) diff --git a/cmake/modules/FindLibpng.cmake b/cmake/modules/FindLibpng.cmake new file mode 100644 index 0000000..648db97 --- /dev/null +++ b/cmake/modules/FindLibpng.cmake @@ -0,0 +1,17 @@ +FILE(TO_CMAKE_PATH "$ENV{PNG_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${PNG_DIR}" TRY2_DIR) +FILE(GLOB PNG_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(PNG_INCLUDE_DIR png.h + PATHS ${PNG_DIR}/include /usr/local/include /usr/include + ENV INCLUDE DOC "Directory containing png.h include file") + +FIND_LIBRARY(PNG_LIBRARY NAMES png12 png + PATHS ${PNG_DIR}/bin ${PNG_DIR}/win32/bin ${PNG_DIR}/lib ${PNG_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "png library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +IF (PNG_INCLUDE_DIR AND PNG_LIBRARY) + SET(PNG_FOUND TRUE) +ENDIF (PNG_INCLUDE_DIR AND PNG_LIBRARY) diff --git a/cmake/modules/FindNIIMAQ.cmake b/cmake/modules/FindNIIMAQ.cmake new file mode 100644 index 0000000..1a11df1 --- /dev/null +++ b/cmake/modules/FindNIIMAQ.cmake @@ -0,0 +1,17 @@ +FILE(TO_CMAKE_PATH "$ENV{NIIMAQ_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${NIIMAQ_DIR}" TRY2_DIR) +FILE(GLOB NIIMAQ_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(NIIMAQ_INCLUDE_DIR niimaq.h + PATHS "${NIIMAQ_DIR}/Shared/ExternalCompilerSupport/C/Include" "${NIIMAQ_DIR}/Include" + ENV INCLUDE DOC "Directory containing niimaq.h include file") + +FIND_LIBRARY(NIIMAQ_LIBRARY NAMES imaq + PATHS "${NIIMAQ_DIR}/Shared/ExternalCompilerSupport/C/Lib32/MSVC" "${NIIMAQ_DIR}/Lib32/MSVC" + ENV LIB + DOC "niimaq library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +IF (NIIMAQ_INCLUDE_DIR AND NIIMAQ_LIBRARY) + SET(NIIMAQ_FOUND TRUE) +ENDIF (NIIMAQ_INCLUDE_DIR AND NIIMAQ_LIBRARY) diff --git a/cmake/modules/FindOpenGL.cmake.off b/cmake/modules/FindOpenGL.cmake.off new file mode 100644 index 0000000..3dc7dd2 --- /dev/null +++ b/cmake/modules/FindOpenGL.cmake.off @@ -0,0 +1,30 @@ +FILE(TO_CMAKE_PATH "$ENV{OPENGL_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${OPENGL_DIR}" TRY2_DIR) +FILE(GLOB OPENGL_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(OPENGL_gl_INCLUDE_DIR GL/gl.h + PATHS ${OPENGL_DIR}/include /usr/local/include /usr/include + ENV INCLUDE DOC "Directory containing GL/gl.h include file") + +FIND_PATH(OPENGL_glu_INCLUDE_DIR GL/glu.h + PATHS ${OPENGL_DIR}/include /usr/local/include /usr/include + ENV INCLUDE DOC "Directory containing GL/glu.h include file") + +FIND_LIBRARY(OPENGL_gl_LIBRARY NAMES opengl32 GL + PATHS ${OPENGL_DIR}/bin ${OPENGL_DIR}/win32/bin ${OPENGL_DIR}/lib ${OPENGL_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "gl library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +FIND_LIBRARY(OPENGL_glu_LIBRARY NAMES glu32 GLU + PATHS ${OPENGL_DIR}/bin ${OPENGL_DIR}/win32/bin ${OPENGL_DIR}/lib ${OPENGL_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "glu library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +IF (OPENGL_gl_INCLUDE_DIR AND OPENGL_glu_INCLUDE_DIR AND OPENGL_gl_LIBRARY AND OPENGL_glu_LIBRARY) + SET(OPENGL_INCLUDE_DIR ${OPENGL_gl_INCLUDE_DIR} ${OPENGL_glu_INCLUDE_DIR}) + list(REMOVE_DUPLICATES OPENGL_INCLUDE_DIR) + SET(OPENGL_LIBRARIES ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) + list(REMOVE_DUPLICATES OPENGL_LIBRARIES) +ENDIF (OPENGL_gl_INCLUDE_DIR AND OPENGL_glu_INCLUDE_DIR AND OPENGL_gl_LIBRARY AND OPENGL_glu_LIBRARY) diff --git a/cmake/modules/FindZlib.cmake b/cmake/modules/FindZlib.cmake new file mode 100644 index 0000000..e604b44 --- /dev/null +++ b/cmake/modules/FindZlib.cmake @@ -0,0 +1,17 @@ +FILE(TO_CMAKE_PATH "$ENV{ZLIB_DIR}" TRY1_DIR) +FILE(TO_CMAKE_PATH "${ZLIB_DIR}" TRY2_DIR) +FILE(GLOB ZLIB_DIR ${TRY1_DIR} ${TRY2_DIR}) + +FIND_PATH(ZLIB_INCLUDE_DIR zlib.h + PATHS ${ZLIB_DIR}/include /usr/local/include /usr/include + ENV INCLUDE DOC "Directory containing zlib.h include file") + +FIND_LIBRARY(ZLIB_LIBRARY NAMES z + PATHS ${ZLIB_DIR}/bin ${ZLIB_DIR}/win32/bin ${ZLIB_DIR}/lib ${ZLIB_DIR}/win32/lib /usr/local/lib /usr/lib + ENV LIB + DOC "zlib library to link with" + NO_SYSTEM_ENVIRONMENT_PATH) + +IF (ZLIB_INCLUDE_DIR AND ZLIB_LIBRARY) + SET(ZLIB_FOUND TRUE) +ENDIF (ZLIB_INCLUDE_DIR AND ZLIB_LIBRARY) diff --git a/config.h b/config.h new file mode 100644 index 0000000..f859377 --- /dev/null +++ b/config.h @@ -0,0 +1,13 @@ +/* GStreamer license */ +#define GST_LICENSE "LGPL" + +/* package name in plugins */ +#define GST_PACKAGE_NAME "VISION Plug-ins GIT/prerelease" + +/* package origin */ +#define GST_PACKAGE_ORIGIN "Unknown package origin" + +/* Version number of package */ +#define VERSION "0.10.0.1" + +#define PACKAGE "gst-plugins-vision" diff --git a/gst/CMakeLists.txt b/gst/CMakeLists.txt new file mode 100644 index 0000000..269334c --- /dev/null +++ b/gst/CMakeLists.txt @@ -0,0 +1,19 @@ +add_definitions(-DHAVE_CONFIG_H) + +set ( SOURCES + gstvideolevels.c ) + +set ( HEADERS + gstvideolevels.h ) + +include_directories(AFTER + . ) + + +add_library ( libgstvision MODULE + ${SOURCES} + ${HEADERS} ) + +target_link_libraries ( libgstvision + general ${GLIB2_LIBRARIES} + general ${GSTREAMER_LIBRARIES} ) diff --git a/gst/gstvideolevels.c b/gst/gstvideolevels.c new file mode 100644 index 0000000..18780ed --- /dev/null +++ b/gst/gstvideolevels.c @@ -0,0 +1,489 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) 2003 Arwed v. Merkatz + * Copyright (C) 2006 Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * This file was (probably) generated from + * gstvideotemplate.c,v 1.12 2004/01/07 21:07:12 ds Exp + * and + * make_filter,v 1.6 2004/01/07 21:33:01 ds Exp + */ + +/** + * SECTION:element-gamma + * + * Performs gamma correction on a video stream. + * + * + * Example launch line + * |[ + * gst-launch videotestsrc ! gamma gamma=2.0 ! ffmpegcolorspace ! ximagesink + * ]| This pipeline will make the image "brighter". + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstvideolevels.h" +#ifdef HAVE_LIBOIL +#include +#endif +#include +#include + +#include + + +GST_DEBUG_CATEGORY_STATIC (videolevels_debug); +#define GST_CAT_DEFAULT videolevels_debug + +/* GstVideoLevels signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_LOWIN, + PROP_HIGHIN, + PROP_LOWOUT, + PROP_HIGHOUT + /* FILL ME */ +}; + +#define DEFAULT_PROP_LOWIN 0 +#define DEFAULT_PROP_HIGHIN 65535 +#define DEFAULT_PROP_LOWOUT 0 +#define DEFAULT_PROP_HIGHOUT 255 + +static const GstElementDetails videolevels_details = +GST_ELEMENT_DETAILS ("Video videolevels adjustment", + "Filter/Effect/Video", + "Adjusts videolevels on a video stream", + "Josh Doe levels_table); + + if(G_OBJECT_CLASS(parent_class)->finalize) { + G_OBJECT_CLASS(parent_class)->finalize(object); + } +} + +static void +gst_videolevels_class_init (GstVideoLevelsClass * g_class) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *trans_class; + + GST_CAT_INFO (videolevels_debug, "gst_videolevels_class_init"); + + gobject_class = G_OBJECT_CLASS (g_class); + trans_class = GST_BASE_TRANSFORM_CLASS (g_class); + + // Register GObject virtual functions + gobject_class->finalize = GST_DEBUG_FUNCPTR(gst_videolevels_finalize); + gobject_class->set_property = GST_DEBUG_FUNCPTR(gst_videolevels_set_property); + gobject_class->get_property = GST_DEBUG_FUNCPTR(gst_videolevels_get_property); + + // Install GObject properties + g_object_class_install_property (gobject_class, PROP_LOWIN, + g_param_spec_int ("low_in", "Lower Input Level", "Lower Input Level", + 0, 65535, DEFAULT_PROP_LOWIN, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_HIGHIN, + g_param_spec_int ("upper_in", "Upper Input Level", "Upper Input Level", + 0, 65535, DEFAULT_PROP_HIGHIN, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_LOWOUT, + g_param_spec_int ("low_out", "Lower Output Level", "Lower Output Level", + 0, 255, DEFAULT_PROP_LOWOUT, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, PROP_HIGHOUT, + g_param_spec_int ("upper_out", "Upper Output Level", "Upper Output Level", + 0, 255, DEFAULT_PROP_HIGHOUT, G_PARAM_READWRITE)); + + // Register GstBaseTransform virtual functions + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_videolevels_set_caps); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_videolevels_transform); + trans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_videolevels_transform_caps); + trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_videolevels_get_unit_size); +} + +static void +gst_videolevels_init (GstVideoLevels * videolevels, GstVideoLevelsClass * g_class) +{ + GST_DEBUG_OBJECT (videolevels, "gst_videolevels_init"); + + videolevels->width=0; + videolevels->height=0; + videolevels->bpp=16; + videolevels->depth=16; + videolevels->levels_table = g_malloc(65536); + reset(videolevels); + calculate_tables (videolevels); +} + +static void +gst_videolevels_set_property (GObject * object, guint prop_id, const GValue * value, + GParamSpec * pspec) +{ + GstVideoLevels *videolevels; + + g_return_if_fail (GST_IS_VIDEOLEVELS (object)); + videolevels = GST_VIDEOLEVELS (object); + + GST_DEBUG ("gst_videolevels_set_property"); + switch (prop_id) { + case PROP_LOWIN: + videolevels->lower_input = g_value_get_int (value); + calculate_tables (videolevels); + break; + case PROP_HIGHIN: + videolevels->upper_input = g_value_get_int (value); + calculate_tables (videolevels); + break; + case PROP_LOWOUT: + videolevels->lower_output = g_value_get_int (value); + calculate_tables (videolevels); + break; + case PROP_HIGHOUT: + videolevels->upper_output = g_value_get_int (value); + calculate_tables (videolevels); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_videolevels_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideoLevels *videolevels; + + g_return_if_fail (GST_IS_VIDEOLEVELS (object)); + videolevels = GST_VIDEOLEVELS (object); + + GST_INFO_OBJECT (videolevels, "gst_videolevels_get_property"); + switch (prop_id) { + case PROP_LOWIN: + g_value_set_int (value, videolevels->lower_input); + break; + case PROP_HIGHIN: + g_value_set_int (value, videolevels->upper_input); + break; + case PROP_LOWOUT: + g_value_set_int (value, videolevels->lower_output); + break; + case PROP_HIGHOUT: + g_value_set_int (value, videolevels->upper_output); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_videolevels_set_caps (GstBaseTransform * base, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVideoLevels *levels; + GstStructure *structure; + gboolean res; + + levels = GST_VIDEOLEVELS (base); + + GST_DEBUG_OBJECT (levels, + "set_caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); + + structure = gst_caps_get_structure (incaps, 0); + + res = gst_structure_get_int (structure, "width", &levels->width); + res &= gst_structure_get_int (structure, "height", &levels->height); + res &= gst_structure_get_int (structure, "bpp", &levels->bpp); + res &= gst_structure_get_int (structure, "depth", &levels->depth); + if (!res) + goto done; + + levels->size = levels->width * levels->height; + calculate_tables(levels); + +done: + return res; +} + +static GstCaps * +gst_videolevels_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) +{ + GstVideoLevels *videolevels; + GstCaps *newcaps; + GstStructure *structure; + GstStructure *newstruct; + int bpp; + + videolevels = GST_VIDEOLEVELS (trans); + + GST_DEBUG_OBJECT (caps, "transforming caps (from)"); + + structure = gst_caps_get_structure (caps, 0); + + newcaps = gst_caps_new_simple ("video/x-raw-gray", NULL); + + newstruct = gst_caps_get_structure (newcaps, 0); + + gst_structure_set_value (newstruct, "width", + gst_structure_get_value (structure, "width")); + gst_structure_set_value (newstruct, "height", + gst_structure_get_value (structure, "height")); + gst_structure_set_value (newstruct, "framerate", + gst_structure_get_value (structure, "framerate")); + + if (direction == GST_PAD_SRC) { + GST_CAT_INFO(videolevels_debug, "direction=SRC"); + bpp = 16; + } else { + GST_CAT_INFO(videolevels_debug, "direction=SINK"); + bpp = 8; + } + + gst_structure_set (newstruct, + "bpp", G_TYPE_INT, bpp, + "depth", G_TYPE_INT, bpp, + NULL + ); + + GST_DEBUG_OBJECT (newcaps, "transforming caps (into)"); + + return newcaps; +} + +static gboolean gst_videolevels_get_unit_size (GstBaseTransform * base, + GstCaps * caps, guint * size) +{ + GstStructure *structure; + int width; + int height; + int pixsize; + + structure = gst_caps_get_structure (caps, 0); + + if (gst_structure_get_int (structure, "width", &width) && + gst_structure_get_int (structure, "height", &height) && + gst_structure_get_int (structure, "bpp", &pixsize)) { + *size = width * height * (pixsize/8); + GST_CAT_DEBUG(videolevels_debug, "Get unit size width=%d,height=%d,size=%d",width,height,*size); + return TRUE; + } + GST_ELEMENT_ERROR (base, CORE, NEGOTIATION, (NULL), + ("Incomplete caps, some required field missing")); + return FALSE; +} + +static void reset(GstVideoLevels* filter) +{ + filter->width = 0; + filter->height = 0; + filter->lower_input = DEFAULT_PROP_LOWIN; + filter->upper_input = DEFAULT_PROP_HIGHIN; + filter->lower_output = DEFAULT_PROP_LOWOUT; + filter->upper_output = DEFAULT_PROP_HIGHOUT; +} + +static GstFlowReturn +gst_videolevels_transform (GstBaseTransform * base, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstVideoLevels *filter = GST_VIDEOLEVELS (base); + guint16 *input; + guint8 *output; + + /* + * We need to lock our filter params to prevent changing + * caps in the middle of a transformation (nice way to get + * segfaults) + */ + GST_OBJECT_LOCK (filter); + + input = (guint16 *) GST_BUFFER_DATA (inbuf); + output = (guint8 *) GST_BUFFER_DATA (outbuf); + + do_levels (filter, input, output, + filter->height * filter->width); + + GST_OBJECT_UNLOCK (filter); + return GST_FLOW_OK; +} + +static void +calculate_tables (GstVideoLevels * videolevels) +{ + int i; + guint16 loIn, hiIn; + guint8 loOut, hiOut; + double slope; + + GST_INFO_OBJECT (videolevels, "gst_videolevels_get_property"); + + GST_BASE_TRANSFORM (videolevels)->passthrough = FALSE; + + loIn = videolevels->lower_input; + hiIn = videolevels->upper_input; + loOut = videolevels->lower_output; + hiOut = videolevels->upper_output; + + + if(hiIn==loIn) + slope=0; + else + slope = (double)(hiOut-loOut)/(hiIn-loIn); + + for(i=0;ilevels_table[i] = loOut; + for(i=loIn;ilevels_table[i] = loOut+(guint8)((i-loIn)*slope); + } + for(i=hiIn;i<65536;i++) + videolevels->levels_table[i] = hiOut; +} + +static void +do_levels (GstVideoLevels * videolevels, guint16 * indata, guint8* outdata, gint size) +{ + int i; + guint8* dst = outdata; + guint16* src = indata; + for (i = 0; i < size; i++) { + *dst++ = videolevels->levels_table[*src++]; + } +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (videolevels_debug, "videolevels", 0, "videolevels"); + GST_CAT_INFO(videolevels_debug, "plugin_init"); + return gst_element_register (plugin, "videolevels", GST_RANK_NONE, GST_TYPE_VIDEOLEVELS); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videolevels", + "Changes videolevels on video images", + plugin_init, + VERSION, + GST_LICENSE, + GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN +); diff --git a/gst/gstvideolevels.h b/gst/gstvideolevels.h new file mode 100644 index 0000000..56339b5 --- /dev/null +++ b/gst/gstvideolevels.h @@ -0,0 +1,80 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2003> David Schleef + * Copyright (C) 2003 Arwed v. Merkatz + * Copyright (C) 2006 Mark Nauwelaerts + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_VIDEO_LEVELS_H__ +#define __GST_VIDEO_LEVELS_H__ + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEOLEVELS \ + (gst_videolevels_get_type()) +#define GST_VIDEOLEVELS(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEOLEVELS,GstVideoLevels)) +#define GST_VIDEOLEVELS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEOLEVELS,GstVideoLevelsClass)) +#define GST_IS_VIDEOLEVELS(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEOLEVELS)) +#define GST_IS_VIDEOLEVELS_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEOLEVELS)) + +typedef struct _GstVideoLevels GstVideoLevels; +typedef struct _GstVideoLevelsClass GstVideoLevelsClass; + +/** + * GstVideoLevels: + * + * Opaque data structure. + */ +struct _GstVideoLevels +{ + GstVideoFilter videofilter; + + /* format */ + gint width; + gint height; + gint bpp; + gint depth; + gint size; + + /* properties */ + guint16 lower_input; + guint16 upper_input; + guint8 lower_output; + guint8 upper_output; + + /* tables */ + guint8* levels_table; +}; + +struct _GstVideoLevelsClass +{ + GstVideoFilterClass parent_class; +}; + +GType gst_videolevels_get_type(void); + +G_END_DECLS + +#endif /* __GST_VIDEO_LEVELS_H__ */ diff --git a/set_paths_and_run_cmake.bat b/set_paths_and_run_cmake.bat new file mode 100644 index 0000000..62a80fc --- /dev/null +++ b/set_paths_and_run_cmake.bat @@ -0,0 +1,21 @@ +rem ######################################################################## +set GSTREAMER_DIR=C:\Users\joshua.doe\Apps\gstreamer +set LIBXML2_DIR=C:\Users\joshua.doe\Apps\gstreamer +set LIBICONV_DIR=C:\Users\joshua.doe\Apps\gstreamer +set GLIB2_DIR=C:\Users\joshua.doe\Apps\gstreamer +set NIIMAQ_DIR=C:\Program Files\National Instruments + +rem cd mingw32 +rem del *ache* && cmake -G "MinGW Makefiles" .. + +rem cd vs8 +rem del *ache* && cmake -G "Visual Studio 8 2005" .. + +cd vs9 +del *ache* && cmake -G "Visual Studio 9 2008" .. + +rem cd codeblocks +rem del *ache* && cmake -G "CodeBlocks - MinGW Makefiles" .. + +cmd +rem ######################################################################## \ No newline at end of file diff --git a/sys/CMakeLists.txt b/sys/CMakeLists.txt new file mode 100644 index 0000000..a002ec3 --- /dev/null +++ b/sys/CMakeLists.txt @@ -0,0 +1,20 @@ +add_definitions(-DHAVE_CONFIG_H) + +set ( SOURCES + gstniimaq.c ) + +set ( HEADERS + gstniimaq.h ) + +include_directories ( AFTER + . + ${NIIMAQ_INCLUDE_DIR} ) + +add_library ( libgstimaq MODULE + ${SOURCES} + ${HEADERS} ) + +target_link_libraries ( libgstimaq + general ${GLIB2_LIBRARIES} + general ${GSTREAMER_LIBRARIES} + general ${NIIMAQ_LIBRARY} ) \ No newline at end of file diff --git a/sys/gstniimaq.c b/sys/gstniimaq.c new file mode 100644 index 0000000..fb99461 --- /dev/null +++ b/sys/gstniimaq.c @@ -0,0 +1,660 @@ +/* GStreamer + * Copyright (C) <2006> Eric Jonas + * Copyright (C) <2006> Antoine Tremblay + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:element-niimaqsrc + * + * Source for IIDC (Instrumentation & Industrial Digital Camera) firewire + * cameras. + * + * + * Example launch line + * |[ + * gst-launch -v niimaqsrc camera-number=0 ! xvimagesink + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstniimaq.h" +//#include +#include +#include + +GST_DEBUG_CATEGORY (niimaq_debug); +#define GST_CAT_DEFAULT niimaq_debug + +static GstElementDetails niimaq_details = +GST_ELEMENT_DETAILS ("NI-IMAQ Video Source", + "Source/Video", + "National Instruments based source, supports CameraLink cameras", + "Josh Doe "); + +enum +{ + PROP_0, + PROP_TIMESTAMP_OFFSET, + PROP_BUFSIZE + /* FILL ME */ +}; + +#define DEFAULT_PROP_TIMESTAMP_OFFSET 0 +#define DEFAULT_PROP_BUFSIZE 10 + +GST_BOILERPLATE (GstNiImaq, gst_niimaq, GstPushSrc, GST_TYPE_PUSH_SRC); + +/* GObject virtual methods */ +static void gst_niimaq_dispose (GObject * object); +static void gst_niimaq_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_niimaq_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +/* GstBaseSrc virtual methods */ +static GstCaps *gst_niimaq_get_caps (GstBaseSrc * bsrc); +static gboolean gst_niimaq_set_caps (GstBaseSrc * bsrc, GstCaps * caps); +static void gst_niimaq_src_fixate (GstPad * pad, GstCaps * caps); +static void gst_niimaq_get_times (GstBaseSrc * basesrc, + GstBuffer * buffer, GstClockTime * start, GstClockTime * end); +static gboolean gst_niimaq_start (GstBaseSrc * src); +static gboolean gst_niimaq_stop (GstBaseSrc * src); + +/* GstPushSrc virtual methods */ +static GstFlowReturn gst_niimaq_create (GstPushSrc * psrc, GstBuffer ** buffer); + +/* GstNiImaq methods */ +static gboolean gst_niimaq_parse_caps (const GstCaps * caps, + gint * width, + gint * height, + gint * rate_numerator, gint * rate_denominator, gint * depth, gint * bpp); + +static gboolean gst_niimaq_set_caps_color (GstStructure * gs, int bpp, int depth); +static gboolean gst_niimaq_set_caps_framesize (GstStructure * gs, gint width, + gint height); + +static GstCaps *gst_niimaq_get_all_niimaq_caps (); +static GstCaps *gst_niimaq_get_cam_caps (GstNiImaq * src); + +static void _____BEGIN_FUNCTIONS_____(); + +static void +gst_niimaq_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details (element_class, &niimaq_details); + + gst_element_class_add_pad_template (element_class, + gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, + gst_niimaq_get_all_niimaq_caps ())); + +} + +static void +gst_niimaq_class_init (GstNiImaqClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->dispose = gst_niimaq_dispose; + gobject_class->set_property = gst_niimaq_set_property; + gobject_class->get_property = gst_niimaq_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_TIMESTAMP_OFFSET, g_param_spec_int64 ("timestamp-offset", + "Timestamp offset", + "An offset added to timestamps set on buffers (in ns)", G_MININT64, + G_MAXINT64, DEFAULT_PROP_TIMESTAMP_OFFSET, G_PARAM_READWRITE)); + + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_BUFSIZE, g_param_spec_int ("buffer-size", + "The number of frames in the dma ringbuffer", + "The number of frames in the dma ringbuffer", 1, + G_MAXINT, DEFAULT_PROP_BUFSIZE, G_PARAM_READWRITE)); + + gstbasesrc_class->get_caps = gst_niimaq_get_caps; + gstbasesrc_class->set_caps = gst_niimaq_set_caps; + + gstbasesrc_class->get_times = gst_niimaq_get_times; + gstpushsrc_class->create = gst_niimaq_create; + gstbasesrc_class->start = gst_niimaq_start; + gstbasesrc_class->stop = gst_niimaq_stop; +} + +static void +gst_niimaq_init (GstNiImaq * src, GstNiImaqClass * g_class) +{ + GstPad *srcpad = GST_BASE_SRC_PAD (src); + + gst_base_src_set_live (GST_BASE_SRC (src), TRUE); + gst_pad_use_fixed_caps (srcpad); + + src->timestamp_offset = 0; + src->caps = gst_niimaq_get_all_niimaq_caps (); + src->bufsize = 10; + src->n_frames = 0; + src->cumbufnum = 0; + src->n_dropped_frames = 0; + src->buflist = 0; + src->sid = 0; + src->iid = 0; + src->device_name = g_strdup_printf ("img2"); + +} + +static void +gst_niimaq_dispose (GObject * object) +{ + GstNiImaq *src = GST_NIIMAQ (object); + + g_free (src->device_name); + src->device_name = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_niimaq_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstNiImaq *src = GST_NIIMAQ (object); + + switch (prop_id) { + case PROP_TIMESTAMP_OFFSET: + src->timestamp_offset = g_value_get_int64 (value); + break; + case PROP_BUFSIZE: + src->bufsize = g_value_get_int (value); + default: + break; + } +} + +static void +gst_niimaq_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstNiImaq *src = GST_NIIMAQ (object); + + switch (prop_id) { + case PROP_TIMESTAMP_OFFSET: + g_value_set_int64 (value, src->timestamp_offset); + break; + case PROP_BUFSIZE: + g_value_set_int (value, src->bufsize); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstCaps * +gst_niimaq_get_caps (GstBaseSrc * bsrc) +{ + GstNiImaq *gsrc; + + gsrc = GST_NIIMAQ (bsrc); + + g_return_val_if_fail (gsrc->caps, NULL); + + return gst_caps_copy (gsrc->caps); +} + + +static gboolean +gst_niimaq_set_caps (GstBaseSrc * bsrc, GstCaps * caps) +{ + + gboolean res = TRUE; + GstNiImaq *niimaq; + gint width, height, rate_denominator, rate_numerator; + gint bpp, depth; + + niimaq = GST_NIIMAQ (bsrc); + + if (niimaq->caps) { + gst_caps_unref (niimaq->caps); + } + + niimaq->caps = gst_niimaq_get_cam_caps(niimaq); + + res = gst_niimaq_parse_caps (niimaq->caps, &width, &height, + &rate_numerator, &rate_denominator, &depth, &bpp); + + if (res) { + /* looks ok here */ + niimaq->width = width; + niimaq->height = height; + niimaq->rate_numerator = rate_numerator; + niimaq->rate_denominator = rate_denominator; + niimaq->depth = depth; + niimaq->bpp = bpp; + niimaq->framesize = width * height * (depth/8); + } + + return res; +} + +static void +gst_niimaq_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, + GstClockTime * start, GstClockTime * end) +{ + /* for live sources, sync on the timestamp of the buffer */ + if (gst_base_src_is_live (basesrc)) { + GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buffer); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + /* get duration to calculate end time */ + GstClockTime duration = GST_BUFFER_DURATION (buffer); + + if (GST_CLOCK_TIME_IS_VALID (duration)) { + *end = timestamp + duration; + } + *start = timestamp; + } + } else { + *start = -1; + *end = -1; + } +} + +static GstFlowReturn +gst_niimaq_create (GstPushSrc * psrc, GstBuffer ** buffer) +{ + GstNiImaq *src; + gpointer data; + GstCaps *caps; + GstFlowReturn res = GST_FLOW_OK; + uInt32 newval, *bufaddr; + Int32 rval; + uInt32 dropped; + + src = GST_NIIMAQ (psrc); + + data = g_malloc(src->framesize); + + GST_INFO_OBJECT(src, "Examining buffer %d", src->cumbufnum); + rval=imgSessionExamineBuffer2(src->sid, src->cumbufnum, &newval, &bufaddr); + if (rval) { + GST_ELEMENT_ERROR (src, RESOURCE, FAILED, + ("failed to examine buffer %d", src->cumbufnum), ("failed to examine buffer %d", src->cumbufnum)); + goto error; + } + + memcpy (data, (guchar *) bufaddr, + src->framesize); + + imgSessionReleaseBuffer(src->sid); + GST_INFO_OBJECT(src, "Releasing buffer %d", newval); + + *buffer = gst_buffer_new (); + GST_BUFFER_DATA (*buffer) = data; + GST_BUFFER_MALLOCDATA (*buffer) = data; + GST_BUFFER_SIZE (*buffer) = src->framesize; + + caps = gst_pad_get_caps (GST_BASE_SRC_PAD (psrc)); + gst_buffer_set_caps (*buffer, caps); + gst_caps_unref (caps); + + //GST_BUFFER_TIMESTAMP (outbuf) = src->timestamp_offset + src->running_time; + //if (src->rate_numerator != 0) { + // GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, + // src->rate_denominator, src->rate_numerator); + //} + + dropped = newval - src->cumbufnum; + if(dropped) { + src->n_dropped_frames += dropped; + GST_WARNING_OBJECT(src, "Dropped %d frames (%d total)",dropped,src->n_dropped_frames); + } + + src->cumbufnum = newval + 1; + src->n_frames++; + //if (src->rate_numerator != 0) { + // src->running_time = gst_util_uint64_scale_int (src->n_frames * GST_SECOND, + // src->rate_denominator, src->rate_numerator); + //} + + return res; + +error: + { + return GST_FLOW_ERROR; + } +} + + +static gboolean +gst_niimaq_parse_caps (const GstCaps * caps, + gint * width, + gint * height, + gint * rate_numerator, gint * rate_denominator, gint * depth, gint * bpp) +{ + const GstStructure *structure; + GstPadLinkReturn ret; + const GValue *framerate; + + if (gst_caps_get_size (caps) < 1) + return FALSE; + + structure = gst_caps_get_structure (caps, 0); + + ret = gst_structure_get_int (structure, "width", width); + ret &= gst_structure_get_int (structure, "height", height); + + framerate = gst_structure_get_value (structure, "framerate"); + + ret &= gst_structure_get_int (structure, "depth", depth); + + ret &= gst_structure_get_int (structure, "bpp", bpp); + + + if (framerate) { + *rate_numerator = gst_value_get_fraction_numerator (framerate); + *rate_denominator = gst_value_get_fraction_denominator (framerate); + } else { + ret = FALSE; + } + + return ret; +} + +/* Set color on caps */ +static gboolean +gst_niimaq_set_caps_color (GstStructure * gs, int bpp, int depth) +{ + gboolean ret = TRUE; + + gst_structure_set_name (gs, "video/x-raw-gray"); + gst_structure_set (gs, + "bpp", G_TYPE_INT, bpp, + "depth", G_TYPE_INT, depth, NULL); + if(depth>8) + gst_structure_set(gs, "endianness", G_TYPE_INT, G_LITTLE_ENDIAN,NULL); + + return ret; +} + + +static gboolean +gst_niimaq_set_caps_framesize (GstStructure * gs, gint width, gint height) +{ + gst_structure_set (gs, + "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); + return TRUE; +} + +GstCaps * +gst_niimaq_get_all_niimaq_caps () +{ + /* + generate all possible caps + + */ + + GstCaps *gcaps; + GstStructure *gs; + gint i = 0; + + gcaps = gst_caps_new_empty (); + + gs = gst_structure_empty_new ("video"); + gst_structure_set_name (gs, "video/x-raw-gray"); + gst_structure_set (gs, + "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "bpp", GST_TYPE_INT_RANGE, 10, 16, + "depth", G_TYPE_INT, 16, + "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + gst_caps_append_structure (gcaps, gs); + + gs = gst_structure_empty_new ("video"); + gst_structure_set_name (gs, "video/x-raw-gray"); + gst_structure_set (gs, + "width", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "height", GST_TYPE_INT_RANGE, 1, G_MAXINT, + "bpp", G_TYPE_INT, 8, + "depth", G_TYPE_INT, 8, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + gst_caps_append_structure (gcaps, gs); + + return gcaps; +} + +GstCaps * +gst_niimaq_get_cam_caps (GstNiImaq * src) +{ + GstCaps *gcaps = NULL; + Int32 rval; + uInt32 val; + int width, height, depth, bpp; + GstStructure *gs; + + gcaps = gst_caps_new_empty (); + + if (!src->iid) { + GST_ELEMENT_ERROR (src, RESOURCE, FAILED, ("Camera interface not open"), + ("Camera interface not open")); + goto error; + } + + rval &= imgGetAttribute(src->iid, IMG_ATTR_BITSPERPIXEL, &val); + bpp = val; + rval &= imgGetAttribute(src->iid, IMG_ATTR_BYTESPERPIXEL, &val); + depth = val*8; + rval &= imgGetAttribute(src->iid, IMG_ATTR_ROI_WIDTH, &val); + width = val; + rval &= imgGetAttribute(src->iid, IMG_ATTR_ROI_HEIGHT, &val); + height = val; + + if (rval) { + GST_ELEMENT_ERROR (src, STREAM, FAILED, + ("attempt to read attributes failed"), + ("attempt to read attributes failed")); + goto error; + } + + gs = gst_structure_empty_new ("video"); + if (!gst_niimaq_set_caps_color(gs, bpp, depth) || + !gst_niimaq_set_caps_framesize(gs, width, height)) { + GST_ELEMENT_ERROR (src, STREAM, FAILED, + ("attempt to set caps %dx%dx%d (%d) failed", width,height,depth, bpp), + ("attempt to set caps %dx%dx%d (%d) failed", width,height,depth, bpp)); + goto error; + } + + gst_structure_set(gs, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + + gst_caps_append_structure (gcaps, gs); + + return gcaps; + +error: + + if (gcaps) { + gst_caps_unref (gcaps); + } + + return NULL; +} + +static gboolean +gst_niimaq_start (GstBaseSrc * src) +{ + GstNiImaq* filter = GST_NIIMAQ(src); + Int32 rval; + int i; + + GST_LOG_OBJECT (filter, "Opening camera interface: %s", filter->device_name); + + filter->iid = 0; + filter->sid = 0; + + rval=imgInterfaceOpen(filter->device_name,&(filter->iid)); + + if (rval) { + GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to open camera interface"), + ("Failed to open camera interface %d", filter->iid)); + goto error; + } + + GST_LOG_OBJECT (filter, "Opening camera session: %s", filter->device_name); + + rval=imgSessionOpen(filter->iid, &(filter->sid)); + if (rval) { + GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to open camera session"), + ("Failed to open camera session %d", filter->sid)); + goto error; + } + + GST_LOG_OBJECT (filter, "Creating ring with %d buffers", filter->bufsize); + + filter->buflist = g_new(guint32*, filter->bufsize); + for(i=0;ibufsize;i++) { + filter->buflist[i] = 0; + } + rval=imgRingSetup(filter->sid, filter->bufsize, (void**)(filter->buflist), 0, FALSE); + if(rval) { + GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to create ring buffer"), + ("Failed to create ring buffer with %d buffers", filter->bufsize)); + goto error; + } + + //GST_LOG_OBJECT (filter, "Registering callback functions"); + //rval=imgSessionWaitSignalAsync2(filter->sid, IMG_SIGNAL_STATUS, IMG_BUF_COMPLETE, IMG_SIGNAL_STATE_RISING, Imaq_BUF_COMPLETE, filter); + //if(rval) { + // GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Failed to register BUF_COMPLETE callback"), + // ("Failed to register BUF_COMPLETE callback")); + // goto error; + //} + + GST_LOG_OBJECT (filter, "Starting acquisition"); + + rval=imgSessionStartAcquisition(filter->sid); + + i = 0; + while (rval != 0 && i++ < 5) { + g_usleep (50000); + if (rval=imgSessionStartAcquisition(filter->sid)) { + if (rval != 0) { + GST_LOG_OBJECT (src, "camera is still off , retrying"); + } + } + } + + if (i >= 5) { + GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, + ("Camera doesn't seem to want to turn on!"), + ("Camera doesn't seem to want to turn on!")); + goto error; + } + + GST_LOG_OBJECT (src, "got transmision status ON"); + + return TRUE; + +error: + + if(filter->sid) + imgClose(filter->sid,TRUE); + filter->sid = 0; + if(filter->iid) + imgClose(filter->iid,TRUE); + filter->iid = 0; + + return FALSE;; + +} + + +gboolean gst_niimaq_stop( GstBaseSrc * src ) +{ + GstNiImaq* filter = GST_NIIMAQ(src); + Int32 rval; + + rval=imgSessionStopAcquisition(filter->sid); + if (rval) { + GST_ELEMENT_ERROR (filter, RESOURCE, FAILED, ("Unable to stop transmision"), + ("Unable to stop transmision")); + } + + if(filter->sid) + imgClose(filter->sid,TRUE); + filter->sid = 0; + if(filter->iid) + imgClose(filter->iid,TRUE); + filter->iid = 0; + + GST_DEBUG_OBJECT (filter, "Capture stoped"); + + return TRUE; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (niimaq_debug, "niimaq", 0, "NI-IMAQ interface"); + + return gst_element_register (plugin, "niimaqsrc", GST_RANK_NONE, + GST_TYPE_NIIMAQ); + +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, +GST_VERSION_MINOR, + "niimaq", + "NI-IMAQ Video Source", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) + + + +// Enumerate cams +// rval=imgInterfaceQueryNames(idx, name); +//if(rval) +//break; +// +//rval=imgInterfaceOpen(name, &iid); +//if(rval) +//continue; +// +//imgGetAttribute(iid, IMG_ATTR_NUM_PORTS, &nPorts); +//imgClose(iid, TRUE); +//for(j=0;j1) { +// char num[33]; +// itoa(j,num,10); +// strcat(name,"::"); //FIXME: this is probably not safe +// strcat(name,num); //FIXME: this is probably not safe +// } +// rval=imgInterfaceOpen(name, &iid); +// if(rval) +// continue; diff --git a/sys/gstniimaq.h b/sys/gstniimaq.h new file mode 100644 index 0000000..f980cd0 --- /dev/null +++ b/sys/gstniimaq.h @@ -0,0 +1,82 @@ +/* GStreamer + * Copyright (C) <2006> Eric Jonas + * Copyright (C) <2006> Antoine Tremblay + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GST_NIIMAQ_H__ +#define __GST_NIIMAQ_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_NIIMAQ \ + (gst_niimaq_get_type()) +#define GST_NIIMAQ(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NIIMAQ,GstNiImaq)) +#define GST_NIIMAQ_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NIIMAQ,GstNiImaq)) +#define GST_IS_NIIMAQ(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NIIMAQ)) +#define GST_IS_NIIMAQ_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NIIMAQ)) + +typedef struct _GstNiImaq GstNiImaq; +typedef struct _GstNiImaqClass GstNiImaqClass; + +struct _GstNiImaq { + GstPushSrc element; + + /* video state */ + gint width; + gint height; + gint depth; + gint bpp; + gint framesize; + + gint rate_numerator; + gint rate_denominator; + + /* private */ + gint64 timestamp_offset; /* base offset */ + GstClockTime running_time; /* total running time */ + gint64 n_frames; /* total frames sent */ + uInt32 cumbufnum; + gint64 n_dropped_frames; + gboolean segment; + gint bufsize; + guint32** buflist; + + gchar *device_name; + INTERFACE_ID iid; + SESSION_ID sid; + + GstCaps *caps; +}; + +struct _GstNiImaqClass { + GstPushSrcClass parent_class; +}; + +GType gst_niimaq_get_type (void); + +G_END_DECLS + +#endif /* __GST_NIIMAQ_H__ */