Initial commit of two preliminary plugins, videolevels and niimaqsrc

This commit is contained in:
Joshua M. Doe
2010-03-12 14:24:43 -05:00
commit 7fff476758
23 changed files with 1865 additions and 0 deletions

29
.gitignore vendored Normal file
View File

@@ -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*

29
.gitignore.bak Normal file
View File

@@ -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*

60
CMakeLists.txt Normal file
View File

@@ -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 )

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

13
config.h Normal file
View File

@@ -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"

19
gst/CMakeLists.txt Normal file
View File

@@ -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} )

489
gst/gstvideolevels.c Normal file
View File

@@ -0,0 +1,489 @@
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* Copyright (C) <2003> David Schleef <ds@schleef.org>
* Copyright (C) 2003 Arwed v. Merkatz <v.merkatz@gmx.net>
* Copyright (C) 2006 Mark Nauwelaerts <manauw@skynet.be>
*
* 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.
*
* <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch videotestsrc ! gamma gamma=2.0 ! ffmpegcolorspace ! ximagesink
* ]| This pipeline will make the image "brighter".
* </refsect2>
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstvideolevels.h"
#ifdef HAVE_LIBOIL
#include <liboil/liboil.h>
#endif
#include <string.h>
#include <math.h>
#include <gst/video/video.h>
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 <oss@nvl.army.mil");
static GstStaticPadTemplate gst_videolevels_src_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
"video/x-raw-gray, " \
"bpp = (int) [10,16], " \
"depth = (int) 16, " \
"endianness = (int) BYTE_ORDER, " \
"width = " GST_VIDEO_SIZE_RANGE ", " \
"height = " GST_VIDEO_SIZE_RANGE ", " \
"framerate = " GST_VIDEO_FPS_RANGE
)
);
static GstStaticPadTemplate gst_videolevels_sink_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS (
"video/x-raw-gray, " \
"bpp = (int) 8, " \
"depth = (int) 8, " \
"endianness = (int) BYTE_ORDER, " \
"width = " GST_VIDEO_SIZE_RANGE ", " \
"height = " GST_VIDEO_SIZE_RANGE ", " \
"framerate = " GST_VIDEO_FPS_RANGE
)
);
//static GstStaticPadTemplate gst_videolevels_sink_template =
//GST_STATIC_PAD_TEMPLATE ("src",
// GST_PAD_SRC,
// GST_PAD_ALWAYS,
// GST_STATIC_CAPS (
// "video/x-raw-gray, " \
// "bpp = (int) 8, " \
// "depth = (int) 8, " \
// "endianness = (int) BYTE_ORDER, " \
// "width = " GST_VIDEO_SIZE_RANGE ", " \
// "height = " GST_VIDEO_SIZE_RANGE ", " \
// "framerate = " GST_VIDEO_FPS_RANGE
// )
//);
static void gst_videolevels_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_videolevels_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static gboolean gst_videolevels_set_caps (GstBaseTransform * base, GstCaps * incaps,
GstCaps * outcaps);
static GstFlowReturn gst_videolevels_transform (GstBaseTransform * base, GstBuffer * inbuf,
GstBuffer * outbuf);
static GstCaps * gst_videolevels_transform_caps (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps);
static gboolean gst_videolevels_get_unit_size (GstBaseTransform * base,
GstCaps * caps, guint * size);
static void reset(GstVideoLevels* filter);
static void calculate_tables (GstVideoLevels * videolevels);
static void do_levels (GstVideoLevels * videolevels, guint16 * indata, guint8* outdata, gint size);
GST_BOILERPLATE (GstVideoLevels, gst_videolevels, GstVideoFilter, GST_TYPE_VIDEO_FILTER);
static void
gst_videolevels_base_init (gpointer g_class)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
GST_CAT_INFO(videolevels_debug, "gst_videolevels_base_init");
gst_element_class_set_details (element_class, &videolevels_details);
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_videolevels_sink_template));
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&gst_videolevels_src_template));
}
static void
gst_videolevels_finalize (GObject *object)
{
GstVideoLevels *videolevels;
GST_CAT_INFO (videolevels_debug, "gst_videolevels_finalize");
g_return_if_fail (GST_IS_VIDEOLEVELS (object));
videolevels = GST_VIDEOLEVELS (object);
g_free(videolevels->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;i<loIn;i++)
videolevels->levels_table[i] = loOut;
for(i=loIn;i<hiIn;i++) {
videolevels->levels_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
);

80
gst/gstvideolevels.h Normal file
View File

@@ -0,0 +1,80 @@
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* Copyright (C) <2003> David Schleef <ds@schleef.org>
* Copyright (C) 2003 Arwed v. Merkatz <v.merkatz@gmx.net>
* Copyright (C) 2006 Mark Nauwelaerts <manauw@skynet.be>
*
* 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 <gst/video/gstvideofilter.h>
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__ */

View File

@@ -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 ########################################################################

20
sys/CMakeLists.txt Normal file
View File

@@ -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} )

660
sys/gstniimaq.c Normal file
View File

@@ -0,0 +1,660 @@
/* GStreamer
* Copyright (C) <2006> Eric Jonas <jonas@mit.edu>
* Copyright (C) <2006> Antoine Tremblay <hexa00@gmail.com>
*
* 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.
*
* <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch -v niimaqsrc camera-number=0 ! xvimagesink
* ]|
* </refsect2>
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstniimaq.h"
//#include <sys/time.h>
#include <time.h>
#include <string.h>
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 <oss@nvl.army.mil>");
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;i<filter->bufsize;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;j<nPorts;j++) {
// if(nPorts>1) {
// 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;

82
sys/gstniimaq.h Normal file
View File

@@ -0,0 +1,82 @@
/* GStreamer
* Copyright (C) <2006> Eric Jonas <jonas@mit.edu>
* Copyright (C) <2006> Antoine Tremblay <hexa00@gmail.com>
*
* 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 <gst/gst.h>
#include <gst/base/gstpushsrc.h>
#include <niimaq.h>
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__ */