diff options
author | Kibum Kim <kb0929.kim@samsung.com> | 2012-01-07 00:46:56 +0900 |
---|---|---|
committer | Kibum Kim <kb0929.kim@samsung.com> | 2012-01-07 00:46:56 +0900 |
commit | 4fcf0a9192ac1dee34309a66be632530b66f6822 (patch) | |
tree | e09f9233b63b22f97084798dcf6ffd3c85cc3adb /gst/videocrop | |
parent | dfa84b358c7cdf0535eba1fead62fc4122cc56e6 (diff) | |
download | gst-plugins-good0.10-4fcf0a9192ac1dee34309a66be632530b66f6822.tar.gz gst-plugins-good0.10-4fcf0a9192ac1dee34309a66be632530b66f6822.tar.bz2 gst-plugins-good0.10-4fcf0a9192ac1dee34309a66be632530b66f6822.zip |
Git init
Diffstat (limited to 'gst/videocrop')
-rw-r--r-- | gst/videocrop/Makefile.am | 28 | ||||
-rw-r--r-- | gst/videocrop/Makefile.in | 833 | ||||
-rw-r--r-- | gst/videocrop/gstaspectratiocrop.c | 453 | ||||
-rw-r--r-- | gst/videocrop/gstaspectratiocrop.h | 67 | ||||
-rw-r--r-- | gst/videocrop/gstvideocrop.c | 761 | ||||
-rw-r--r-- | gst/videocrop/gstvideocrop.h | 92 |
6 files changed, 2234 insertions, 0 deletions
diff --git a/gst/videocrop/Makefile.am b/gst/videocrop/Makefile.am new file mode 100644 index 0000000..2b9838b --- /dev/null +++ b/gst/videocrop/Makefile.am @@ -0,0 +1,28 @@ +plugin_LTLIBRARIES = libgstvideocrop.la + +# Note: we only use defines from gst/video/video.h, but none +# of the functions, so we don't need to link to libgstvideo + +libgstvideocrop_la_SOURCES = gstvideocrop.c gstaspectratiocrop.c +libgstvideocrop_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstvideocrop_la_LIBADD = $(GST_BASE_LIBS) +libgstvideocrop_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideocrop_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstvideocrop.h gstaspectratiocrop.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideocrop -:SHARED libgstvideocrop \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideocrop_la_SOURCES) \ + $(nodist_libgstvideocrop_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideocrop_la_CFLAGS) \ + -:LDFLAGS $(libgstvideocrop_la_LDFLAGS) \ + $(libgstvideocrop_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/videocrop/Makefile.in b/gst/videocrop/Makefile.in new file mode 100644 index 0000000..2464329 --- /dev/null +++ b/gst/videocrop/Makefile.in @@ -0,0 +1,833 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = gst/videocrop +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \ + $(top_srcdir)/common/m4/as-auto-alt.m4 \ + $(top_srcdir)/common/m4/as-compiler-flag.m4 \ + $(top_srcdir)/common/m4/as-gcc-inline-assembly.m4 \ + $(top_srcdir)/common/m4/as-objc.m4 \ + $(top_srcdir)/common/m4/as-python.m4 \ + $(top_srcdir)/common/m4/as-scrub-include.m4 \ + $(top_srcdir)/common/m4/as-version.m4 \ + $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \ + $(top_srcdir)/common/m4/gst-arch.m4 \ + $(top_srcdir)/common/m4/gst-args.m4 \ + $(top_srcdir)/common/m4/gst-check.m4 \ + $(top_srcdir)/common/m4/gst-default.m4 \ + $(top_srcdir)/common/m4/gst-dowhile.m4 \ + $(top_srcdir)/common/m4/gst-error.m4 \ + $(top_srcdir)/common/m4/gst-feature.m4 \ + $(top_srcdir)/common/m4/gst-gettext.m4 \ + $(top_srcdir)/common/m4/gst-glib2.m4 \ + $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \ + $(top_srcdir)/common/m4/gst-platform.m4 \ + $(top_srcdir)/common/m4/gst-plugin-docs.m4 \ + $(top_srcdir)/common/m4/gst-plugindir.m4 \ + $(top_srcdir)/common/m4/gst-x11.m4 \ + $(top_srcdir)/common/m4/gst.m4 \ + $(top_srcdir)/common/m4/gtk-doc.m4 \ + $(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \ + $(top_srcdir)/m4/aalib.m4 $(top_srcdir)/m4/esd.m4 \ + $(top_srcdir)/m4/gconf-2.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gst-fionread.m4 \ + $(top_srcdir)/m4/gst-shout2.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__installdirs = "$(DESTDIR)$(plugindir)" +LTLIBRARIES = $(plugin_LTLIBRARIES) +am__DEPENDENCIES_1 = +libgstvideocrop_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libgstvideocrop_la_OBJECTS = libgstvideocrop_la-gstvideocrop.lo \ + libgstvideocrop_la-gstaspectratiocrop.lo +libgstvideocrop_la_OBJECTS = $(am_libgstvideocrop_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libgstvideocrop_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) \ + $(libgstvideocrop_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libgstvideocrop_la_SOURCES) +DIST_SOURCES = $(libgstvideocrop_la_SOURCES) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +AALIB_CFLAGS = @AALIB_CFLAGS@ +AALIB_CONFIG = @AALIB_CONFIG@ +AALIB_LIBS = @AALIB_LIBS@ +ACLOCAL = @ACLOCAL@ +ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +ANNODEX_CFLAGS = @ANNODEX_CFLAGS@ +ANNODEX_LIBS = @ANNODEX_LIBS@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BZ2_LIBS = @BZ2_LIBS@ +CAIRO_CFLAGS = @CAIRO_CFLAGS@ +CAIRO_GOBJECT_CFLAGS = @CAIRO_GOBJECT_CFLAGS@ +CAIRO_GOBJECT_LIBS = @CAIRO_GOBJECT_LIBS@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCAS = @CCAS@ +CCASDEPMODE = @CCASDEPMODE@ +CCASFLAGS = @CCASFLAGS@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@ +DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@ +DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@ +DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@ +DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@ +DIRECTSOUND_CFLAGS = @DIRECTSOUND_CFLAGS@ +DIRECTSOUND_LDFLAGS = @DIRECTSOUND_LDFLAGS@ +DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +DV1394_CFLAGS = @DV1394_CFLAGS@ +DV1394_LIBS = @DV1394_LIBS@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ERROR_CFLAGS = @ERROR_CFLAGS@ +ERROR_CXXFLAGS = @ERROR_CXXFLAGS@ +ESD_CFLAGS = @ESD_CFLAGS@ +ESD_CONFIG = @ESD_CONFIG@ +ESD_LIBS = @ESD_LIBS@ +EXEEXT = @EXEEXT@ +FFLAGS = @FFLAGS@ +FGREP = @FGREP@ +FLAC_CFLAGS = @FLAC_CFLAGS@ +FLAC_LIBS = @FLAC_LIBS@ +GCONFTOOL = @GCONFTOOL@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ +GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ +GCOV = @GCOV@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDK_PIXBUF_CFLAGS = @GDK_PIXBUF_CFLAGS@ +GDK_PIXBUF_LIBS = @GDK_PIXBUF_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB_CFLAGS = @GLIB_CFLAGS@ +GLIB_LIBS = @GLIB_LIBS@ +GLIB_PREFIX = @GLIB_PREFIX@ +GLIB_REQ = @GLIB_REQ@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@ +GSTPB_PREFIX = @GSTPB_PREFIX@ +GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@ +GST_BASE_CFLAGS = @GST_BASE_CFLAGS@ +GST_BASE_LIBS = @GST_BASE_LIBS@ +GST_CFLAGS = @GST_CFLAGS@ +GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@ +GST_CHECK_LIBS = @GST_CHECK_LIBS@ +GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@ +GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@ +GST_CXXFLAGS = @GST_CXXFLAGS@ +GST_GDP_CFLAGS = @GST_GDP_CFLAGS@ +GST_GDP_LIBS = @GST_GDP_LIBS@ +GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@ +GST_LIBS = @GST_LIBS@ +GST_LICENSE = @GST_LICENSE@ +GST_LT_LDFLAGS = @GST_LT_LDFLAGS@ +GST_MAJORMINOR = @GST_MAJORMINOR@ +GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@ +GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@ +GST_PACKAGE_NAME = @GST_PACKAGE_NAME@ +GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@ +GST_PLUGINS_ALL = @GST_PLUGINS_ALL@ +GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@ +GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@ +GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@ +GST_PLUGINS_DIR = @GST_PLUGINS_DIR@ +GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@ +GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ +GST_PREFIX = @GST_PREFIX@ +GST_TOOLS_DIR = @GST_TOOLS_DIR@ +GTKDOC_CHECK = @GTKDOC_CHECK@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_LIBS = @GTK_LIBS@ +GTK_X11_CFLAGS = @GTK_X11_CFLAGS@ +GTK_X11_LIBS = @GTK_X11_LIBS@ +GUDEV_CFLAGS = @GUDEV_CFLAGS@ +GUDEV_LIBS = @GUDEV_LIBS@ +HAL_CFLAGS = @HAL_CFLAGS@ +HAL_LIBS = @HAL_LIBS@ +HAVE_AVC1394 = @HAVE_AVC1394@ +HAVE_BZ2 = @HAVE_BZ2@ +HAVE_CXX = @HAVE_CXX@ +HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@ +HAVE_GCONFTOOL = @HAVE_GCONFTOOL@ +HAVE_ROM1394 = @HAVE_ROM1394@ +HAVE_SPEEX = @HAVE_SPEEX@ +HAVE_X = @HAVE_X@ +HAVE_XSHM = @HAVE_XSHM@ +HAVE_ZLIB = @HAVE_ZLIB@ +HTML_DIR = @HTML_DIR@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_0_120_1_CFLAGS = @JACK_0_120_1_CFLAGS@ +JACK_0_120_1_LIBS = @JACK_0_120_1_LIBS@ +JACK_1_9_7_CFLAGS = @JACK_1_9_7_CFLAGS@ +JACK_1_9_7_LIBS = @JACK_1_9_7_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +JPEG_LIBS = @JPEG_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBCACA_CFLAGS = @LIBCACA_CFLAGS@ +LIBCACA_CONFIG = @LIBCACA_CONFIG@ +LIBCACA_LIBS = @LIBCACA_LIBS@ +LIBDV_CFLAGS = @LIBDV_CFLAGS@ +LIBDV_LIBS = @LIBDV_LIBS@ +LIBICONV = @LIBICONV@ +LIBIEC61883_CFLAGS = @LIBIEC61883_CFLAGS@ +LIBIEC61883_LIBS = @LIBIEC61883_LIBS@ +LIBINTL = @LIBINTL@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBPNG_CFLAGS = @LIBPNG_CFLAGS@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBV4L2_CFLAGS = @LIBV4L2_CFLAGS@ +LIBV4L2_LIBS = @LIBV4L2_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LOCALEDIR = @LOCALEDIR@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJC_LDFLAGS = @OBJC_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@ +PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@ +PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@ +PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@ +PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PLUGINDIR = @PLUGINDIR@ +POSUB = @POSUB@ +PROFILE_CFLAGS = @PROFILE_CFLAGS@ +PULSE_0_9_11_CFLAGS = @PULSE_0_9_11_CFLAGS@ +PULSE_0_9_11_LIBS = @PULSE_0_9_11_LIBS@ +PULSE_0_9_12_CFLAGS = @PULSE_0_9_12_CFLAGS@ +PULSE_0_9_12_LIBS = @PULSE_0_9_12_LIBS@ +PULSE_0_9_13_CFLAGS = @PULSE_0_9_13_CFLAGS@ +PULSE_0_9_13_LIBS = @PULSE_0_9_13_LIBS@ +PULSE_0_9_15_CFLAGS = @PULSE_0_9_15_CFLAGS@ +PULSE_0_9_15_LIBS = @PULSE_0_9_15_LIBS@ +PULSE_0_9_16_CFLAGS = @PULSE_0_9_16_CFLAGS@ +PULSE_0_9_16_LIBS = @PULSE_0_9_16_LIBS@ +PULSE_0_9_20_CFLAGS = @PULSE_0_9_20_CFLAGS@ +PULSE_0_9_20_LIBS = @PULSE_0_9_20_LIBS@ +PULSE_CFLAGS = @PULSE_CFLAGS@ +PULSE_LIBS = @PULSE_LIBS@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RAW1394_CFLAGS = @RAW1394_CFLAGS@ +RAW1394_LIBS = @RAW1394_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHOUT2_CFLAGS = @SHOUT2_CFLAGS@ +SHOUT2_LIBS = @SHOUT2_LIBS@ +SOUP_CFLAGS = @SOUP_CFLAGS@ +SOUP_LIBS = @SOUP_LIBS@ +SPEEX_CFLAGS = @SPEEX_CFLAGS@ +SPEEX_LIBS = @SPEEX_LIBS@ +STRIP = @STRIP@ +TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ +TAGLIB_CXXFLAGS = @TAGLIB_CXXFLAGS@ +TAGLIB_LIBS = @TAGLIB_LIBS@ +USE_NLS = @USE_NLS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VALGRIND_PATH = @VALGRIND_PATH@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WAVPACK_CFLAGS = @WAVPACK_CFLAGS@ +WAVPACK_LIBS = @WAVPACK_LIBS@ +WIN32_LIBS = @WIN32_LIBS@ +XDAMAGE_CFLAGS = @XDAMAGE_CFLAGS@ +XDAMAGE_LIBS = @XDAMAGE_LIBS@ +XFIXES_CFLAGS = @XFIXES_CFLAGS@ +XFIXES_LIBS = @XFIXES_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +XMKMF = @XMKMF@ +XSHM_LIBS = @XSHM_LIBS@ +XVIDEO_LIBS = @XVIDEO_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ZLIB_LIBS = @ZLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +plugindir = @plugindir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +plugin_LTLIBRARIES = libgstvideocrop.la + +# Note: we only use defines from gst/video/video.h, but none +# of the functions, so we don't need to link to libgstvideo +libgstvideocrop_la_SOURCES = gstvideocrop.c gstaspectratiocrop.c +libgstvideocrop_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) + +libgstvideocrop_la_LIBADD = $(GST_BASE_LIBS) +libgstvideocrop_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstvideocrop_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS = gstvideocrop.h gstaspectratiocrop.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videocrop/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu gst/videocrop/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ + } + +uninstall-pluginLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ + done + +clean-pluginLTLIBRARIES: + -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) + @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgstvideocrop.la: $(libgstvideocrop_la_OBJECTS) $(libgstvideocrop_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgstvideocrop_la_LINK) -rpath $(plugindir) $(libgstvideocrop_la_OBJECTS) $(libgstvideocrop_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideocrop_la-gstvideocrop.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libgstvideocrop_la-gstvideocrop.lo: gstvideocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -MT libgstvideocrop_la-gstvideocrop.lo -MD -MP -MF $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Tpo -c -o libgstvideocrop_la-gstvideocrop.lo `test -f 'gstvideocrop.c' || echo '$(srcdir)/'`gstvideocrop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Tpo $(DEPDIR)/libgstvideocrop_la-gstvideocrop.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvideocrop.c' object='libgstvideocrop_la-gstvideocrop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -c -o libgstvideocrop_la-gstvideocrop.lo `test -f 'gstvideocrop.c' || echo '$(srcdir)/'`gstvideocrop.c + +libgstvideocrop_la-gstaspectratiocrop.lo: gstaspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -MT libgstvideocrop_la-gstaspectratiocrop.lo -MD -MP -MF $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Tpo -c -o libgstvideocrop_la-gstaspectratiocrop.lo `test -f 'gstaspectratiocrop.c' || echo '$(srcdir)/'`gstaspectratiocrop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Tpo $(DEPDIR)/libgstvideocrop_la-gstaspectratiocrop.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstaspectratiocrop.c' object='libgstvideocrop_la-gstaspectratiocrop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideocrop_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideocrop_la_CFLAGS) $(CFLAGS) -c -o libgstvideocrop_la-gstaspectratiocrop.lo `test -f 'gstaspectratiocrop.c' || echo '$(srcdir)/'`gstaspectratiocrop.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(plugindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-pluginLTLIBRARIES + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pluginLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-pluginLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pluginLTLIBRARIES \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-pluginLTLIBRARIES + + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstvideocrop -:SHARED libgstvideocrop \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstvideocrop_la_SOURCES) \ + $(nodist_libgstvideocrop_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstvideocrop_la_CFLAGS) \ + -:LDFLAGS $(libgstvideocrop_la_LDFLAGS) \ + $(libgstvideocrop_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/gst/videocrop/gstaspectratiocrop.c b/gst/videocrop/gstaspectratiocrop.c new file mode 100644 index 0000000..d932b22 --- /dev/null +++ b/gst/videocrop/gstaspectratiocrop.c @@ -0,0 +1,453 @@ +/* GStreamer video frame cropping to aspect-ratio + * Copyright (C) 2009 Thijs Vermeir <thijsvermeir@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-aspectratiocrop + * @see_also: #GstVideoCrop + * + * This element crops video frames to a specified #GstAspectRatioCrop:aspect-ratio. + * + * If the aspect-ratio is already correct, the element will operate + * in pass-through mode. + * + * <refsect2> + * <title>Example launch line</title> + * |[ + * gst-launch -v videotestsrc ! video/x-raw-rgb,height=640,width=480 ! aspectratiocrop aspect-ratio=16/9 ! ximagesink + * ]| This pipeline generates a videostream in 4/3 and crops it to 16/9. + * </refsect2> + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> + +#include "gstaspectratiocrop.h" + +GST_DEBUG_CATEGORY_STATIC (aspect_ratio_crop_debug); +#define GST_CAT_DEFAULT aspect_ratio_crop_debug + +enum +{ + ARG_0, + ARG_ASPECT_RATIO_CROP, +}; + +/* we support the same caps as videocrop */ +#define ASPECT_RATIO_CROP_CAPS \ + GST_VIDEO_CAPS_RGBx ";" \ + GST_VIDEO_CAPS_xRGB ";" \ + GST_VIDEO_CAPS_BGRx ";" \ + GST_VIDEO_CAPS_xBGR ";" \ + GST_VIDEO_CAPS_RGBA ";" \ + GST_VIDEO_CAPS_ARGB ";" \ + GST_VIDEO_CAPS_BGRA ";" \ + GST_VIDEO_CAPS_ABGR ";" \ + GST_VIDEO_CAPS_RGB ";" \ + GST_VIDEO_CAPS_BGR ";" \ + GST_VIDEO_CAPS_YUV ("AYUV") ";" \ + GST_VIDEO_CAPS_YUV ("YUY2") ";" \ + GST_VIDEO_CAPS_YUV ("YVYU") ";" \ + GST_VIDEO_CAPS_YUV ("UYVY") ";" \ + GST_VIDEO_CAPS_YUV ("Y800") ";" \ + GST_VIDEO_CAPS_YUV ("I420") ";" \ + GST_VIDEO_CAPS_YUV ("YV12") ";" \ + GST_VIDEO_CAPS_RGB_16 ";" \ + GST_VIDEO_CAPS_RGB_15 + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (ASPECT_RATIO_CROP_CAPS) + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (ASPECT_RATIO_CROP_CAPS) + ); + +GST_BOILERPLATE (GstAspectRatioCrop, gst_aspect_ratio_crop, GstBin, + GST_TYPE_BIN); + +static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static void gst_aspect_ratio_crop_set_cropping (GstAspectRatioCrop * + aspect_ratio_crop, gint top, gint right, gint bottom, gint left); +static GstCaps *gst_aspect_ratio_crop_get_caps (GstPad * pad); +static gboolean gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps); +static void gst_aspect_ratio_crop_finalize (GObject * object); +static void gst_aspect_ratio_transform_structure (GstAspectRatioCrop * + aspect_ratio_crop, GstStructure * structure, GstStructure ** new_structure, + gboolean set_videocrop); + +static void +gst_aspect_ratio_crop_set_cropping (GstAspectRatioCrop * aspect_ratio_crop, + gint top, gint right, gint bottom, gint left) +{ + GValue value = { 0 }; + if (G_UNLIKELY (!aspect_ratio_crop->videocrop)) { + GST_WARNING_OBJECT (aspect_ratio_crop, + "Can't set the settings if there is no cropping element"); + return; + } + + g_value_init (&value, G_TYPE_INT); + g_value_set_int (&value, top); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set top cropping to: %d", top); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "top", + &value); + g_value_set_int (&value, right); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set right cropping to: %d", right); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "right", + &value); + g_value_set_int (&value, bottom); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set bottom cropping to: %d", bottom); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "bottom", + &value); + g_value_set_int (&value, left); + GST_DEBUG_OBJECT (aspect_ratio_crop, "set left cropping to: %d", left); + g_object_set_property (G_OBJECT (aspect_ratio_crop->videocrop), "left", + &value); + + g_value_unset (&value); +} + +static gboolean +gst_aspect_ratio_crop_set_caps (GstPad * pad, GstCaps * caps) +{ + GstAspectRatioCrop *aspect_ratio_crop; + GstPad *peer_pad; + GstStructure *structure; + gboolean ret; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); + + g_mutex_lock (aspect_ratio_crop->crop_lock); + + structure = gst_caps_get_structure (caps, 0); + gst_aspect_ratio_transform_structure (aspect_ratio_crop, structure, NULL, + TRUE); + peer_pad = + gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), + "sink"); + ret = gst_pad_set_caps (peer_pad, caps); + gst_object_unref (peer_pad); + gst_object_unref (aspect_ratio_crop); + g_mutex_unlock (aspect_ratio_crop->crop_lock); + return ret; +} + +static void +gst_aspect_ratio_crop_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "aspectratiocrop", + "Filter/Effect/Video", + "Crops video into a user-defined aspect-ratio", + "Thijs Vermeir <thijsvermeir@gmail.com>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); +} + +static void +gst_aspect_ratio_crop_class_init (GstAspectRatioCropClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) klass; + + gobject_class->set_property = gst_aspect_ratio_crop_set_property; + gobject_class->get_property = gst_aspect_ratio_crop_get_property; + gobject_class->finalize = gst_aspect_ratio_crop_finalize; + + g_object_class_install_property (gobject_class, ARG_ASPECT_RATIO_CROP, + gst_param_spec_fraction ("aspect-ratio", "aspect-ratio", + "Target aspect-ratio of video", 0, 1, G_MAXINT, 1, 0, 1, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +} + +static void +gst_aspect_ratio_crop_finalize (GObject * object) +{ + GstAspectRatioCrop *aspect_ratio_crop; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); + + if (aspect_ratio_crop->crop_lock) + g_mutex_free (aspect_ratio_crop->crop_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_aspect_ratio_crop_init (GstAspectRatioCrop * aspect_ratio_crop, + GstAspectRatioCropClass * klass) +{ + GstPad *link_pad; + GstPad *src_pad; + + GST_DEBUG_CATEGORY_INIT (aspect_ratio_crop_debug, "aspectratiocrop", 0, + "aspectratiocrop"); + + aspect_ratio_crop->ar_num = 0; + aspect_ratio_crop->ar_denom = 1; + + aspect_ratio_crop->crop_lock = g_mutex_new (); + + /* add the transform element */ + aspect_ratio_crop->videocrop = gst_element_factory_make ("videocrop", NULL); + gst_bin_add (GST_BIN (aspect_ratio_crop), aspect_ratio_crop->videocrop); + + /* create ghost pad src */ + link_pad = + gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), + "src"); + src_pad = gst_ghost_pad_new ("src", link_pad); + gst_pad_set_getcaps_function (src_pad, + GST_DEBUG_FUNCPTR (gst_aspect_ratio_crop_get_caps)); + gst_element_add_pad (GST_ELEMENT (aspect_ratio_crop), src_pad); + gst_object_unref (link_pad); + /* create ghost pad sink */ + link_pad = + gst_element_get_static_pad (GST_ELEMENT (aspect_ratio_crop->videocrop), + "sink"); + aspect_ratio_crop->sink = gst_ghost_pad_new ("sink", link_pad); + gst_element_add_pad (GST_ELEMENT (aspect_ratio_crop), + aspect_ratio_crop->sink); + gst_object_unref (link_pad); + gst_pad_set_setcaps_function (aspect_ratio_crop->sink, + GST_DEBUG_FUNCPTR (gst_aspect_ratio_crop_set_caps)); +} + +static void +gst_aspect_ratio_transform_structure (GstAspectRatioCrop * aspect_ratio_crop, + GstStructure * structure, GstStructure ** new_structure, + gboolean set_videocrop) +{ + gdouble incoming_ar; + gdouble requested_ar; + gint width, height; + gint cropvalue; + gint par_d, par_n; + + /* Check if we need to change the aspect ratio */ + if (aspect_ratio_crop->ar_num < 1) { + GST_DEBUG_OBJECT (aspect_ratio_crop, "No cropping requested"); + goto beach; + } + + /* get the information from the caps */ + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) + goto beach; + + if (!gst_structure_get_fraction (structure, "pixel-aspect-ratio", + &par_n, &par_d)) { + par_d = par_n = 1; + } + + incoming_ar = ((gdouble) (width * par_n)) / (height * par_d); + GST_LOG_OBJECT (aspect_ratio_crop, + "incoming caps width(%d), height(%d), par (%d/%d) : ar = %f", width, + height, par_n, par_d, incoming_ar); + + requested_ar = + (gdouble) aspect_ratio_crop->ar_num / aspect_ratio_crop->ar_denom; + + /* check if the original aspect-ratio is the aspect-ratio that we want */ + if (requested_ar == incoming_ar) { + GST_DEBUG_OBJECT (aspect_ratio_crop, + "Input video already has the correct aspect ratio (%.3f == %.3f)", + incoming_ar, requested_ar); + goto beach; + } else if (requested_ar > incoming_ar) { + /* fix aspect ratio with cropping on top and bottom */ + cropvalue = + ((((double) aspect_ratio_crop->ar_denom / + (double) (aspect_ratio_crop->ar_num)) * ((double) par_n / + (double) par_d) * width) - height) / 2; + if (cropvalue < 0) { + cropvalue *= -1; + } + if (cropvalue >= (height / 2)) + goto crop_failed; + if (set_videocrop) { + gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, cropvalue, 0, + cropvalue, 0); + } + if (new_structure) { + *new_structure = gst_structure_copy (structure); + gst_structure_set (*new_structure, + "height", G_TYPE_INT, (int) (height - (cropvalue * 2)), NULL); + } + } else { + /* fix aspect ratio with cropping on left and right */ + cropvalue = + ((((double) aspect_ratio_crop->ar_num / + (double) (aspect_ratio_crop->ar_denom)) * ((double) par_d / + (double) par_n) * height) - width) / 2; + if (cropvalue < 0) { + cropvalue *= -1; + } + if (cropvalue >= (width / 2)) + goto crop_failed; + if (set_videocrop) { + gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, 0, cropvalue, + 0, cropvalue); + } + if (new_structure) { + *new_structure = gst_structure_copy (structure); + gst_structure_set (*new_structure, + "width", G_TYPE_INT, (int) (width - (cropvalue * 2)), NULL); + } + } + + return; + +crop_failed: + GST_WARNING_OBJECT (aspect_ratio_crop, + "can't crop to aspect ratio requested"); + goto beach; +beach: + if (set_videocrop) { + gst_aspect_ratio_crop_set_cropping (aspect_ratio_crop, 0, 0, 0, 0); + } + + if (new_structure) { + *new_structure = gst_structure_copy (structure); + } +} + +static GstCaps * +gst_aspect_ratio_crop_transform_caps (GstAspectRatioCrop * aspect_ratio_crop, + GstCaps * caps) +{ + GstCaps *transform; + gint size, i; + + transform = gst_caps_new_empty (); + + size = gst_caps_get_size (caps); + + for (i = 0; i < size; i++) { + GstStructure *s; + GstStructure *trans_s; + + s = gst_caps_get_structure (caps, i); + + gst_aspect_ratio_transform_structure (aspect_ratio_crop, s, &trans_s, + FALSE); + gst_caps_append_structure (transform, trans_s); + } + + return transform; +} + +static GstCaps * +gst_aspect_ratio_crop_get_caps (GstPad * pad) +{ + GstPad *peer; + GstAspectRatioCrop *aspect_ratio_crop; + GstCaps *return_caps; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (gst_pad_get_parent (pad)); + + g_mutex_lock (aspect_ratio_crop->crop_lock); + + peer = gst_pad_get_peer (aspect_ratio_crop->sink); + if (peer == NULL) { + return_caps = gst_static_pad_template_get_caps (&src_template); + gst_caps_ref (return_caps); + } else { + GstCaps *peer_caps; + + peer_caps = gst_pad_get_caps (peer); + return_caps = + gst_aspect_ratio_crop_transform_caps (aspect_ratio_crop, peer_caps); + gst_caps_unref (peer_caps); + gst_object_unref (peer); + } + + g_mutex_unlock (aspect_ratio_crop->crop_lock); + gst_object_unref (aspect_ratio_crop); + + return return_caps; +} + +static void +gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAspectRatioCrop *aspect_ratio_crop; + gboolean recheck = FALSE; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); + + GST_OBJECT_LOCK (aspect_ratio_crop); + switch (prop_id) { + case ARG_ASPECT_RATIO_CROP: + if (GST_VALUE_HOLDS_FRACTION (value)) { + aspect_ratio_crop->ar_num = gst_value_get_fraction_numerator (value); + aspect_ratio_crop->ar_denom = + gst_value_get_fraction_denominator (value); + recheck = (GST_PAD_CAPS (aspect_ratio_crop->sink) != NULL); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (aspect_ratio_crop); + + if (recheck) { + gst_aspect_ratio_crop_set_caps (aspect_ratio_crop->sink, + GST_PAD_CAPS (aspect_ratio_crop->sink)); + } +} + +static void +gst_aspect_ratio_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAspectRatioCrop *aspect_ratio_crop; + + aspect_ratio_crop = GST_ASPECT_RATIO_CROP (object); + + GST_OBJECT_LOCK (aspect_ratio_crop); + switch (prop_id) { + case ARG_ASPECT_RATIO_CROP: + gst_value_set_fraction (value, aspect_ratio_crop->ar_num, + aspect_ratio_crop->ar_denom); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (aspect_ratio_crop); +} diff --git a/gst/videocrop/gstaspectratiocrop.h b/gst/videocrop/gstaspectratiocrop.h new file mode 100644 index 0000000..dc2e7cd --- /dev/null +++ b/gst/videocrop/gstaspectratiocrop.h @@ -0,0 +1,67 @@ +/* GStreamer video frame cropping to aspect-ratio + * Copyright (C) 2009 Thijs Vermeir <thijsvermeir@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_ASPECT_RATIO_CROP_H__ +#define __GST_ASPECT_RATIO_CROP_H__ + +#include <gst/gstbin.h> + +G_BEGIN_DECLS + +#define GST_TYPE_ASPECT_RATIO_CROP \ + (gst_aspect_ratio_crop_get_type()) +#define GST_ASPECT_RATIO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ASPECT_RATIO_CROP,GstAspectRatioCrop)) +#define GST_ASPECT_RATIO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ASPECT_RATIO_CROP,GstAspectRatioCropClass)) +#define GST_IS_ASPECT_RATIO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ASPECT_RATIO_CROP)) +#define GST_IS_ASPECT_RATIO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ASPECT_RATIO_CROP)) + +typedef struct _GstAspectRatioCrop GstAspectRatioCrop; +typedef struct _GstAspectRatioCropClass GstAspectRatioCropClass; + +struct _GstAspectRatioCrop +{ + GstBin parent; + + /* our videocrop element */ + GstElement *videocrop; + + GstPad *sink; + + /* target aspect ratio */ + gint ar_num; /* if < 1 then don't change ar */ + gint ar_denom; + + GMutex *crop_lock; +}; + +struct _GstAspectRatioCropClass +{ + GstBinClass parent_class; +}; + +GType gst_aspect_ratio_crop_get_type (void); + +G_END_DECLS + +#endif /* __GST_ASPECT_RATIO_CROP_H__ */ + diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c new file mode 100644 index 0000000..7100bee --- /dev/null +++ b/gst/videocrop/gstvideocrop.c @@ -0,0 +1,761 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net> + * + * 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-videocrop + * @see_also: #GstVideoBox + * + * This element crops video frames, meaning it can remove parts of the + * picture on the left, right, top or bottom of the picture and output + * a smaller picture than the input picture, with the unwanted parts at the + * border removed. + * + * The videocrop element is similar to the videobox element, but its main + * goal is to support a multitude of formats as efficiently as possible. + * Unlike videbox, it cannot add borders to the picture and unlike videbox + * it will always output images in exactly the same format as the input image. + * + * If there is nothing to crop, the element will operate in pass-through mode. + * + * Note that no special efforts are made to handle chroma-subsampled formats + * in the case of odd-valued cropping and compensate for sub-unit chroma plane + * shifts for such formats in the case where the #GstVideoCrop:left or + * #GstVideoCrop:top property is set to an odd number. This doesn't matter for + * most use cases, but it might matter for yours. + * + * <refsect2> + * <title>Example launch line</title> + * |[ + * gst-launch -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink + * ]| + * </refsect2> + */ + +/* TODO: + * - for packed formats, we could avoid memcpy() in case crop_left + * and crop_right are 0 and just create a sub-buffer of the input + * buffer + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/video/video.h> + +#include "gstvideocrop.h" +#include "gstaspectratiocrop.h" + +#include <string.h> + +GST_DEBUG_CATEGORY_STATIC (videocrop_debug); +#define GST_CAT_DEFAULT videocrop_debug + +enum +{ + ARG_0, + ARG_LEFT, + ARG_RIGHT, + ARG_TOP, + ARG_BOTTOM +}; + +/* the formats we support */ +#define GST_VIDEO_CAPS_GRAY "video/x-raw-gray, " \ + "bpp = (int) 8, " \ + "width = " GST_VIDEO_SIZE_RANGE ", " \ + "height = " GST_VIDEO_SIZE_RANGE ", " \ + "framerate = " GST_VIDEO_FPS_RANGE + +#define VIDEO_CROP_CAPS \ + GST_VIDEO_CAPS_RGBx ";" \ + GST_VIDEO_CAPS_xRGB ";" \ + GST_VIDEO_CAPS_BGRx ";" \ + GST_VIDEO_CAPS_xBGR ";" \ + GST_VIDEO_CAPS_RGBA ";" \ + GST_VIDEO_CAPS_ARGB ";" \ + GST_VIDEO_CAPS_BGRA ";" \ + GST_VIDEO_CAPS_ABGR ";" \ + GST_VIDEO_CAPS_RGB ";" \ + GST_VIDEO_CAPS_BGR ";" \ + GST_VIDEO_CAPS_YUV ("AYUV") ";" \ + GST_VIDEO_CAPS_YUV ("YUY2") ";" \ + GST_VIDEO_CAPS_YUV ("YVYU") ";" \ + GST_VIDEO_CAPS_YUV ("UYVY") ";" \ + GST_VIDEO_CAPS_YUV ("Y800") ";" \ + GST_VIDEO_CAPS_YUV ("I420") ";" \ + GST_VIDEO_CAPS_YUV ("YV12") ";" \ + GST_VIDEO_CAPS_RGB_16 ";" \ + GST_VIDEO_CAPS_RGB_15 ";" \ + GST_VIDEO_CAPS_GRAY + +static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CROP_CAPS) + ); + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_CROP_CAPS) + ); + +GST_BOILERPLATE (GstVideoCrop, gst_video_crop, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM); + +static void gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_video_crop_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static GstCaps *gst_video_crop_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps); +static GstFlowReturn gst_video_crop_transform (GstBaseTransform * trans, + GstBuffer * inbuf, GstBuffer * outbuf); +static gboolean gst_video_crop_get_unit_size (GstBaseTransform * trans, + GstCaps * caps, guint * size); +static gboolean gst_video_crop_set_caps (GstBaseTransform * trans, + GstCaps * in_caps, GstCaps * outcaps); +static gboolean gst_video_crop_src_event (GstBaseTransform * trans, + GstEvent * event); + +static void +gst_video_crop_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "Crop", + "Filter/Effect/Video", + "Crops video into a user-defined region", + "Tim-Philipp Müller <tim centricular net>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); +} + +static gboolean +gst_video_crop_src_event (GstBaseTransform * trans, GstEvent * event) +{ + GstEvent *new_event; + GstStructure *new_structure; + const GstStructure *structure; + const gchar *event_name; + double pointer_x; + double pointer_y; + + GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); + new_event = NULL; + + GST_OBJECT_LOCK (vcrop); + if (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION && + (vcrop->crop_left != 0 || vcrop->crop_top != 0)) { + structure = gst_event_get_structure (event); + event_name = gst_structure_get_string (structure, "event"); + + if (event_name && + (strcmp (event_name, "mouse-move") == 0 || + strcmp (event_name, "mouse-button-press") == 0 || + strcmp (event_name, "mouse-button-release") == 0)) { + + if (gst_structure_get_double (structure, "pointer_x", &pointer_x) && + gst_structure_get_double (structure, "pointer_y", &pointer_y)) { + + new_structure = gst_structure_copy (structure); + gst_structure_set (new_structure, + "pointer_x", G_TYPE_DOUBLE, (double) (pointer_x + vcrop->crop_left), + "pointer_y", G_TYPE_DOUBLE, (double) (pointer_y + vcrop->crop_top), + NULL); + + new_event = gst_event_new_navigation (new_structure); + gst_event_unref (event); + } else { + GST_WARNING_OBJECT (vcrop, "Failed to read navigation event"); + } + } + } + + GST_OBJECT_UNLOCK (vcrop); + return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans, + (new_event ? new_event : event)); +} + +static void +gst_video_crop_class_init (GstVideoCropClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *basetransform_class; + + gobject_class = (GObjectClass *) klass; + basetransform_class = (GstBaseTransformClass *) klass; + + gobject_class->set_property = gst_video_crop_set_property; + gobject_class->get_property = gst_video_crop_get_property; + + g_object_class_install_property (gobject_class, ARG_LEFT, + g_param_spec_int ("left", "Left", "Pixels to crop at left", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_RIGHT, + g_param_spec_int ("right", "Right", "Pixels to crop at right", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_TOP, + g_param_spec_int ("top", "Top", "Pixels to crop at top", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, ARG_BOTTOM, + g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom", + 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + basetransform_class->transform = GST_DEBUG_FUNCPTR (gst_video_crop_transform); + basetransform_class->transform_caps = + GST_DEBUG_FUNCPTR (gst_video_crop_transform_caps); + basetransform_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_crop_set_caps); + basetransform_class->get_unit_size = + GST_DEBUG_FUNCPTR (gst_video_crop_get_unit_size); + + basetransform_class->passthrough_on_same_caps = FALSE; + basetransform_class->src_event = GST_DEBUG_FUNCPTR (gst_video_crop_src_event); +} + +static void +gst_video_crop_init (GstVideoCrop * vcrop, GstVideoCropClass * klass) +{ + vcrop->crop_right = 0; + vcrop->crop_left = 0; + vcrop->crop_top = 0; + vcrop->crop_bottom = 0; +} + +static gboolean +gst_video_crop_get_image_details_from_caps (GstVideoCrop * vcrop, + GstVideoCropImageDetails * details, GstCaps * caps) +{ + GstStructure *structure; + gint width, height; + + structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) { + goto incomplete_format; + } + + details->width = width; + details->height = height; + + if (gst_structure_has_name (structure, "video/x-raw-rgb") || + gst_structure_has_name (structure, "video/x-raw-gray")) { + gint bpp = 0; + + if (!gst_structure_get_int (structure, "bpp", &bpp) || (bpp & 0x07) != 0) + goto incomplete_format; + + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + details->bytes_per_pixel = bpp / 8; + details->stride = GST_ROUND_UP_4 (width * details->bytes_per_pixel); + details->size = details->stride * height; + } else if (gst_structure_has_name (structure, "video/x-raw-yuv")) { + guint32 format = 0; + + if (!gst_structure_get_fourcc (structure, "format", &format)) + goto incomplete_format; + + switch (format) { + case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + details->bytes_per_pixel = 4; + details->stride = GST_ROUND_UP_4 (width * 4); + details->size = details->stride * height; + break; + case GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'): + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX; + details->bytes_per_pixel = 2; + details->stride = GST_ROUND_UP_4 (width * 2); + details->size = details->stride * height; + if (format == GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y')) { + /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] */ + details->macro_y_off = 1; + } else { + /* YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ + details->macro_y_off = 0; + } + break; + case GST_MAKE_FOURCC ('Y', '8', '0', '0'): + details->packing = VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE; + details->bytes_per_pixel = 1; + details->stride = GST_ROUND_UP_4 (width); + details->size = details->stride * height; + break; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'):{ + details->packing = VIDEO_CROP_PIXEL_FORMAT_PLANAR; + + details->y_stride = GST_ROUND_UP_4 (width); + details->u_stride = GST_ROUND_UP_8 (width) / 2; + details->v_stride = GST_ROUND_UP_8 (width) / 2; + + /* I420 and YV12 have U/V planes swapped, but doesn't matter for us */ + details->y_off = 0; + details->u_off = 0 + details->y_stride * GST_ROUND_UP_2 (height); + details->v_off = details->u_off + + details->u_stride * (GST_ROUND_UP_2 (height) / 2); + details->size = details->v_off + + details->v_stride * (GST_ROUND_UP_2 (height) / 2); + break; + } + default: + goto unknown_format; + } + } else { + goto unknown_format; + } + + return TRUE; + + /* ERRORS */ +unknown_format: + { + GST_ELEMENT_ERROR (vcrop, STREAM, NOT_IMPLEMENTED, (NULL), + ("Unsupported format")); + return FALSE; + } + +incomplete_format: + { + GST_ELEMENT_ERROR (vcrop, CORE, NEGOTIATION, (NULL), + ("Incomplete caps, some required field is missing")); + return FALSE; + } +} + +static gboolean +gst_video_crop_get_unit_size (GstBaseTransform * trans, GstCaps * caps, + guint * size) +{ + GstVideoCropImageDetails img_details = { 0, }; + GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); + + if (!gst_video_crop_get_image_details_from_caps (vcrop, &img_details, caps)) + return FALSE; + + *size = img_details.size; + return TRUE; +} + +#define ROUND_DOWN_2(n) ((n)&(~1)) + +static void +gst_video_crop_transform_packed_complex (GstVideoCrop * vcrop, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + guint8 *in_data, *out_data; + guint i, dx; + + in_data = GST_BUFFER_DATA (inbuf); + out_data = GST_BUFFER_DATA (outbuf); + + in_data += vcrop->crop_top * vcrop->in.stride; + + /* rounding down here so we end up at the start of a macro-pixel and not + * in the middle of one */ + in_data += ROUND_DOWN_2 (vcrop->crop_left) * vcrop->in.bytes_per_pixel; + + dx = vcrop->out.width * vcrop->out.bytes_per_pixel; + + /* UYVY = 4:2:2 - [U0 Y0 V0 Y1] [U2 Y2 V2 Y3] [U4 Y4 V4 Y5] + * YUYV = 4:2:2 - [Y0 U0 Y1 V0] [Y2 U2 Y3 V2] [Y4 U4 Y5 V4] = YUY2 */ + if ((vcrop->crop_left % 2) != 0) { + for (i = 0; i < vcrop->out.height; ++i) { + gint j; + + memcpy (out_data, in_data, dx); + + /* move just the Y samples one pixel to the left, don't worry about + * chroma shift */ + for (j = vcrop->in.macro_y_off; j < vcrop->out.stride - 2; j += 2) + out_data[j] = in_data[j + 2]; + + in_data += vcrop->in.stride; + out_data += vcrop->out.stride; + } + } else { + for (i = 0; i < vcrop->out.height; ++i) { + memcpy (out_data, in_data, dx); + in_data += vcrop->in.stride; + out_data += vcrop->out.stride; + } + } +} + +static void +gst_video_crop_transform_packed_simple (GstVideoCrop * vcrop, + GstBuffer * inbuf, GstBuffer * outbuf) +{ + guint8 *in_data, *out_data; + guint i, dx; + + in_data = GST_BUFFER_DATA (inbuf); + out_data = GST_BUFFER_DATA (outbuf); + + in_data += vcrop->crop_top * vcrop->in.stride; + in_data += vcrop->crop_left * vcrop->in.bytes_per_pixel; + + dx = vcrop->out.width * vcrop->out.bytes_per_pixel; + + for (i = 0; i < vcrop->out.height; ++i) { + memcpy (out_data, in_data, dx); + in_data += vcrop->in.stride; + out_data += vcrop->out.stride; + } +} + +static void +gst_video_crop_transform_planar (GstVideoCrop * vcrop, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + guint8 *y_out, *u_out, *v_out; + guint8 *y_in, *u_in, *v_in; + guint i, dx; + + /* Y plane */ + y_in = GST_BUFFER_DATA (inbuf); + y_out = GST_BUFFER_DATA (outbuf); + + y_in += (vcrop->crop_top * vcrop->in.y_stride) + vcrop->crop_left; + dx = vcrop->out.width * 1; + + for (i = 0; i < vcrop->out.height; ++i) { + memcpy (y_out, y_in, dx); + y_in += vcrop->in.y_stride; + y_out += vcrop->out.y_stride; + } + + /* U + V planes */ + u_in = GST_BUFFER_DATA (inbuf) + vcrop->in.u_off; + u_out = GST_BUFFER_DATA (outbuf) + vcrop->out.u_off; + + u_in += (vcrop->crop_top / 2) * vcrop->in.u_stride; + u_in += vcrop->crop_left / 2; + + v_in = GST_BUFFER_DATA (inbuf) + vcrop->in.v_off; + v_out = GST_BUFFER_DATA (outbuf) + vcrop->out.v_off; + + v_in += (vcrop->crop_top / 2) * vcrop->in.v_stride; + v_in += vcrop->crop_left / 2; + + dx = GST_ROUND_UP_2 (vcrop->out.width) / 2; + + for (i = 0; i < GST_ROUND_UP_2 (vcrop->out.height) / 2; ++i) { + memcpy (u_out, u_in, dx); + memcpy (v_out, v_in, dx); + u_in += vcrop->in.u_stride; + u_out += vcrop->out.u_stride; + v_in += vcrop->in.v_stride; + v_out += vcrop->out.v_stride; + } +} + +static GstFlowReturn +gst_video_crop_transform (GstBaseTransform * trans, GstBuffer * inbuf, + GstBuffer * outbuf) +{ + GstVideoCrop *vcrop = GST_VIDEO_CROP (trans); + + switch (vcrop->in.packing) { + case VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE: + gst_video_crop_transform_packed_simple (vcrop, inbuf, outbuf); + break; + case VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX: + gst_video_crop_transform_packed_complex (vcrop, inbuf, outbuf); + break; + case VIDEO_CROP_PIXEL_FORMAT_PLANAR: + gst_video_crop_transform_planar (vcrop, inbuf, outbuf); + break; + default: + g_assert_not_reached (); + } + + return GST_FLOW_OK; +} + +static gint +gst_video_crop_transform_dimension (gint val, gint delta) +{ + gint64 new_val = (gint64) val + (gint64) delta; + + new_val = CLAMP (new_val, 1, G_MAXINT); + + return (gint) new_val; +} + +static gboolean +gst_video_crop_transform_dimension_value (const GValue * src_val, + gint delta, GValue * dest_val) +{ + gboolean ret = TRUE; + + g_value_init (dest_val, G_VALUE_TYPE (src_val)); + + if (G_VALUE_HOLDS_INT (src_val)) { + gint ival = g_value_get_int (src_val); + + ival = gst_video_crop_transform_dimension (ival, delta); + g_value_set_int (dest_val, ival); + } else if (GST_VALUE_HOLDS_INT_RANGE (src_val)) { + gint min = gst_value_get_int_range_min (src_val); + gint max = gst_value_get_int_range_max (src_val); + + min = gst_video_crop_transform_dimension (min, delta); + max = gst_video_crop_transform_dimension (max, delta); + gst_value_set_int_range (dest_val, min, max); + } else if (GST_VALUE_HOLDS_LIST (src_val)) { + gint i; + + for (i = 0; i < gst_value_list_get_size (src_val); ++i) { + const GValue *list_val; + GValue newval = { 0, }; + + list_val = gst_value_list_get_value (src_val, i); + if (gst_video_crop_transform_dimension_value (list_val, delta, &newval)) + gst_value_list_append_value (dest_val, &newval); + g_value_unset (&newval); + } + + if (gst_value_list_get_size (dest_val) == 0) { + g_value_unset (dest_val); + ret = FALSE; + } + } else { + g_value_unset (dest_val); + ret = FALSE; + } + + return ret; +} + +static GstCaps * +gst_video_crop_transform_caps (GstBaseTransform * trans, + GstPadDirection direction, GstCaps * caps) +{ + GstVideoCrop *vcrop; + GstCaps *other_caps; + gint dy, dx, i; + + vcrop = GST_VIDEO_CROP (trans); + + GST_OBJECT_LOCK (vcrop); + + GST_LOG_OBJECT (vcrop, "l=%d,r=%d,b=%d,t=%d", + vcrop->crop_left, vcrop->crop_right, vcrop->crop_bottom, vcrop->crop_top); + + if (direction == GST_PAD_SRC) { + dx = vcrop->crop_left + vcrop->crop_right; + dy = vcrop->crop_top + vcrop->crop_bottom; + } else { + dx = 0 - (vcrop->crop_left + vcrop->crop_right); + dy = 0 - (vcrop->crop_top + vcrop->crop_bottom); + } + GST_OBJECT_UNLOCK (vcrop); + + GST_LOG_OBJECT (vcrop, "transforming caps %" GST_PTR_FORMAT, caps); + + other_caps = gst_caps_new_empty (); + + for (i = 0; i < gst_caps_get_size (caps); ++i) { + const GValue *v; + GstStructure *structure, *new_structure; + GValue w_val = { 0, }, h_val = { + 0,}; + + structure = gst_caps_get_structure (caps, i); + + v = gst_structure_get_value (structure, "width"); + if (!gst_video_crop_transform_dimension_value (v, dx, &w_val)) { + GST_WARNING_OBJECT (vcrop, "could not tranform width value with dx=%d" + ", caps structure=%" GST_PTR_FORMAT, dx, structure); + continue; + } + + v = gst_structure_get_value (structure, "height"); + if (!gst_video_crop_transform_dimension_value (v, dy, &h_val)) { + g_value_unset (&w_val); + GST_WARNING_OBJECT (vcrop, "could not tranform height value with dy=%d" + ", caps structure=%" GST_PTR_FORMAT, dy, structure); + continue; + } + + new_structure = gst_structure_copy (structure); + gst_structure_set_value (new_structure, "width", &w_val); + gst_structure_set_value (new_structure, "height", &h_val); + g_value_unset (&w_val); + g_value_unset (&h_val); + GST_LOG_OBJECT (vcrop, "transformed structure %2d: %" GST_PTR_FORMAT + " => %" GST_PTR_FORMAT, i, structure, new_structure); + gst_caps_append_structure (other_caps, new_structure); + } + + if (gst_caps_is_empty (other_caps)) { + gst_caps_unref (other_caps); + other_caps = NULL; + } + + return other_caps; +} + +static gboolean +gst_video_crop_set_caps (GstBaseTransform * trans, GstCaps * incaps, + GstCaps * outcaps) +{ + GstVideoCrop *crop = GST_VIDEO_CROP (trans); + + if (!gst_video_crop_get_image_details_from_caps (crop, &crop->in, incaps)) + goto wrong_input; + + if (!gst_video_crop_get_image_details_from_caps (crop, &crop->out, outcaps)) + goto wrong_output; + + if (G_UNLIKELY ((crop->crop_left + crop->crop_right) >= crop->in.width || + (crop->crop_top + crop->crop_bottom) >= crop->in.height)) + goto cropping_too_much; + + GST_LOG_OBJECT (crop, "incaps = %" GST_PTR_FORMAT ", outcaps = %" + GST_PTR_FORMAT, incaps, outcaps); + + if ((crop->crop_left | crop->crop_right | crop->crop_top | crop-> + crop_bottom) == 0) { + GST_LOG_OBJECT (crop, "we are using passthrough"); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), TRUE); + } else { + GST_LOG_OBJECT (crop, "we are not using passthrough"); + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), FALSE); + } + + return TRUE; + + /* ERROR */ +wrong_input: + { + GST_DEBUG_OBJECT (crop, "failed to parse input caps %" GST_PTR_FORMAT, + incaps); + return FALSE; + } +wrong_output: + { + GST_DEBUG_OBJECT (crop, "failed to parse output caps %" GST_PTR_FORMAT, + outcaps); + return FALSE; + } +cropping_too_much: + { + GST_DEBUG_OBJECT (crop, "we are cropping too much"); + return FALSE; + } +} + +static void +gst_video_crop_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstVideoCrop *video_crop; + + video_crop = GST_VIDEO_CROP (object); + + /* don't modify while we are transforming */ + GST_BASE_TRANSFORM_LOCK (GST_BASE_TRANSFORM_CAST (video_crop)); + + /* protect with the object lock so that we can read them */ + GST_OBJECT_LOCK (video_crop); + switch (prop_id) { + case ARG_LEFT: + video_crop->crop_left = g_value_get_int (value); + break; + case ARG_RIGHT: + video_crop->crop_right = g_value_get_int (value); + break; + case ARG_TOP: + video_crop->crop_top = g_value_get_int (value); + break; + case ARG_BOTTOM: + video_crop->crop_bottom = g_value_get_int (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (video_crop); + + GST_LOG_OBJECT (video_crop, "l=%d,r=%d,b=%d,t=%d", + video_crop->crop_left, video_crop->crop_right, video_crop->crop_bottom, + video_crop->crop_top); + + gst_base_transform_reconfigure (GST_BASE_TRANSFORM (video_crop)); + GST_BASE_TRANSFORM_UNLOCK (GST_BASE_TRANSFORM_CAST (video_crop)); +} + +static void +gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstVideoCrop *video_crop; + + video_crop = GST_VIDEO_CROP (object); + + GST_OBJECT_LOCK (video_crop); + switch (prop_id) { + case ARG_LEFT: + g_value_set_int (value, video_crop->crop_left); + break; + case ARG_RIGHT: + g_value_set_int (value, video_crop->crop_right); + break; + case ARG_TOP: + g_value_set_int (value, video_crop->crop_top); + break; + case ARG_BOTTOM: + g_value_set_int (value, video_crop->crop_bottom); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_OBJECT_UNLOCK (video_crop); +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (videocrop_debug, "videocrop", 0, "videocrop"); + + if (gst_element_register (plugin, "videocrop", GST_RANK_NONE, + GST_TYPE_VIDEO_CROP) + && gst_element_register (plugin, "aspectratiocrop", GST_RANK_NONE, + GST_TYPE_ASPECT_RATIO_CROP)) + return TRUE; + + return FALSE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "videocrop", + "Crops video into a user-defined region", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/videocrop/gstvideocrop.h b/gst/videocrop/gstvideocrop.h new file mode 100644 index 0000000..477f21b --- /dev/null +++ b/gst/videocrop/gstvideocrop.h @@ -0,0 +1,92 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net> + * + * 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_CROP_H__ +#define __GST_VIDEO_CROP_H__ + +#include <gst/base/gstbasetransform.h> + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_CROP \ + (gst_video_crop_get_type()) +#define GST_VIDEO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEO_CROP,GstVideoCrop)) +#define GST_VIDEO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_VIDEO_CROP,GstVideoCropClass)) +#define GST_IS_VIDEO_CROP(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEO_CROP)) +#define GST_IS_VIDEO_CROP_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VIDEO_CROP)) + +typedef enum { + VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE = 0, /* RGBx, AYUV */ + VIDEO_CROP_PIXEL_FORMAT_PACKED_COMPLEX, /* UYVY, YVYU */ + VIDEO_CROP_PIXEL_FORMAT_PLANAR /* I420, YV12 */ +} VideoCropPixelFormat; + +typedef struct _GstVideoCropImageDetails GstVideoCropImageDetails; +struct _GstVideoCropImageDetails +{ + /*< private >*/ + VideoCropPixelFormat packing; + + guint width; + guint height; + guint size; + + /* for packed RGB and YUV */ + guint stride; + guint bytes_per_pixel; + guint8 macro_y_off; /* for YUY2, YVYU, UYVY, Y offset within macropixel in bytes */ + + /* for planar YUV */ + guint y_stride, y_off; + guint u_stride, u_off; + guint v_stride, v_off; +}; + +typedef struct _GstVideoCrop GstVideoCrop; +typedef struct _GstVideoCropClass GstVideoCropClass; + +struct _GstVideoCrop +{ + GstBaseTransform basetransform; + + /*< private >*/ + gint crop_left; + gint crop_right; + gint crop_top; + gint crop_bottom; + + GstVideoCropImageDetails in; /* details of input image */ + GstVideoCropImageDetails out; /* details of output image */ +}; + +struct _GstVideoCropClass +{ + GstBaseTransformClass basetransform_class; +}; + +GType gst_video_crop_get_type (void); + +G_END_DECLS + +#endif /* __GST_VIDEO_CROP_H__ */ + |