From bb8835cccc51022365d32ec0492a562f408f7d29 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:44:22 +0900 Subject: [PATCH] Initialize Tizen 2.3 --- mobile/AUTHORS | 5 + mobile/COPYING | 504 + mobile/INSTALL | 236 + mobile/LICENSE.LGPLv2.1 | 504 + mobile/Makefile.am | 82 + mobile/NOTICE | 3 + mobile/PLUGINS | 15 + mobile/README | 12 + mobile/audioeq/Makefile.am | 1 + mobile/audioeq/src/Makefile.am | 28 + mobile/audioeq/src/gstaudioeq.c | 1313 ++ mobile/audioeq/src/gstaudioeq.h | 127 + mobile/audiotp/Makefile.am | 1 + mobile/audiotp/src/Makefile.am | 26 + mobile/audiotp/src/gstaudiotp.c | 605 + mobile/audiotp/src/gstaudiotp.h | 69 + mobile/autogen.sh | 12 + mobile/autoregen.sh | 2 + mobile/avsystem/Makefile.am | 1 + mobile/avsystem/src/Makefile.am | 60 + mobile/avsystem/src/gstavsysaudiosink.c | 905 + mobile/avsystem/src/gstavsysaudiosink.h | 124 + mobile/avsystem/src/gstavsysaudiosrc.c | 1005 ++ mobile/avsystem/src/gstavsysaudiosrc.h | 91 + mobile/avsystem/src/gstavsysmemsink.c | 750 + mobile/avsystem/src/gstavsysmemsink.h | 82 + mobile/avsystem/src/gstavsyssink.c | 66 + mobile/avsystem/src/gstavsyssrc.c | 63 + mobile/common/ChangeLog | 1343 ++ mobile/common/Makefile.am | 16 + mobile/common/c-to-xml.py | 34 + mobile/common/check-exports | 71 + mobile/common/check.mak | 149 + mobile/common/coverage/coverage-report-entry.pl | 70 + mobile/common/coverage/coverage-report.pl | 125 + mobile/common/coverage/coverage-report.xsl | 235 + mobile/common/coverage/lcov.mak | 42 + mobile/common/gettext.patch | 23 + mobile/common/glib-gen.mak | 44 + mobile/common/gst-autogen.sh | 294 + mobile/common/gst-xmlinspect.py | 168 + mobile/common/gst.supp | 1988 +++ mobile/common/gstdoc-scangobj | 1607 ++ mobile/common/gtk-doc-plugins.mak | 397 + mobile/common/gtk-doc.mak | 267 + mobile/common/m4/Makefile.am | 29 + mobile/common/m4/README | 3 + mobile/common/m4/as-ac-expand.m4 | 43 + mobile/common/m4/as-auto-alt.m4 | 50 + mobile/common/m4/as-compiler-flag.m4 | 64 + mobile/common/m4/as-compiler.m4 | 44 + mobile/common/m4/as-docbook.m4 | 66 + mobile/common/m4/as-gcc-inline-assembly.m4 | 52 + mobile/common/m4/as-libtool-tags.m4 | 83 + mobile/common/m4/as-libtool.m4 | 45 + mobile/common/m4/as-python.m4 | 152 + mobile/common/m4/as-scrub-include.m4 | 36 + mobile/common/m4/as-version.m4 | 71 + mobile/common/m4/ax_create_stdint_h.m4 | 734 + mobile/common/m4/check.m4 | 181 + mobile/common/m4/gettext.m4 | 587 + mobile/common/m4/glib-gettext.m4 | 380 + mobile/common/m4/gst-arch.m4 | 123 + mobile/common/m4/gst-args.m4 | 302 + mobile/common/m4/gst-check.m4 | 138 + mobile/common/m4/gst-debuginfo.m4 | 46 + mobile/common/m4/gst-default.m4 | 45 + mobile/common/m4/gst-doc.m4 | 148 + mobile/common/m4/gst-error.m4 | 145 + mobile/common/m4/gst-feature.m4 | 286 + mobile/common/m4/gst-function.m4 | 63 + mobile/common/m4/gst-gettext.m4 | 21 + mobile/common/m4/gst-glib2.m4 | 25 + mobile/common/m4/gst-libxml2.m4 | 46 + mobile/common/m4/gst-parser.m4 | 63 + mobile/common/m4/gst-plugin-docs.m4 | 47 + mobile/common/m4/gst-plugindir.m4 | 17 + mobile/common/m4/gst-valgrind.m4 | 35 + mobile/common/m4/gst-x11.m4 | 70 + mobile/common/m4/gst.m4 | 10 + mobile/common/m4/gtk-doc.m4 | 56 + mobile/common/m4/iconv.m4 | 103 + mobile/common/m4/isc-posix.m4 | 26 + mobile/common/m4/lib-ld.m4 | 97 + mobile/common/m4/lib-link.m4 | 554 + mobile/common/m4/lib-prefix.m4 | 148 + mobile/common/m4/libtool.m4 | 7377 ++++++++ mobile/common/m4/ltoptions.m4 | 368 + mobile/common/m4/ltsugar.m4 | 123 + mobile/common/m4/ltversion.m4 | 23 + mobile/common/m4/lt~obsolete.m4 | 92 + mobile/common/m4/pkg.m4 | 135 + mobile/common/m4/progtest.m4 | 59 + mobile/common/mangle-tmpl.py | 155 + mobile/common/plugins.xsl | 200 + mobile/common/po.mak | 4 + mobile/common/release.mak | 25 + mobile/common/scangobj-merge.py | 226 + mobile/common/upload.mak | 33 + mobile/common/win32.mak | 54 + mobile/configure.ac | 479 + mobile/drmsrc/Makefile.am | 1 + mobile/drmsrc/src/Makefile.am | 27 + mobile/drmsrc/src/gstdrmsrc.c | 625 + mobile/drmsrc/src/gstdrmsrc.h | 106 + mobile/encodebin/Makefile.am | 1 + mobile/encodebin/src/Makefile.am | 30 + mobile/encodebin/src/gstencodebin.c | 3352 ++++ mobile/encodebin/src/gstencodebin.h | 159 + mobile/evasimagesink/Makefile.am | 1 + mobile/evasimagesink/src/Makefile.am | 26 + mobile/evasimagesink/src/gstevasimagesink.c | 684 + mobile/evasimagesink/src/gstevasimagesink.h | 77 + mobile/evaspixmapsink/Makefile.am | 15 + mobile/evaspixmapsink/evaspixmapsink.c | 4432 +++++ mobile/evaspixmapsink/evaspixmapsink.h | 404 + mobile/evaspixmapsink/xv_types.h | 101 + mobile/gst-autogen.sh | 308 + mobile/gst-plugins-ext0.10.manifest | 5 + mobile/m4/Makefile.am | 1 + mobile/m4/as-compiler-flag.m4 | 25 + mobile/m4/as-version.m4 | 66 + mobile/pdpushsrc/Makefile.am | 1 + mobile/pdpushsrc/src/Makefile.am | 26 + mobile/pdpushsrc/src/gstpdpushsrc.c | 830 + mobile/pdpushsrc/src/gstpdpushsrc.h | 73 + mobile/toggle/Makefile.am | 1 + mobile/toggle/src/Makefile.am | 30 + mobile/toggle/src/gsttoggle.c | 219 + mobile/toggle/src/gsttoggle.h | 61 + mobile/xvimagesrc/Makefile.am | 1 + mobile/xvimagesrc/src/Makefile.am | 26 + mobile/xvimagesrc/src/gstxvimagesrc.c | 1527 ++ mobile/xvimagesrc/src/gstxvimagesrc.h | 136 + mobile/xvimagesrc/src/xv_types.h | 134 + packaging/gst-plugins-ext0.10-0.3.14.tar.gz | Bin 0 -> 4210688 bytes packaging/gst-plugins-ext0.10.spec | 95 + wearable/AUTHORS | 5 + wearable/COPYING | 504 + wearable/INSTALL | 236 + wearable/LICENSE.LGPLv2.1 | 504 + wearable/Makefile.am | 81 + wearable/NEWS | 1 + wearable/PLUGINS | 15 + wearable/README | 12 + wearable/aclocal.m4 | 1011 ++ wearable/audioeq/Makefile.am | 1 + wearable/audioeq/src/Makefile.am | 28 + wearable/audioeq/src/gstaudioeq.c | 1313 ++ wearable/audioeq/src/gstaudioeq.h | 127 + wearable/audiotp/Makefile.am | 1 + wearable/audiotp/src/Makefile.am | 26 + wearable/audiotp/src/gstaudiotp.c | 604 + wearable/audiotp/src/gstaudiotp.h | 69 + wearable/autogen.sh | 12 + wearable/autoregen.sh | 2 + wearable/avsystem/Makefile.am | 1 + wearable/avsystem/src/Makefile.am | 60 + wearable/avsystem/src/gstavsysaudiosink.c | 1196 ++ wearable/avsystem/src/gstavsysaudiosink.h | 157 + wearable/avsystem/src/gstavsysaudiosrc.c | 1005 ++ wearable/avsystem/src/gstavsysaudiosrc.h | 91 + wearable/avsystem/src/gstavsysmemsink.c | 751 + wearable/avsystem/src/gstavsysmemsink.h | 82 + wearable/avsystem/src/gstavsyssink.c | 66 + wearable/avsystem/src/gstavsyssrc.c | 63 + wearable/common/ChangeLog | 1343 ++ wearable/common/Makefile.am | 16 + wearable/common/c-to-xml.py | 34 + wearable/common/check-exports | 71 + wearable/common/check.mak | 149 + wearable/common/coverage/coverage-report-entry.pl | 70 + wearable/common/coverage/coverage-report.pl | 125 + wearable/common/coverage/coverage-report.xsl | 235 + wearable/common/coverage/lcov.mak | 42 + wearable/common/gettext.patch | 23 + wearable/common/glib-gen.mak | 44 + wearable/common/gst-autogen.sh | 294 + wearable/common/gst-xmlinspect.py | 168 + wearable/common/gst.supp | 1988 +++ wearable/common/gstdoc-scangobj | 1607 ++ wearable/common/gtk-doc-plugins.mak | 397 + wearable/common/gtk-doc.mak | 267 + wearable/common/m4/Makefile.am | 29 + wearable/common/m4/README | 3 + wearable/common/m4/as-ac-expand.m4 | 43 + wearable/common/m4/as-auto-alt.m4 | 50 + wearable/common/m4/as-compiler-flag.m4 | 64 + wearable/common/m4/as-compiler.m4 | 44 + wearable/common/m4/as-docbook.m4 | 66 + wearable/common/m4/as-gcc-inline-assembly.m4 | 52 + wearable/common/m4/as-libtool-tags.m4 | 83 + wearable/common/m4/as-libtool.m4 | 45 + wearable/common/m4/as-python.m4 | 152 + wearable/common/m4/as-scrub-include.m4 | 36 + wearable/common/m4/as-version.m4 | 71 + wearable/common/m4/ax_create_stdint_h.m4 | 734 + wearable/common/m4/check.m4 | 181 + wearable/common/m4/gettext.m4 | 587 + wearable/common/m4/glib-gettext.m4 | 380 + wearable/common/m4/gst-arch.m4 | 123 + wearable/common/m4/gst-args.m4 | 302 + wearable/common/m4/gst-check.m4 | 138 + wearable/common/m4/gst-debuginfo.m4 | 46 + wearable/common/m4/gst-default.m4 | 45 + wearable/common/m4/gst-doc.m4 | 148 + wearable/common/m4/gst-error.m4 | 145 + wearable/common/m4/gst-feature.m4 | 286 + wearable/common/m4/gst-function.m4 | 63 + wearable/common/m4/gst-gettext.m4 | 21 + wearable/common/m4/gst-glib2.m4 | 25 + wearable/common/m4/gst-libxml2.m4 | 46 + wearable/common/m4/gst-parser.m4 | 63 + wearable/common/m4/gst-plugin-docs.m4 | 47 + wearable/common/m4/gst-plugindir.m4 | 17 + wearable/common/m4/gst-valgrind.m4 | 35 + wearable/common/m4/gst-x11.m4 | 70 + wearable/common/m4/gst.m4 | 10 + wearable/common/m4/gtk-doc.m4 | 56 + wearable/common/m4/iconv.m4 | 103 + wearable/common/m4/isc-posix.m4 | 26 + wearable/common/m4/lib-ld.m4 | 97 + wearable/common/m4/lib-link.m4 | 554 + wearable/common/m4/lib-prefix.m4 | 148 + wearable/common/m4/libtool.m4 | 7377 ++++++++ wearable/common/m4/ltoptions.m4 | 368 + wearable/common/m4/ltsugar.m4 | 123 + wearable/common/m4/ltversion.m4 | 23 + wearable/common/m4/lt~obsolete.m4 | 92 + wearable/common/m4/pkg.m4 | 135 + wearable/common/m4/progtest.m4 | 59 + wearable/common/mangle-tmpl.py | 155 + wearable/common/plugins.xsl | 200 + wearable/common/po.mak | 4 + wearable/common/release.mak | 25 + wearable/common/scangobj-merge.py | 226 + wearable/common/upload.mak | 33 + wearable/common/win32.mak | 54 + wearable/compile | 142 + wearable/config.guess | 1517 ++ wearable/config.h.in | 68 + wearable/config.sub | 1760 ++ wearable/configure | 18651 ++++++++++++++++++++ wearable/configure.ac | 487 + wearable/control.in | 11 + wearable/dashdemux/Makefile.am | 1 + wearable/dashdemux/src/Makefile.am | 23 + wearable/dashdemux/src/Makefile.in | 605 + wearable/dashdemux/src/glibcompat.h | 48 + wearable/dashdemux/src/gstdashdemux.c | 1864 ++ wearable/dashdemux/src/gstdashdemux.h | 112 + wearable/dashdemux/src/gstfragment.c | 281 + wearable/dashdemux/src/gstfragment.h | 71 + wearable/dashdemux/src/gstfragmented.h | 15 + wearable/dashdemux/src/gstmpdparser.c | 3499 ++++ wearable/dashdemux/src/gstmpdparser.h | 513 + wearable/dashdemux/src/gstplugin.c | 109 + wearable/dashdemux/src/gsturidownloader.c | 394 + wearable/dashdemux/src/gsturidownloader.h | 66 + wearable/depcomp | 530 + wearable/encodebin/Makefile.am | 1 + wearable/encodebin/src/Makefile.am | 30 + wearable/encodebin/src/gstencodebin.c | 3371 ++++ wearable/encodebin/src/gstencodebin.h | 159 + wearable/evasimagesink/Makefile.am | 1 + wearable/evasimagesink/src/Makefile.am | 26 + wearable/evasimagesink/src/gstevasimagesink.c | 686 + wearable/evasimagesink/src/gstevasimagesink.h | 77 + wearable/evaspixmapsink/Makefile.am | 15 + wearable/evaspixmapsink/evaspixmapsink.c | 4358 +++++ wearable/evaspixmapsink/evaspixmapsink.h | 400 + wearable/evaspixmapsink/xv_types.h | 101 + wearable/gst-autogen.sh | 308 + wearable/gst-plugins-ext0.10.manifest | 5 + wearable/install-sh | 323 + wearable/ltmain.sh | 8413 +++++++++ wearable/m4/Makefile.am | 1 + wearable/m4/as-compiler-flag.m4 | 25 + wearable/m4/as-version.m4 | 66 + wearable/missing | 360 + wearable/pdpushsrc/Makefile.am | 1 + wearable/pdpushsrc/src/Makefile.am | 26 + wearable/pdpushsrc/src/gstpdpushsrc.c | 828 + wearable/pdpushsrc/src/gstpdpushsrc.h | 73 + wearable/toggle/Makefile.am | 1 + wearable/toggle/src/Makefile.am | 30 + wearable/toggle/src/gsttoggle.c | 219 + wearable/toggle/src/gsttoggle.h | 61 + wearable/uninstall.sh | 1 + wearable/xvimagesrc/Makefile.am | 1 + wearable/xvimagesrc/src/Makefile.am | 29 + wearable/xvimagesrc/src/gstxvimagesrc.c | 1689 ++ wearable/xvimagesrc/src/gstxvimagesrc.h | 140 + wearable/xvimagesrc/src/xv_types.h | 89 + 294 files changed, 123444 insertions(+) create mode 100644 mobile/AUTHORS create mode 100644 mobile/COPYING create mode 100644 mobile/INSTALL create mode 100644 mobile/LICENSE.LGPLv2.1 create mode 100755 mobile/Makefile.am create mode 100644 mobile/NOTICE create mode 100644 mobile/PLUGINS create mode 100644 mobile/README create mode 100755 mobile/audioeq/Makefile.am create mode 100755 mobile/audioeq/src/Makefile.am create mode 100644 mobile/audioeq/src/gstaudioeq.c create mode 100644 mobile/audioeq/src/gstaudioeq.h create mode 100755 mobile/audiotp/Makefile.am create mode 100755 mobile/audiotp/src/Makefile.am create mode 100644 mobile/audiotp/src/gstaudiotp.c create mode 100755 mobile/audiotp/src/gstaudiotp.h create mode 100755 mobile/autogen.sh create mode 100755 mobile/autoregen.sh create mode 100644 mobile/avsystem/Makefile.am create mode 100644 mobile/avsystem/src/Makefile.am create mode 100644 mobile/avsystem/src/gstavsysaudiosink.c create mode 100644 mobile/avsystem/src/gstavsysaudiosink.h create mode 100644 mobile/avsystem/src/gstavsysaudiosrc.c create mode 100644 mobile/avsystem/src/gstavsysaudiosrc.h create mode 100644 mobile/avsystem/src/gstavsysmemsink.c create mode 100644 mobile/avsystem/src/gstavsysmemsink.h create mode 100644 mobile/avsystem/src/gstavsyssink.c create mode 100644 mobile/avsystem/src/gstavsyssrc.c create mode 100755 mobile/common/ChangeLog create mode 100644 mobile/common/Makefile.am create mode 100755 mobile/common/c-to-xml.py create mode 100755 mobile/common/check-exports create mode 100755 mobile/common/check.mak create mode 100755 mobile/common/coverage/coverage-report-entry.pl create mode 100755 mobile/common/coverage/coverage-report.pl create mode 100755 mobile/common/coverage/coverage-report.xsl create mode 100755 mobile/common/coverage/lcov.mak create mode 100755 mobile/common/gettext.patch create mode 100755 mobile/common/glib-gen.mak create mode 100755 mobile/common/gst-autogen.sh create mode 100755 mobile/common/gst-xmlinspect.py create mode 100755 mobile/common/gst.supp create mode 100755 mobile/common/gstdoc-scangobj create mode 100755 mobile/common/gtk-doc-plugins.mak create mode 100755 mobile/common/gtk-doc.mak create mode 100644 mobile/common/m4/Makefile.am create mode 100755 mobile/common/m4/README create mode 100755 mobile/common/m4/as-ac-expand.m4 create mode 100755 mobile/common/m4/as-auto-alt.m4 create mode 100755 mobile/common/m4/as-compiler-flag.m4 create mode 100755 mobile/common/m4/as-compiler.m4 create mode 100755 mobile/common/m4/as-docbook.m4 create mode 100755 mobile/common/m4/as-gcc-inline-assembly.m4 create mode 100755 mobile/common/m4/as-libtool-tags.m4 create mode 100755 mobile/common/m4/as-libtool.m4 create mode 100755 mobile/common/m4/as-python.m4 create mode 100755 mobile/common/m4/as-scrub-include.m4 create mode 100755 mobile/common/m4/as-version.m4 create mode 100755 mobile/common/m4/ax_create_stdint_h.m4 create mode 100755 mobile/common/m4/check.m4 create mode 100755 mobile/common/m4/gettext.m4 create mode 100755 mobile/common/m4/glib-gettext.m4 create mode 100755 mobile/common/m4/gst-arch.m4 create mode 100755 mobile/common/m4/gst-args.m4 create mode 100755 mobile/common/m4/gst-check.m4 create mode 100755 mobile/common/m4/gst-debuginfo.m4 create mode 100755 mobile/common/m4/gst-default.m4 create mode 100755 mobile/common/m4/gst-doc.m4 create mode 100755 mobile/common/m4/gst-error.m4 create mode 100755 mobile/common/m4/gst-feature.m4 create mode 100755 mobile/common/m4/gst-function.m4 create mode 100755 mobile/common/m4/gst-gettext.m4 create mode 100755 mobile/common/m4/gst-glib2.m4 create mode 100755 mobile/common/m4/gst-libxml2.m4 create mode 100755 mobile/common/m4/gst-parser.m4 create mode 100755 mobile/common/m4/gst-plugin-docs.m4 create mode 100755 mobile/common/m4/gst-plugindir.m4 create mode 100755 mobile/common/m4/gst-valgrind.m4 create mode 100644 mobile/common/m4/gst-x11.m4 create mode 100755 mobile/common/m4/gst.m4 create mode 100755 mobile/common/m4/gtk-doc.m4 create mode 100755 mobile/common/m4/iconv.m4 create mode 100755 mobile/common/m4/isc-posix.m4 create mode 100755 mobile/common/m4/lib-ld.m4 create mode 100755 mobile/common/m4/lib-link.m4 create mode 100755 mobile/common/m4/lib-prefix.m4 create mode 100644 mobile/common/m4/libtool.m4 create mode 100644 mobile/common/m4/ltoptions.m4 create mode 100644 mobile/common/m4/ltsugar.m4 create mode 100644 mobile/common/m4/ltversion.m4 create mode 100644 mobile/common/m4/lt~obsolete.m4 create mode 100755 mobile/common/m4/pkg.m4 create mode 100755 mobile/common/m4/progtest.m4 create mode 100755 mobile/common/mangle-tmpl.py create mode 100755 mobile/common/plugins.xsl create mode 100755 mobile/common/po.mak create mode 100755 mobile/common/release.mak create mode 100755 mobile/common/scangobj-merge.py create mode 100755 mobile/common/upload.mak create mode 100755 mobile/common/win32.mak create mode 100644 mobile/configure.ac create mode 100755 mobile/drmsrc/Makefile.am create mode 100755 mobile/drmsrc/src/Makefile.am create mode 100644 mobile/drmsrc/src/gstdrmsrc.c create mode 100755 mobile/drmsrc/src/gstdrmsrc.h create mode 100644 mobile/encodebin/Makefile.am create mode 100644 mobile/encodebin/src/Makefile.am create mode 100644 mobile/encodebin/src/gstencodebin.c create mode 100644 mobile/encodebin/src/gstencodebin.h create mode 100644 mobile/evasimagesink/Makefile.am create mode 100644 mobile/evasimagesink/src/Makefile.am create mode 100644 mobile/evasimagesink/src/gstevasimagesink.c create mode 100644 mobile/evasimagesink/src/gstevasimagesink.h create mode 100644 mobile/evaspixmapsink/Makefile.am create mode 100644 mobile/evaspixmapsink/evaspixmapsink.c create mode 100644 mobile/evaspixmapsink/evaspixmapsink.h create mode 100644 mobile/evaspixmapsink/xv_types.h create mode 100755 mobile/gst-autogen.sh create mode 100755 mobile/gst-plugins-ext0.10.manifest create mode 100644 mobile/m4/Makefile.am create mode 100755 mobile/m4/as-compiler-flag.m4 create mode 100755 mobile/m4/as-version.m4 create mode 100755 mobile/pdpushsrc/Makefile.am create mode 100755 mobile/pdpushsrc/src/Makefile.am create mode 100644 mobile/pdpushsrc/src/gstpdpushsrc.c create mode 100755 mobile/pdpushsrc/src/gstpdpushsrc.h create mode 100755 mobile/toggle/Makefile.am create mode 100755 mobile/toggle/src/Makefile.am create mode 100755 mobile/toggle/src/gsttoggle.c create mode 100755 mobile/toggle/src/gsttoggle.h create mode 100644 mobile/xvimagesrc/Makefile.am create mode 100644 mobile/xvimagesrc/src/Makefile.am create mode 100644 mobile/xvimagesrc/src/gstxvimagesrc.c create mode 100644 mobile/xvimagesrc/src/gstxvimagesrc.h create mode 100755 mobile/xvimagesrc/src/xv_types.h create mode 100755 packaging/gst-plugins-ext0.10-0.3.14.tar.gz create mode 100644 packaging/gst-plugins-ext0.10.spec create mode 100644 wearable/AUTHORS create mode 100644 wearable/COPYING create mode 100644 wearable/INSTALL create mode 100644 wearable/LICENSE.LGPLv2.1 create mode 100755 wearable/Makefile.am create mode 100644 wearable/NEWS create mode 100644 wearable/PLUGINS create mode 100644 wearable/README create mode 100644 wearable/aclocal.m4 create mode 100755 wearable/audioeq/Makefile.am create mode 100755 wearable/audioeq/src/Makefile.am create mode 100644 wearable/audioeq/src/gstaudioeq.c create mode 100644 wearable/audioeq/src/gstaudioeq.h create mode 100755 wearable/audiotp/Makefile.am create mode 100755 wearable/audiotp/src/Makefile.am create mode 100755 wearable/audiotp/src/gstaudiotp.c create mode 100755 wearable/audiotp/src/gstaudiotp.h create mode 100755 wearable/autogen.sh create mode 100755 wearable/autoregen.sh create mode 100644 wearable/avsystem/Makefile.am create mode 100644 wearable/avsystem/src/Makefile.am create mode 100755 wearable/avsystem/src/gstavsysaudiosink.c create mode 100644 wearable/avsystem/src/gstavsysaudiosink.h create mode 100644 wearable/avsystem/src/gstavsysaudiosrc.c create mode 100644 wearable/avsystem/src/gstavsysaudiosrc.h create mode 100644 wearable/avsystem/src/gstavsysmemsink.c create mode 100644 wearable/avsystem/src/gstavsysmemsink.h create mode 100644 wearable/avsystem/src/gstavsyssink.c create mode 100644 wearable/avsystem/src/gstavsyssrc.c create mode 100755 wearable/common/ChangeLog create mode 100644 wearable/common/Makefile.am create mode 100755 wearable/common/c-to-xml.py create mode 100755 wearable/common/check-exports create mode 100755 wearable/common/check.mak create mode 100755 wearable/common/coverage/coverage-report-entry.pl create mode 100755 wearable/common/coverage/coverage-report.pl create mode 100755 wearable/common/coverage/coverage-report.xsl create mode 100755 wearable/common/coverage/lcov.mak create mode 100755 wearable/common/gettext.patch create mode 100755 wearable/common/glib-gen.mak create mode 100755 wearable/common/gst-autogen.sh create mode 100755 wearable/common/gst-xmlinspect.py create mode 100755 wearable/common/gst.supp create mode 100755 wearable/common/gstdoc-scangobj create mode 100755 wearable/common/gtk-doc-plugins.mak create mode 100755 wearable/common/gtk-doc.mak create mode 100644 wearable/common/m4/Makefile.am create mode 100755 wearable/common/m4/README create mode 100755 wearable/common/m4/as-ac-expand.m4 create mode 100755 wearable/common/m4/as-auto-alt.m4 create mode 100755 wearable/common/m4/as-compiler-flag.m4 create mode 100755 wearable/common/m4/as-compiler.m4 create mode 100755 wearable/common/m4/as-docbook.m4 create mode 100755 wearable/common/m4/as-gcc-inline-assembly.m4 create mode 100755 wearable/common/m4/as-libtool-tags.m4 create mode 100755 wearable/common/m4/as-libtool.m4 create mode 100755 wearable/common/m4/as-python.m4 create mode 100755 wearable/common/m4/as-scrub-include.m4 create mode 100755 wearable/common/m4/as-version.m4 create mode 100755 wearable/common/m4/ax_create_stdint_h.m4 create mode 100755 wearable/common/m4/check.m4 create mode 100755 wearable/common/m4/gettext.m4 create mode 100755 wearable/common/m4/glib-gettext.m4 create mode 100755 wearable/common/m4/gst-arch.m4 create mode 100755 wearable/common/m4/gst-args.m4 create mode 100755 wearable/common/m4/gst-check.m4 create mode 100755 wearable/common/m4/gst-debuginfo.m4 create mode 100755 wearable/common/m4/gst-default.m4 create mode 100755 wearable/common/m4/gst-doc.m4 create mode 100755 wearable/common/m4/gst-error.m4 create mode 100755 wearable/common/m4/gst-feature.m4 create mode 100755 wearable/common/m4/gst-function.m4 create mode 100755 wearable/common/m4/gst-gettext.m4 create mode 100755 wearable/common/m4/gst-glib2.m4 create mode 100755 wearable/common/m4/gst-libxml2.m4 create mode 100755 wearable/common/m4/gst-parser.m4 create mode 100755 wearable/common/m4/gst-plugin-docs.m4 create mode 100755 wearable/common/m4/gst-plugindir.m4 create mode 100755 wearable/common/m4/gst-valgrind.m4 create mode 100644 wearable/common/m4/gst-x11.m4 create mode 100755 wearable/common/m4/gst.m4 create mode 100755 wearable/common/m4/gtk-doc.m4 create mode 100755 wearable/common/m4/iconv.m4 create mode 100755 wearable/common/m4/isc-posix.m4 create mode 100755 wearable/common/m4/lib-ld.m4 create mode 100755 wearable/common/m4/lib-link.m4 create mode 100755 wearable/common/m4/lib-prefix.m4 create mode 100644 wearable/common/m4/libtool.m4 create mode 100644 wearable/common/m4/ltoptions.m4 create mode 100644 wearable/common/m4/ltsugar.m4 create mode 100644 wearable/common/m4/ltversion.m4 create mode 100644 wearable/common/m4/lt~obsolete.m4 create mode 100755 wearable/common/m4/pkg.m4 create mode 100755 wearable/common/m4/progtest.m4 create mode 100755 wearable/common/mangle-tmpl.py create mode 100755 wearable/common/plugins.xsl create mode 100755 wearable/common/po.mak create mode 100755 wearable/common/release.mak create mode 100755 wearable/common/scangobj-merge.py create mode 100755 wearable/common/upload.mak create mode 100755 wearable/common/win32.mak create mode 100755 wearable/compile create mode 100755 wearable/config.guess create mode 100644 wearable/config.h.in create mode 100755 wearable/config.sub create mode 100755 wearable/configure create mode 100755 wearable/configure.ac create mode 100644 wearable/control.in create mode 100755 wearable/dashdemux/Makefile.am create mode 100644 wearable/dashdemux/src/Makefile.am create mode 100644 wearable/dashdemux/src/Makefile.in create mode 100755 wearable/dashdemux/src/glibcompat.h create mode 100755 wearable/dashdemux/src/gstdashdemux.c create mode 100755 wearable/dashdemux/src/gstdashdemux.h create mode 100755 wearable/dashdemux/src/gstfragment.c create mode 100755 wearable/dashdemux/src/gstfragment.h create mode 100755 wearable/dashdemux/src/gstfragmented.h create mode 100755 wearable/dashdemux/src/gstmpdparser.c create mode 100755 wearable/dashdemux/src/gstmpdparser.h create mode 100755 wearable/dashdemux/src/gstplugin.c create mode 100755 wearable/dashdemux/src/gsturidownloader.c create mode 100755 wearable/dashdemux/src/gsturidownloader.h create mode 100755 wearable/depcomp create mode 100644 wearable/encodebin/Makefile.am create mode 100644 wearable/encodebin/src/Makefile.am create mode 100644 wearable/encodebin/src/gstencodebin.c create mode 100644 wearable/encodebin/src/gstencodebin.h create mode 100644 wearable/evasimagesink/Makefile.am create mode 100644 wearable/evasimagesink/src/Makefile.am create mode 100644 wearable/evasimagesink/src/gstevasimagesink.c create mode 100644 wearable/evasimagesink/src/gstevasimagesink.h create mode 100644 wearable/evaspixmapsink/Makefile.am create mode 100644 wearable/evaspixmapsink/evaspixmapsink.c create mode 100644 wearable/evaspixmapsink/evaspixmapsink.h create mode 100644 wearable/evaspixmapsink/xv_types.h create mode 100755 wearable/gst-autogen.sh create mode 100755 wearable/gst-plugins-ext0.10.manifest create mode 100755 wearable/install-sh create mode 100755 wearable/ltmain.sh create mode 100644 wearable/m4/Makefile.am create mode 100755 wearable/m4/as-compiler-flag.m4 create mode 100755 wearable/m4/as-version.m4 create mode 100644 wearable/missing create mode 100755 wearable/pdpushsrc/Makefile.am create mode 100755 wearable/pdpushsrc/src/Makefile.am create mode 100755 wearable/pdpushsrc/src/gstpdpushsrc.c create mode 100755 wearable/pdpushsrc/src/gstpdpushsrc.h create mode 100755 wearable/toggle/Makefile.am create mode 100755 wearable/toggle/src/Makefile.am create mode 100755 wearable/toggle/src/gsttoggle.c create mode 100755 wearable/toggle/src/gsttoggle.h create mode 100755 wearable/uninstall.sh create mode 100644 wearable/xvimagesrc/Makefile.am create mode 100644 wearable/xvimagesrc/src/Makefile.am create mode 100755 wearable/xvimagesrc/src/gstxvimagesrc.c create mode 100755 wearable/xvimagesrc/src/gstxvimagesrc.h create mode 100644 wearable/xvimagesrc/src/xv_types.h diff --git a/mobile/AUTHORS b/mobile/AUTHORS new file mode 100644 index 0000000..6f522a8 --- /dev/null +++ b/mobile/AUTHORS @@ -0,0 +1,5 @@ +JongHyuk Choi +Seungbae Shin +Younghwan Ahn +Jeongmo Yang +Sangchul Lee diff --git a/mobile/COPYING b/mobile/COPYING new file mode 100644 index 0000000..8add30a --- /dev/null +++ b/mobile/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/mobile/INSTALL b/mobile/INSTALL new file mode 100644 index 0000000..23e5f25 --- /dev/null +++ b/mobile/INSTALL @@ -0,0 +1,236 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free +Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). Here is a another example: + + /bin/bash ./configure CONFIG_SHELL=/bin/bash + +Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent +configuration-related scripts to be executed by `/bin/bash'. + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/mobile/LICENSE.LGPLv2.1 b/mobile/LICENSE.LGPLv2.1 new file mode 100644 index 0000000..8add30a --- /dev/null +++ b/mobile/LICENSE.LGPLv2.1 @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/mobile/Makefile.am b/mobile/Makefile.am new file mode 100755 index 0000000..16eea53 --- /dev/null +++ b/mobile/Makefile.am @@ -0,0 +1,82 @@ + +ACLOCAL_AMFLAGS = -I common/m4 + +aclocaldir = $(datadir)/aclocal + +SUBDIRS = common + +if GST_EXT_USE_EXT_ENCODEBIN +SUBDIRS += encodebin +endif + +if GST_EXT_USE_EXT_AVSYSTEM +SUBDIRS += avsystem +endif + +if GST_EXT_USE_EXT_EVASIMAGESINK +SUBDIRS += evasimagesink +endif + +if GST_EXT_USE_EXT_EVASPIXMAPSINK +SUBDIRS += evaspixmapsink +endif + +if GST_EXT_USE_EXT_XVIMAGESRC +SUBDIRS += xvimagesrc +endif + +if GST_EXT_USE_EXT_DRMSRC +SUBDIRS += drmsrc +endif + +if GST_EXT_USE_EXT_TOGGLE +SUBDIRS += toggle +endif + +if GST_EXT_USE_EXT_AVSYSTEM +SUBDIRS += pdpushsrc +endif + +if GST_EXT_USE_EXT_AUDIOTP +SUBDIRS += audiotp +endif + +if GST_EXT_USE_EXT_AUDIOEQ +SUBDIRS += audioeq +endif + +DIST_SUBDIRS = common + +if GST_EXT_USE_EXT_ENCODEBIN +DIST_SUBDIRS += encodebin +endif + +if GST_EXT_USE_EXT_AVSYSTEM +DIST_SUBDIRS += avsystem +endif + +if GST_EXT_USE_EXT_EVASIMAGESINK +DIST_SUBDIRS += evasimagesink +endif + +if GST_EXT_USE_EXT_XVIMAGESRC +DIST_SUBDIRS += xvimagesrc +endif + +if GST_EXT_USE_EXT_DRMSRC +DIST_SUBDIRS += drmsrc +endif + +if GST_EXT_USE_EXT_TOGGLE +DIST_SUBDIRS += toggle +endif + + +EXTRA_DIST = \ + gstreamer.spec gstreamer.spec.in \ + configure.ac autogen.sh depcomp \ + MAINTAINERS ABOUT-NLS RELEASE gstreamer.doap \ + $(win32) + +check: check-exports + diff --git a/mobile/NOTICE b/mobile/NOTICE new file mode 100644 index 0000000..0e6ffbb --- /dev/null +++ b/mobile/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 +Please, see the LICENSE file for GNU LESSER GENERAL PUBLIC LICENSE terms and conditions. diff --git a/mobile/PLUGINS b/mobile/PLUGINS new file mode 100644 index 0000000..a737f3a --- /dev/null +++ b/mobile/PLUGINS @@ -0,0 +1,15 @@ +# This file is descriptions of the plugins which are included in gstreamer0.10-plugins-ext. +# If any plugin is added to the gstreamer0.10-plugins-ext, that shoud be described in this file. +# +# + +------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +PLUGIN Registered Elements Description +------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +avsysaudiosrc avsysaudiosrc AV system audio source plugin +avsyssink avsysaudiosink, avsysmemsink AV system audio sink plugin +drmsrc drmsrc Plugin to read data from standad/DRM file +encodebin encodebin Extension encoder bin plugin +evasimagesink evasimagesink Evas video sink plugin +toggle toggle Base transform plugin +------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/mobile/README b/mobile/README new file mode 100644 index 0000000..9681276 --- /dev/null +++ b/mobile/README @@ -0,0 +1,12 @@ +gst-plugin is a template for writing your own GStreamer plug-in. + +The code is deliberately kept simple so that you quickly understand the basics +of how to set up autotools and your source tree. + +This template demonstrates : +- what to do in autogen.sh +- how to setup configure.ac (your package name and version, GStreamer flags) +- how to setup your source dir +- what to put in Makefile.am + +More features might get added to this template later on. diff --git a/mobile/audioeq/Makefile.am b/mobile/audioeq/Makefile.am new file mode 100755 index 0000000..308a09c --- /dev/null +++ b/mobile/audioeq/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/audioeq/src/Makefile.am b/mobile/audioeq/src/Makefile.am new file mode 100755 index 0000000..6981e78 --- /dev/null +++ b/mobile/audioeq/src/Makefile.am @@ -0,0 +1,28 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstaudioeq.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstaudioeq_la_SOURCES = gstaudioeq.c + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgstaudioeq_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) +libgstaudioeq_la_LIBADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) $(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) $(GST_LIBS) $(LIBM) -lgstbase-0.10 -lglib-2.0 -lgstcontroller-0.10 +libgstaudioeq_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +libgstequalizer_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = gstaudioeq.h diff --git a/mobile/audioeq/src/gstaudioeq.c b/mobile/audioeq/src/gstaudioeq.c new file mode 100644 index 0000000..9185861 --- /dev/null +++ b/mobile/audioeq/src/gstaudioeq.c @@ -0,0 +1,1313 @@ +/* + * audioeq + * + * Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Aditi Narula + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "gstaudioeq.h" + +GST_DEBUG_CATEGORY_STATIC (gst_audioeq_debug); +#define GST_CAT_DEFAULT gst_audioeq_debug + +#define AUDIOEQ_ENABLE_DUMP +#define AUDIOEQ_REDUCE_MEMCPY + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_FILTER_ACTION, + PROP_CUSTOM_EQ, + PROP_CUSTOM_EQ_NUM, + PROP_CUSTOM_EQ_FREQ, + PROP_CUSTOM_EQ_WIDTH, +}; + +enum FilterActionType +{ + FILTER_NONE, + FILTER_PRESET, + FILTER_ADVANCED_SETTING +}; + +enum SampleRate +{ + SAMPLERATE_48000Hz, + SAMPLERATE_44100Hz, + SAMPLERATE_32000Hz, + SAMPLERATE_24000Hz, + SAMPLERATE_22050Hz, + SAMPLERATE_16000Hz, + SAMPLERATE_12000Hz, + SAMPLERATE_11025Hz, + SAMPLERATE_8000Hz, + + SAMPLERATE_NUM +}; + +#define DEFAULT_SAMPLE_SIZE 2 +#define DEFAULT_VOLUME 15 +#define DEFAULT_GAIN 1 +#define DEFAULT_SAMPLE_RATE SAMPLERATE_44100Hz +#define DEAFULT_CHANNELS 2 +#define DEFAULT_FILTER_ACTION FILTER_NONE +#define DEFAULT_CUSTOM_EQ_NUM 7 + +static GstStaticPadTemplate sinktemplate = + GST_STATIC_PAD_TEMPLATE( + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ( + "audio/x-raw-int, " + "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "channels = (int) [1,2]" + ) + ); + +static GstStaticPadTemplate srctemplate = + GST_STATIC_PAD_TEMPLATE( + "src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ( + "audio/x-raw-int, " + "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " + "signed = (boolean) true, " + "width = (int) 16, " + "depth = (int) 16, " + "channels = (int) [1,2]" + ) + ); + +static void gst_iir_equalizer_child_proxy_interface_init (gpointer g_iface, + gpointer iface_data); + +static void gst_iir_equalizer_finalize (GObject * object); + +static gboolean gst_iir_equalizer_setup (GstAudioFilter * filter, + GstRingBufferSpec * fmt); + +static void +_do_init (GType object_type) +{ + const GInterfaceInfo child_proxy_interface_info = { + (GInterfaceInitFunc) gst_iir_equalizer_child_proxy_interface_init, + NULL, /* interface_finalize */ + NULL /* interface_data */ + }; + + g_type_add_interface_static (object_type, GST_TYPE_CHILD_PROXY, + &child_proxy_interface_info); +} + +GST_BOILERPLATE_FULL(Gstaudioeq, gst_audioeq, GstBaseTransform, GST_TYPE_BASE_TRANSFORM,_do_init); + +static void gst_audioeq_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_audioeq_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +#ifdef AUDIOEQ_REDUCE_MEMCPY +static GstFlowReturn gst_audioeq_transform_ip (GstBaseTransform * base, GstBuffer * buf); +#else +static GstFlowReturn gst_audioeq_transform (GstBaseTransform * base, GstBuffer * inbuf, GstBuffer * outbuf); +#endif +static gboolean gst_audioeq_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps); + +static GstStateChangeReturn +gst_audioeq_change_state (GstElement * element, GstStateChange transition) +{ + GST_DEBUG ("gst_audioeq_change_state"); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + Gstaudioeq *audioeq = GST_AUDIOEQ (element); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + audioeq->need_update_filter = TRUE; + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + if (ret == GST_STATE_CHANGE_FAILURE) + return ret; + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + default: + break; + } + + return ret; +} + +static void +gst_audioeq_base_init (gpointer gclass) +{ + + GST_DEBUG ("gst_audioeq_base_init"); + static GstElementDetails element_details = { + "Audio Equalizer", + "Filter/Effect/Audio", + "Set equalisation effect on audio/raw streams", + "Samsung Electronics " + }; + + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_add_pad_template(element_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template(element_class, + gst_static_pad_template_get (&sinktemplate)); + + gst_element_class_set_details(element_class, &element_details); +} + +static void +gst_audioeq_class_init (GstaudioeqClass * klass) +{ + GST_DEBUG ("gst_audioeq_class_init"); + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseTransformClass *basetransform_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = GST_ELEMENT_CLASS (klass); + basetransform_class = GST_BASE_TRANSFORM_CLASS(klass); + + gobject_class->set_property = GST_DEBUG_FUNCPTR(gst_audioeq_set_property); + gobject_class->get_property = GST_DEBUG_FUNCPTR(gst_audioeq_get_property); + + gstelement_class->change_state = GST_DEBUG_FUNCPTR(gst_audioeq_change_state); + + g_object_class_install_property(gobject_class, PROP_FILTER_ACTION, + g_param_spec_uint("filter-action", "filter action", "(0)none (1)preset (2)advanced setting", + 0, 2, DEFAULT_FILTER_ACTION, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_CUSTOM_EQ, + g_param_spec_pointer("custom-eq", "custom eq", + "pointer for 9 bands of EQ array", G_PARAM_READWRITE)); + + g_object_class_install_property(gobject_class, PROP_CUSTOM_EQ_NUM, + g_param_spec_uint("custom-eq-num", "custom eq num", "number of custom EQ bands", + 0, 9, DEFAULT_CUSTOM_EQ_NUM, G_PARAM_READABLE)); + + g_object_class_install_property(gobject_class, PROP_CUSTOM_EQ_FREQ, + g_param_spec_pointer("custom-eq-freq", "custom eq freq", "pointer for EQ bands central frequency(Hz) array", + G_PARAM_READABLE)); + + g_object_class_install_property(gobject_class, PROP_CUSTOM_EQ_WIDTH, + g_param_spec_pointer("custom-eq-width", "custom eq width", "pointer for EQ bands width(Hz) array", + G_PARAM_READABLE)); + + gobject_class->finalize = GST_DEBUG_FUNCPTR(gst_iir_equalizer_finalize); + +/* It is possible to reduce memcpy by setting output same as input of AudioEq_InOutConfig */ +#ifdef AUDIOEQ_REDUCE_MEMCPY + basetransform_class->transform_ip = GST_DEBUG_FUNCPTR(gst_audioeq_transform_ip); +#endif + basetransform_class->set_caps = GST_DEBUG_FUNCPTR(gst_audioeq_set_caps); +} + +static void +gst_audioeq_init (Gstaudioeq * audioeq, GstaudioeqClass * gclass) +{ + GST_DEBUG ("gst_audioeq_init"); + audioeq->samplerate = DEFAULT_SAMPLE_RATE; + audioeq->channels = DEAFULT_CHANNELS; + + audioeq->filter_action = DEFAULT_FILTER_ACTION; + memset(audioeq->custom_eq, 0x00, sizeof(gint) * CUSTOM_EQ_BAND_MAX); + audioeq->need_update_filter = TRUE; + audioeq->equ.bands_lock = g_mutex_new (); + audioeq->equ.need_new_coefficients = TRUE; + gst_iir_equalizer_compute_frequencies (audioeq, DEFAULT_CUSTOM_EQ_NUM); +} +/* equalizer implementation */ + +static void +gst_iir_equalizer_finalize (GObject * object) +{ + GST_DEBUG ("gst_iir_equalizer_finalize"); + Gstaudioeq *audioeq = GST_AUDIOEQ(object); + GstIirEqualizer *equ = &audioeq->equ; + gint i; + + for (i = 0; i < equ->freq_band_count; i++) { + if (equ->bands[i]) + gst_object_unparent (GST_OBJECT (equ->bands[i])); + equ->bands[i] = NULL; + } + equ->freq_band_count = 0; + + g_free (equ->bands); + g_free (equ->history); + + g_mutex_free (equ->bands_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +#define BANDS_LOCK(equ) g_mutex_lock(equ->bands_lock) +#define BANDS_UNLOCK(equ) g_mutex_unlock(equ->bands_lock) + +/* child object */ + +enum +{ + PROP_GAIN = 1, + PROP_FREQ, + PROP_BANDWIDTH, + PROP_TYPE +}; + +typedef enum +{ + BAND_TYPE_PEAK = 0, + BAND_TYPE_LOW_SHELF, + BAND_TYPE_HIGH_SHELF +} GstIirEqualizerBandType; + +#define GST_TYPE_IIR_EQUALIZER_BAND_TYPE (gst_iir_equalizer_band_type_get_type ()) +static GType +gst_iir_equalizer_band_type_get_type (void) +{ + GST_DEBUG ("gst_iir_equalizer_band_type_get_type"); + static GType gtype = 0; + + if (gtype == 0) { + static const GEnumValue values[] = { + {BAND_TYPE_PEAK, "Peak filter (default for inner bands)", "peak"}, + {BAND_TYPE_LOW_SHELF, "Low shelf filter (default for first band)", + "low-shelf"}, + {BAND_TYPE_HIGH_SHELF, "High shelf filter (default for last band)", + "high-shelf"}, + {0, NULL, NULL} + }; + + gtype = g_enum_register_static ("GstIirEqualizerBandType", values); + } + return gtype; +} + + +typedef struct _GstIirEqualizerBandClass GstIirEqualizerBandClass; + +#define GST_TYPE_IIR_EQUALIZER_BAND \ + (gst_iir_equalizer_band_get_type()) +#define GST_IIR_EQUALIZER_BAND(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER_BAND,GstIirEqualizerBand)) +#define GST_IIR_EQUALIZER_BAND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER_BAND,GstIirEqualizerBandClass)) +#define GST_IS_IIR_EQUALIZER_BAND(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER_BAND)) +#define GST_IS_IIR_EQUALIZER_BAND_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER_BAND)) + +struct _GstIirEqualizerBand +{ + GstObject object; + + /*< private > */ + /* center frequency and gain */ + gdouble freq; + gdouble gain; + gdouble width; + GstIirEqualizerBandType type; + + /* second order iir filter */ + gdouble b1, b2; /* IIR coefficients for outputs */ + gdouble a0, a1, a2; /* IIR coefficients for inputs */ +}; + +struct _GstIirEqualizerBandClass +{ + GstObjectClass parent_class; +}; + +static GType gst_iir_equalizer_band_get_type (void); + +static void +gst_iir_equalizer_band_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GST_DEBUG ("gst_iir_equalizer_band_set_property"); + GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); + Gstaudioeq *audioeq = GST_AUDIOEQ (gst_object_get_parent (GST_OBJECT (band))); + GstIirEqualizer *equ = &audioeq->equ; + + switch (prop_id) { + case PROP_GAIN:{ + gdouble gain; + + gain = g_value_get_double (value); + GST_DEBUG_OBJECT (band, "gain = %lf -> %lf", band->gain, gain); + if (gain != band->gain) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->gain = gain; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed gain = %lf ", band->gain); + } + break; + } + case PROP_FREQ:{ + gdouble freq; + + freq = g_value_get_double (value); + GST_DEBUG_OBJECT (band, "freq = %lf -> %lf", band->freq, freq); + if (freq != band->freq) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->freq = freq; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed freq = %lf ", band->freq); + } + break; + } + case PROP_BANDWIDTH:{ + gdouble width; + + width = g_value_get_double (value); + GST_DEBUG_OBJECT (band, "width = %lf -> %lf", band->width, width); + if (width != band->width) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->width = width; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed width = %lf ", band->width); + } + break; + } + case PROP_TYPE:{ + GstIirEqualizerBandType type; + + type = g_value_get_enum (value); + GST_DEBUG_OBJECT (band, "type = %d -> %d", band->type, type); + if (type != band->type) { + BANDS_LOCK (equ); + equ->need_new_coefficients = TRUE; + band->type = type; + BANDS_UNLOCK (equ); + GST_DEBUG_OBJECT (band, "changed type = %d ", band->type); + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + gst_object_unref (audioeq); +} + +static void +gst_iir_equalizer_band_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GST_DEBUG ("gst_iir_equalizer_band_get_property"); + GstIirEqualizerBand *band = GST_IIR_EQUALIZER_BAND (object); + + switch (prop_id) { + case PROP_GAIN: + g_value_set_double (value, band->gain); + break; + case PROP_FREQ: + g_value_set_double (value, band->freq); + break; + case PROP_BANDWIDTH: + g_value_set_double (value, band->width); + break; + case PROP_TYPE: + g_value_set_enum (value, band->type); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_iir_equalizer_band_class_init (GstIirEqualizerBandClass * klass) +{ + GST_DEBUG ("gst_iir_equalizer_band_class_init"); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_iir_equalizer_band_set_property; + gobject_class->get_property = gst_iir_equalizer_band_get_property; + + g_object_class_install_property (gobject_class, PROP_GAIN, + g_param_spec_double ("gain", "gain", + "gain for the frequency band ranging from -12.0 dB to +12.0 dB", + -12.0, 12.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_FREQ, + g_param_spec_double ("freq", "freq", + "center frequency of the band", + 0.0, 100000.0, 0.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_BANDWIDTH, + g_param_spec_double ("bandwidth", "bandwidth", + "difference between bandedges in Hz", + 0.0, 100000.0, 1.0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); + + g_object_class_install_property (gobject_class, PROP_TYPE, + g_param_spec_enum ("type", "Type", + "Filter type", GST_TYPE_IIR_EQUALIZER_BAND_TYPE, + BAND_TYPE_PEAK, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_CONTROLLABLE)); +} + +static void +gst_iir_equalizer_band_init (GstIirEqualizerBand * band, + GstIirEqualizerBandClass * klass) +{ + GST_DEBUG ("gst_iir_equalizer_band_init"); + band->freq = 0.0; + band->gain = 0.0; + band->width = 1.0; + band->type = BAND_TYPE_PEAK; +} + +static GType +gst_iir_equalizer_band_get_type (void) +{ + GST_DEBUG ("gst_iir_equalizer_band_get_type"); + static GType type = 0; + + if (G_UNLIKELY (!type)) { + const GTypeInfo type_info = { + sizeof (GstIirEqualizerBandClass), + NULL, + NULL, + (GClassInitFunc) gst_iir_equalizer_band_class_init, + NULL, + NULL, + sizeof (GstIirEqualizerBand), + 0, + (GInstanceInitFunc) gst_iir_equalizer_band_init, + }; + type = + g_type_register_static (GST_TYPE_OBJECT, "GstIirEqualizerBand", + &type_info, 0); + } + return (type); +} + + +/* child proxy iface */ +static GstObject * +gst_iir_equalizer_child_proxy_get_child_by_index (GstChildProxy * child_proxy, + guint index) +{ + GST_DEBUG ("gst_iir_equalizer_child_proxy_get_child_by_index"); + Gstaudioeq *audioeq = GST_AUDIOEQ(child_proxy); + GstIirEqualizer *equ = &audioeq->equ; + GstObject *ret; + + BANDS_LOCK (equ); + if (G_UNLIKELY (index >= equ->freq_band_count)) { + BANDS_UNLOCK (equ); + g_return_val_if_fail (index < equ->freq_band_count, NULL); + } + + ret = gst_object_ref (equ->bands[index]); + BANDS_UNLOCK (equ); + + GST_LOG_OBJECT (equ, "return child[%d] %" GST_PTR_FORMAT, index, ret); + return ret; +} + +static guint +gst_iir_equalizer_child_proxy_get_children_count (GstChildProxy * child_proxy) +{ + GST_DEBUG ("gst_iir_equalizer_child_proxy_get_children_count"); + Gstaudioeq *audioeq = GST_AUDIOEQ(child_proxy); + GstIirEqualizer *equ = &audioeq->equ; + + GST_LOG ("we have %d children", equ->freq_band_count); + return equ->freq_band_count; +} + +static void +gst_iir_equalizer_child_proxy_interface_init (gpointer g_iface, + gpointer iface_data) +{ + GstChildProxyInterface *iface = g_iface; + + GST_DEBUG ("initializing iface"); + + iface->get_child_by_index = gst_iir_equalizer_child_proxy_get_child_by_index; + iface->get_children_count = gst_iir_equalizer_child_proxy_get_children_count; +} +static void +gst_iir_equalizer_class_init (GstIirEqualizerClass * klass) +{ + GST_DEBUG ("gst_iir_equalizer_class_init"); +} + +static void +gst_iir_equalizer_init (GstIirEqualizer * eq, GstIirEqualizerClass * g_class) +{ + GST_DEBUG ("gst_iir_equalizer_init"); + eq->bands_lock = g_mutex_new (); + eq->need_new_coefficients = TRUE; +} + +GType +gst_iir_equalizer_get_type (void) +{ + GST_DEBUG ("gst_iir_equalizer_get_type"); + static GType type = 0; + + if (G_UNLIKELY (!type)) { + const GTypeInfo type_info = { + sizeof (GstIirEqualizerClass), + NULL, + NULL, + (GClassInitFunc) gst_iir_equalizer_class_init, + NULL, + NULL, + sizeof (GstIirEqualizer), + 0, + (GInstanceInitFunc) gst_iir_equalizer_init, + }; + type = + g_type_register_static (GST_TYPE_OBJECT, "GstIirEqualizer", + &type_info, 0); + } + return (type); +} +/* Filter taken from + * + * The Equivalence of Various Methods of Computing + * Biquad Coefficients for Audio Parametric Equalizers + * + * by Robert Bristow-Johnson + * + * http://www.aes.org/e-lib/browse.cfm?elib=6326 + * http://www.musicdsp.org/files/EQ-Coefficients.pdf + * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt + * + * The bandwidth method that we use here is the preferred + * one from this article transformed from octaves to frequency + * in Hz. + */ +static inline gdouble +arg_to_scale (gdouble arg) +{ + GST_DEBUG ("arg_to_scale"); + return (pow (10.0, arg / 40.0)); +} + +static gdouble +calculate_omega (gdouble freq, gint rate) +{ + GST_DEBUG ("calculate_omega"); + gdouble omega; + + if (freq / rate >= 0.5) + omega = G_PI; + else if (freq <= 0.0) + omega = 0.0; + else + omega = 2.0 * G_PI * (freq / rate); + + return omega; +} + +static gdouble +calculate_bw (GstIirEqualizerBand * band, gint rate) +{ + GST_DEBUG ("calculate_bw"); + gdouble bw = 0.0; + + if (band->width / rate >= 0.5) { + /* If bandwidth == 0.5 the calculation below fails as tan(G_PI/2) + * is undefined. So set the bandwidth to a slightly smaller value. + */ + bw = G_PI - 0.00000001; + } else if (band->width <= 0.0) { + /* If bandwidth == 0 this band won't change anything so set + * the coefficients accordingly. The coefficient calculation + * below would create coefficients that for some reason amplify + * the band. + */ + band->a0 = 1.0; + band->a1 = 0.0; + band->a2 = 0.0; + band->b1 = 0.0; + band->b2 = 0.0; + } else { + bw = 2.0 * G_PI * (band->width / rate); + } + return bw; +} + +static void +setup_peak_filter (Gstaudioeq* audioeq, GstIirEqualizerBand * band) +{ + GST_DEBUG ("setup_peak_filter"); + //g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); + + { + gdouble gain, omega, bw; + gdouble alpha, alpha1, alpha2, b0; + + gain = arg_to_scale (band->gain); + omega = calculate_omega (band->freq, audioeq->samplerate); + bw = calculate_bw (band, audioeq->samplerate); + if (bw == 0.0) + goto out; + + alpha = tan (bw / 2.0); + + alpha1 = alpha * gain; + alpha2 = alpha / gain; + + b0 = (1.0 + alpha2); + + band->a0 = (1.0 + alpha1) / b0; + band->a1 = (-2.0 * cos (omega)) / b0; + band->a2 = (1.0 - alpha1) / b0; + band->b1 = (2.0 * cos (omega)) / b0; + band->b2 = -(1.0 - alpha2) / b0; + + out: + GST_INFO + ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", + band->gain, band->width, band->freq, band->a0, band->a1, band->a2, + band->b1, band->b2); + } +} + +static void +setup_low_shelf_filter (Gstaudioeq* audioeq, GstIirEqualizerBand * band) +{ + GST_DEBUG ("setup_low_shelf_filter"); + //g_return_if_fail (GST_AUDIO_FILTER (equ)->format.rate); + + { + gdouble gain, omega, bw; + gdouble alpha, delta, b0; + gdouble egp, egm; + + gain = arg_to_scale (band->gain); + omega = calculate_omega (band->freq, audioeq->samplerate); + bw = calculate_bw (band, audioeq->samplerate); + if (bw == 0.0) + goto out; + + egm = gain - 1.0; + egp = gain + 1.0; + alpha = tan (bw / 2.0); + + delta = 2.0 * sqrt (gain) * alpha; + b0 = egp + egm * cos (omega) + delta; + + band->a0 = ((egp - egm * cos (omega) + delta) * gain) / b0; + band->a1 = ((egm - egp * cos (omega)) * 2.0 * gain) / b0; + band->a2 = ((egp - egm * cos (omega) - delta) * gain) / b0; + band->b1 = ((egm + egp * cos (omega)) * 2.0) / b0; + band->b2 = -((egp + egm * cos (omega) - delta)) / b0; + + + out: + GST_INFO + ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", + band->gain, band->width, band->freq, band->a0, band->a1, band->a2, + band->b1, band->b2); + } +} + +static void +setup_high_shelf_filter (Gstaudioeq* audioeq, GstIirEqualizerBand * band) +{ + GST_DEBUG ("setup_high_shelf_filter"); + { + gdouble gain, omega, bw; + gdouble alpha, delta, b0; + gdouble egp, egm; + + gain = arg_to_scale (band->gain); + omega = calculate_omega (band->freq, audioeq->samplerate); + bw = calculate_bw (band, audioeq->samplerate); + if (bw == 0.0) + goto out; + + egm = gain - 1.0; + egp = gain + 1.0; + alpha = tan (bw / 2.0); + + delta = 2.0 * sqrt (gain) * alpha; + b0 = egp - egm * cos (omega) + delta; + + band->a0 = ((egp + egm * cos (omega) + delta) * gain) / b0; + band->a1 = ((egm + egp * cos (omega)) * -2.0 * gain) / b0; + band->a2 = ((egp + egm * cos (omega) - delta) * gain) / b0; + band->b1 = ((egm - egp * cos (omega)) * -2.0) / b0; + band->b2 = -((egp - egm * cos (omega) - delta)) / b0; + + + out: + GST_INFO + ("gain = %5.1f, width= %7.2f, freq = %7.2f, a0 = %7.5g, a1 = %7.5g, a2=%7.5g b1 = %7.5g, b2 = %7.5g", + band->gain, band->width, band->freq, band->a0, band->a1, band->a2, + band->b1, band->b2); + } +} + +/* Must be called with bands_lock and transform lock! */ +static void +set_passthrough (Gstaudioeq* audioeq) +{ + GST_DEBUG ("set_passthrough"); + GstIirEqualizer* equ=&audioeq->equ; + gint i; + gboolean passthrough = TRUE; + + for (i = 0; i < equ->freq_band_count; i++) { + passthrough = passthrough && (equ->bands[i]->gain == 0.0); + } + + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (audioeq), passthrough); + GST_DEBUG ("Passthrough mode: %d\n", passthrough); +} + +/* Must be called with bands_lock and transform lock! */ +static void +update_coefficients (Gstaudioeq* audioeq) +{ + GST_DEBUG ("update_coefficients"); + GstIirEqualizer* equ=&audioeq->equ; + gint i, n = equ->freq_band_count; + + for (i = 0; i < n; i++) { + if (equ->bands[i]->type == BAND_TYPE_PEAK) + setup_peak_filter (audioeq, equ->bands[i]); + else if (equ->bands[i]->type == BAND_TYPE_LOW_SHELF) + setup_low_shelf_filter (audioeq, equ->bands[i]); + else + setup_high_shelf_filter (audioeq, equ->bands[i]); + } + + equ->need_new_coefficients = FALSE; +} + +/* Must be called with transform lock! */ +static void +alloc_history (GstIirEqualizer * equ) +{ + GST_DEBUG ("alloc_history"); + /* free + alloc = no memcpy */ + g_free (equ->history); + equ->history = + g_malloc0 (equ->history_size * equ->audiofilter.format.channels * + equ->freq_band_count); +} +void +gst_audioeq_band_set_property(Gstaudioeq * audioeq) +{ + GST_DEBUG ("gst_audioeq_band_set_property"); + GstIirEqualizer *equ = &audioeq->equ; + gshort i ; + for ( i = 0; i < DEFAULT_CUSTOM_EQ_NUM; i++){ + GST_DEBUG ("gain = %lf -> %d", equ->bands[i]->gain, audioeq->custom_eq[i] ); + if (audioeq->custom_eq[i] != equ->bands[i]->gain) { + equ->bands[i]->gain = audioeq->custom_eq[i]; + GST_DEBUG("changed gain = %lf ", equ->bands[i]->gain); + g_object_notify (G_OBJECT (equ->bands[i]), "gain"); + } + } +} + +void +gst_iir_equalizer_compute_frequencies (Gstaudioeq * audioeq, guint new_count) +{ + GST_DEBUG ("gst_iir_equalizer_compute_frequencies"); + + GstIirEqualizer *equ = &audioeq->equ; + guint old_count, i; + gdouble freq0, freq1, step; + gchar name[20]; + GST_DEBUG ("gst_iir_equalizer_compute_frequencies before calling equalizer object"); + if (equ->freq_band_count == new_count) + return; + + GST_DEBUG ("gst_iir_equalizer_compute_frequencies equalizer object"); + + BANDS_LOCK (equ); + GST_DEBUG ("gst_iir_equalizer_compute_frequencies 1"); + if (G_UNLIKELY (equ->freq_band_count == new_count)) { + BANDS_UNLOCK (equ); + return; + } + GST_DEBUG ("gst_iir_equalizer_compute_frequencies 2"); + old_count = equ->freq_band_count; + equ->freq_band_count = new_count; + GST_DEBUG ("bands %u -> %u", old_count, new_count); + + if (old_count < new_count) { + /* add new bands */ + equ->bands = g_realloc (equ->bands, sizeof (GstObject *) * new_count); + for (i = old_count; i < new_count; i++) { + equ->bands[i] = g_object_new (GST_TYPE_IIR_EQUALIZER_BAND, NULL); + /* otherwise they get names like 'iirequalizerband5' */ + sprintf (name, "band%u", i); + gst_object_set_name (GST_OBJECT (equ->bands[i]), name); + GST_DEBUG ("adding band[%d]=%p", i, equ->bands[i]); + + gst_object_set_parent (GST_OBJECT (equ->bands[i]), GST_OBJECT (audioeq)); + gst_child_proxy_child_added (GST_OBJECT (audioeq), + GST_OBJECT (equ->bands[i])); + } + } else { + /* free unused bands */ + for (i = new_count; i < old_count; i++) { + GST_DEBUG ("removing band[%d]=%p", i, equ->bands[i]); + gst_child_proxy_child_removed (GST_OBJECT (audioeq), + GST_OBJECT (equ->bands[i])); + gst_object_unparent (GST_OBJECT (equ->bands[i])); + equ->bands[i] = NULL; + } + } + + alloc_history (equ); + + /* set center frequencies and name band objects + * FIXME: arg! we can't change the name of parented objects :( + * application should read band->freq to get the name + */ + + step = pow (HIGHEST_FREQ / LOWEST_FREQ, 1.0 / new_count); + freq0 = LOWEST_FREQ; + for (i = 0; i < new_count; i++) { + freq1 = freq0 * step; + + if (i == 0) + equ->bands[i]->type = BAND_TYPE_LOW_SHELF; + else if (i == new_count - 1) + equ->bands[i]->type = BAND_TYPE_HIGH_SHELF; + else + equ->bands[i]->type = BAND_TYPE_PEAK; + + equ->bands[i]->freq = freq0 + ((freq1 - freq0) / 2.0); + equ->bands[i]->width = freq1 - freq0; + GST_DEBUG ("band[%2d] = '%lf'", i, equ->bands[i]->freq); + + g_object_notify (G_OBJECT (equ->bands[i]), "bandwidth"); + g_object_notify (G_OBJECT (equ->bands[i]), "freq"); + g_object_notify (G_OBJECT (equ->bands[i]), "type"); + + freq0 = freq1; + } + + equ->need_new_coefficients = TRUE; + + BANDS_UNLOCK (equ); +} +/* start of code that is type specific */ + +#define CREATE_OPTIMIZED_FUNCTIONS_INT(TYPE,BIG_TYPE,MIN_VAL,MAX_VAL) \ +typedef struct { \ + BIG_TYPE x1, x2; /* history of input values for a filter */ \ + BIG_TYPE y1, y2; /* history of output values for a filter */ \ +} SecondOrderHistory ## TYPE; \ + \ +static inline BIG_TYPE \ +one_step_ ## TYPE (GstIirEqualizerBand *filter, \ + SecondOrderHistory ## TYPE *history, BIG_TYPE input) \ +{ \ + /* calculate output */ \ + BIG_TYPE output = filter->a0 * input + \ + filter->a1 * history->x1 + filter->a2 * history->x2 + \ + filter->b1 * history->y1 + filter->b2 * history->y2; \ + /* update history */ \ + history->y2 = history->y1; \ + history->y1 = output; \ + history->x2 = history->x1; \ + history->x1 = input; \ + \ + return output; \ +} \ + \ +static const guint \ +history_size_ ## TYPE = sizeof (SecondOrderHistory ## TYPE); \ + \ +static void \ +gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \ +guint size, guint channels) \ +{ \ + guint frames = size / channels / sizeof (TYPE); \ + guint i, c, f, nf = equ->freq_band_count; \ + BIG_TYPE cur; \ + GstIirEqualizerBand **filters = equ->bands; \ + \ + for (i = 0; i < frames; i++) { \ + SecondOrderHistory ## TYPE *history = equ->history; \ + for (c = 0; c < channels; c++) { \ + cur = *((TYPE *) data); \ + for (f = 0; f < nf; f++) { \ + cur = one_step_ ## TYPE (filters[f], history, cur); \ + history++; \ + } \ + cur = CLAMP (cur, MIN_VAL, MAX_VAL); \ + *((TYPE *) data) = (TYPE) floor (cur); \ + data += sizeof (TYPE); \ + } \ + } \ +} + +#define CREATE_OPTIMIZED_FUNCTIONS(TYPE) \ +typedef struct { \ + TYPE x1, x2; /* history of input values for a filter */ \ + TYPE y1, y2; /* history of output values for a filter */ \ +} SecondOrderHistory ## TYPE; \ + \ +static inline TYPE \ +one_step_ ## TYPE (GstIirEqualizerBand *filter, \ + SecondOrderHistory ## TYPE *history, TYPE input) \ +{ \ + /* calculate output */ \ + TYPE output = filter->a0 * input + filter->a1 * history->x1 + \ + filter->a2 * history->x2 + filter->b1 * history->y1 + \ + filter->b2 * history->y2; \ + /* update history */ \ + history->y2 = history->y1; \ + history->y1 = output; \ + history->x2 = history->x1; \ + history->x1 = input; \ + \ + return output; \ +} \ + \ +static const guint \ +history_size_ ## TYPE = sizeof (SecondOrderHistory ## TYPE); \ + \ +static void \ +gst_iir_equ_process_ ## TYPE (GstIirEqualizer *equ, guint8 *data, \ +guint size, guint channels) \ +{ \ + guint frames = size / channels / sizeof (TYPE); \ + guint i, c, f, nf = equ->freq_band_count; \ + TYPE cur; \ + GstIirEqualizerBand **filters = equ->bands; \ + \ + for (i = 0; i < frames; i++) { \ + SecondOrderHistory ## TYPE *history = equ->history; \ + for (c = 0; c < channels; c++) { \ + cur = *((TYPE *) data); \ + for (f = 0; f < nf; f++) { \ + cur = one_step_ ## TYPE (filters[f], history, cur); \ + history++; \ + } \ + *((TYPE *) data) = (TYPE) cur; \ + data += sizeof (TYPE); \ + } \ + } \ +} + +CREATE_OPTIMIZED_FUNCTIONS_INT (gint16, gfloat, -32768.0, 32767.0); +CREATE_OPTIMIZED_FUNCTIONS (gfloat); +CREATE_OPTIMIZED_FUNCTIONS (gdouble); + +#ifdef AUDIOEQ_REDUCE_MEMCPY +static GstFlowReturn +gst_audioeq_transform_ip (GstBaseTransform * base, GstBuffer * buf) +{ + GST_DEBUG ("gst_audioeq_transform_ip"); + Gstaudioeq *audioeq = GST_AUDIOEQ(base); + GstIirEqualizer *equ = &audioeq->equ; + + equ->history_size = history_size_gint16; + equ->process = gst_iir_equ_process_gint16; + g_free (equ->history); + equ->history = g_malloc0 (equ->history_size * audioeq->channels * equ->freq_band_count); + GstClockTime timestamp; + + if (G_UNLIKELY (audioeq->channels < 1 || equ->process == NULL)) { + GST_DEBUG ("gst_audioeq_transform_ip return GST_FLOW_NOT_NEGOTIATED;"); + if (G_UNLIKELY (equ->process == NULL)) + GST_DEBUG ("gst_audioeq_transform_ip equ->process "); + if (G_UNLIKELY (audioeq->channels < 1)) + GST_DEBUG ("gst_audioeq_transform_ip audioeq->channels"); + return GST_FLOW_NOT_NEGOTIATED; + } + GST_DEBUG ("gst_audioeq_transform_ip BANDS_LOCK (equ);"); + BANDS_LOCK (equ); + if (equ->need_new_coefficients) { + GST_DEBUG ("gst_audioeq_transform_ip update_coefficients"); + update_coefficients (audioeq); + set_passthrough (audioeq); + } + BANDS_UNLOCK (equ); + + if (gst_base_transform_is_passthrough (base)) { + GST_DEBUG ("gst_audioeq_transform_ip gst_base_transform_is_passthrough return GST_FLOW_OK;"); + return GST_FLOW_OK; + } + timestamp = GST_BUFFER_TIMESTAMP (buf); + timestamp = + gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); + + if (GST_CLOCK_TIME_IS_VALID (timestamp)) + gst_object_sync_values (G_OBJECT (audioeq), timestamp); + GST_DEBUG (" equ->process ++"); + equ->process (equ, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), + audioeq->channels); + GST_DEBUG (" equ->process --"); + GST_DEBUG ("gst_audioeq_transform_ip return GST_FLOW_OK;"); + return GST_FLOW_OK; +} +#endif + +static gboolean +gst_audioeq_set_caps (GstBaseTransform * base, GstCaps * incaps, + GstCaps * outcaps) +{ + GST_DEBUG ("gst_audioeq_set_caps"); + Gstaudioeq *audioeq = GST_AUDIOEQ(base); + GstStructure *ins; + GstPad *pad; + gint samplerate; + gint channels; + gshort old_samplerate; + gshort old_channels; + + pad = gst_element_get_static_pad(GST_ELEMENT(audioeq), "src"); + + /* forward-negotiate */ + if(!gst_pad_set_caps(pad, incaps)) { + gst_object_unref(pad); + return FALSE; + } + + /* negotiation succeeded, so now configure ourselves */ + ins = gst_caps_get_structure(incaps, 0); + + /* get samplerate from caps & convert */ + old_samplerate = audioeq->samplerate; + old_channels = audioeq->channels; + gst_structure_get_int(ins, "rate", &samplerate); + switch (samplerate) { + case 48000: + audioeq->samplerate = SAMPLERATE_48000Hz; + break; + case 44100: + audioeq->samplerate = SAMPLERATE_44100Hz; + break; + case 32000: + audioeq->samplerate = SAMPLERATE_32000Hz; + break; + case 24000: + audioeq->samplerate = SAMPLERATE_24000Hz; + break; + case 22050: + audioeq->samplerate = SAMPLERATE_22050Hz; + break; + case 16000: + audioeq->samplerate = SAMPLERATE_16000Hz; + break; + case 12000: + audioeq->samplerate = SAMPLERATE_12000Hz; + break; + case 11025: + audioeq->samplerate = SAMPLERATE_11025Hz; + break; + case 8000: + audioeq->samplerate = SAMPLERATE_8000Hz; + break; + default: + if (samplerate < 8000) { + audioeq->samplerate = SAMPLERATE_8000Hz; + } else if (samplerate > 48000) { + audioeq->samplerate = SAMPLERATE_48000Hz; + } + break; + } + /* get number of channels from caps */ + gst_structure_get_int(ins, "channels", &channels); + audioeq->channels = (gshort)channels; + + if ((old_samplerate != audioeq->samplerate) + || (old_channels != audioeq->channels)) { + audioeq->need_update_filter = TRUE; + } + + gst_object_unref (pad); + + return TRUE; +} + +static void +gst_audioeq_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GST_DEBUG ("gst_audioeq_set_property"); + Gstaudioeq *audioeq = GST_AUDIOEQ (object); + GstIirEqualizer *equ = &audioeq->equ; + gshort *pointer; + + switch (prop_id) { + + case PROP_FILTER_ACTION: + audioeq->filter_action = g_value_get_uint(value); + BANDS_LOCK(equ); + equ->need_new_coefficients = TRUE; + BANDS_UNLOCK(equ); + break; + + case PROP_CUSTOM_EQ: + pointer = g_value_get_pointer(value); + if (pointer) { + memcpy(audioeq->custom_eq, pointer, sizeof(gint) * CUSTOM_EQ_BAND_MAX); + if (audioeq->filter_action == FILTER_ADVANCED_SETTING) { + BANDS_LOCK(equ); + equ->need_new_coefficients = TRUE; + gst_audioeq_band_set_property(audioeq); + BANDS_UNLOCK(equ); + } + } + break; + + default: + break; + } + GST_DEBUG ("gst_audioeq_set_property need_update_filter %d", audioeq->need_update_filter); +} + +static void +gst_audioeq_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +{ +GST_DEBUG ("gst_audioeq_get_property"); + + Gstaudioeq *audioeq = GST_AUDIOEQ (object); + GstIirEqualizer *equ = &audioeq->equ; + gshort i; + gdouble widtharr[DEFAULT_CUSTOM_EQ_NUM],freqarr[DEFAULT_CUSTOM_EQ_NUM]; + + switch (prop_id) { + case PROP_FILTER_ACTION: + g_value_set_uint(value, audioeq->filter_action); + break; + + case PROP_CUSTOM_EQ: + g_value_set_pointer(value, audioeq->custom_eq); + break; + + case PROP_CUSTOM_EQ_NUM: + g_value_set_uint(value, DEFAULT_CUSTOM_EQ_NUM); + break; + + case PROP_CUSTOM_EQ_FREQ: + for(i=0;ibands[i]->freq; + } + g_value_set_pointer(value, &freqarr); + break; + + case PROP_CUSTOM_EQ_WIDTH: + for(i=0;ibands[i]->width; + } + g_value_set_pointer(value, &widtharr); + break; + + default: + break; + } +} + +static gboolean +gst_iir_equalizer_setup (GstAudioFilter * audio, GstRingBufferSpec * fmt) +{ +GST_DEBUG ("gst_iir_equalizer_setup"); + GstIirEqualizer *equ = GST_IIR_EQUALIZER (audio); + + switch (fmt->type) { + case GST_BUFTYPE_LINEAR: + switch (fmt->width) { + case 16: + equ->history_size = history_size_gint16; + equ->process = gst_iir_equ_process_gint16; + break; + default: + return FALSE; + } + break; + case GST_BUFTYPE_FLOAT: + switch (fmt->width) { + case 32: + equ->history_size = history_size_gfloat; + equ->process = gst_iir_equ_process_gfloat; + break; + case 64: + equ->history_size = history_size_gdouble; + equ->process = gst_iir_equ_process_gdouble; + break; + default: + return FALSE; + } + break; + default: + return FALSE; + } + + alloc_history (equ); + return TRUE; +} + + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG ("audioeq plugin_init "); + GST_DEBUG_CATEGORY_INIT(gst_audioeq_debug, "audioeq", 0, "Audio Equalizer Plugin"); + return gst_element_register(plugin, "audioeq", GST_RANK_NONE, GST_TYPE_AUDIOEQ); +} + + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "audioeq", + "Audio Equalizer Plugin", + plugin_init, + VERSION, + "LGPL", + "gst-plugins-ext", + "https://www.tizen.org/") diff --git a/mobile/audioeq/src/gstaudioeq.h b/mobile/audioeq/src/gstaudioeq.h new file mode 100644 index 0000000..a2c3815 --- /dev/null +++ b/mobile/audioeq/src/gstaudioeq.h @@ -0,0 +1,127 @@ +/* + * audioeq + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Aditi Narula + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifndef __GST_AUDIOEQ_H__ +#define __GST_AUDIOEQ_H__ + +#include +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIOEQ \ + (gst_audioeq_get_type()) +#define GST_AUDIOEQ(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIOEQ,Gstaudioeq)) +#define GST_audioeq_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOEQ,GstaudioeqClass)) +#define GST_IS_AUDIOEQ(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIOEQ)) +#define GST_IS_AUDIOEQ_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOEQ)) +#define GST_TYPE_IIR_EQUALIZER \ + (gst_iir_equalizer_get_type()) +#define GST_IIR_EQUALIZER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IIR_EQUALIZER,GstIirEqualizer)) +#define GST_IIR_EQUALIZER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IIR_EQUALIZER,GstIirEqualizerClass)) +#define GST_IS_IIR_EQUALIZER(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IIR_EQUALIZER)) +#define GST_IS_IIR_EQUALIZER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IIR_EQUALIZER)) + +typedef struct _Gstaudioeq Gstaudioeq; +typedef struct _GstaudioeqClass GstaudioeqClass; +typedef struct _GstIirEqualizer GstIirEqualizer; +typedef struct _GstIirEqualizerClass GstIirEqualizerClass; +typedef struct _GstIirEqualizerBand GstIirEqualizerBand; + +#define CUSTOM_EQ_BAND_MAX 9 + +#define LOWEST_FREQ (20.0) +#define HIGHEST_FREQ (20000.0) + +typedef void (*ProcessFunc) (GstIirEqualizer * eq, guint8 * data, guint size, + guint channels); + +struct _GstIirEqualizer +{ + GstAudioFilter audiofilter; + + /*< private >*/ + + GMutex *bands_lock; + GstIirEqualizerBand **bands; + + /* properties */ + guint freq_band_count; + /* for each band and channel */ + gpointer history; + guint history_size; + + gboolean need_new_coefficients; + + ProcessFunc process; +}; + +struct _GstIirEqualizerClass +{ + GstAudioFilterClass audiofilter_class; +}; + + + +struct _Gstaudioeq +{ + GstBaseTransform element; + + guint samplerate; + guint channels; + + /* properties */ + guint filter_action; + gint custom_eq[CUSTOM_EQ_BAND_MAX]; + gboolean need_update_filter; + GstIirEqualizer equ; +}; + +struct _GstaudioeqClass +{ + GstAudioFilterClass parent_class; +}; + +void gst_iir_equalizer_compute_frequencies (Gstaudioeq * audioeq, guint new_count); + +GType gst_iir_equalizer_get_type(void); + +GType gst_audioeq_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIOEQ_H__ */ + diff --git a/mobile/audiotp/Makefile.am b/mobile/audiotp/Makefile.am new file mode 100755 index 0000000..308a09c --- /dev/null +++ b/mobile/audiotp/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/audiotp/src/Makefile.am b/mobile/audiotp/src/Makefile.am new file mode 100755 index 0000000..436666c --- /dev/null +++ b/mobile/audiotp/src/Makefile.am @@ -0,0 +1,26 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstaudiotp.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstaudiotp_la_SOURCES = gstaudiotp.c + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgstaudiotp_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) +libgstaudiotp_la_LIBADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) +libgstaudiotp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +# headers we need but don't want installed +noinst_HEADERS = gstaudiotp.h \ No newline at end of file diff --git a/mobile/audiotp/src/gstaudiotp.c b/mobile/audiotp/src/gstaudiotp.c new file mode 100644 index 0000000..1bdfe95 --- /dev/null +++ b/mobile/audiotp/src/gstaudiotp.c @@ -0,0 +1,605 @@ +/* + * audiotp + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstaudiotp.h" + +/* Plugin Detaills for gstreamer */ +static const GstElementDetails gst_audiotp_plugin_details = GST_ELEMENT_DETAILS ( + "Audio timestamp reversal plugin", + "Utility/Audio", + "Reverses audio timestamps for reverse playback", + "Samsung Electronics " + ); + +/*** GSTREAMER PROTOTYPES *****************************************************/ + +#define STATIC_CAPS \ +GST_STATIC_CAPS ( \ + "audio/x-raw-float, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, MAX ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 64;" \ + "audio/x-raw-float, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, MAX ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 32;" \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, MAX ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 32, " \ + "depth = (int) [ 1, 32 ], " \ + "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, MAX ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 24, " \ + "depth = (int) [ 1, 24 ], " "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, MAX ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 16, " \ + "depth = (int) [ 1, 16 ], " \ + "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, MAX ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 8, " \ + "depth = (int) [ 1, 8 ], " \ + "signed = (boolean) { true, false } " \ +) + +/* Element sink pad template */ +static GstStaticPadTemplate gst_audiotp_sink_template = GST_STATIC_PAD_TEMPLATE ( + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + STATIC_CAPS); + +/* Element Source Pad template */ +static GstStaticPadTemplate gst_audiotp_src_template = GST_STATIC_PAD_TEMPLATE ( + "src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + STATIC_CAPS); + + +//////////////////////////////////////////////////////// +// Gstreamer Base Prototype // +//////////////////////////////////////////////////////// + +GST_DEBUG_CATEGORY_STATIC(gst_audiotp_debug); +#define GST_CAT_DEFAULT gst_audiotp_debug +#define _do_init(bla) \ + GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "audiotp", 0, "Audio trickplay plugin"); \ + GST_DEBUG("audiotp is registered"); + +GST_BOILERPLATE_FULL(Gstaudiotp, gst_audiotp, GstElement, GST_TYPE_ELEMENT, _do_init); + +static void gst_audiotp_base_init(gpointer klass); +static void gst_audiotp_class_init(GstaudiotpClass *klass); +static void gst_audiotp_init(Gstaudiotp *dec, GstaudiotpClass *klass); +static GstFlowReturn gst_audiotp_chain(GstPad *pad, GstBuffer *buf); +static GstStateChangeReturn gst_audiotp_change_state(GstElement *element, GstStateChange transition); +static void gst_audiotp_finalize(GObject *object); +static gboolean gst_audiotp_sink_event (GstPad *pad, GstEvent *event); +static GstFlowReturn gst_audiotp_push_silent_frame (Gstaudiotp *audiotp, GstBuffer *MetaDataBuf); + + + +//////////////////////////////////////////////////////// +// Gstreamer Base Functions // +//////////////////////////////////////////////////////// + +/** + ** + ** Description: The element details and pad templates are registered with the plugin + ** In Params : @ gclass instance of Element class + ** return : None + ** Comments : 1. Adding templates of source and sink pad to element + ** 2. Setting element class deatils to element + ** + */ +static void +gst_audiotp_base_init(gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS(klass); + + gst_element_class_add_pad_template(element_class, gst_static_pad_template_get(&gst_audiotp_sink_template)); + gst_element_class_add_pad_template(element_class, gst_static_pad_template_get(&gst_audiotp_src_template)); + gst_element_class_set_details(element_class, &gst_audiotp_plugin_details); +} + + +/** + ** + ** Description: Initialization of the Element Class + ** In Param : @ gclass instance of Element class + ** return : None + ** Comments : 1. Overwriting base class virtual functions + ** 2. Installing the properties of the element + ** + */ +static void +gst_audiotp_class_init(GstaudiotpClass *klass) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS(klass); + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + parent_class = g_type_class_peek_parent(klass); + + gobject_class->finalize = gst_audiotp_finalize; + gstelement_class->change_state = GST_DEBUG_FUNCPTR(gst_audiotp_change_state); +} + + +/** + ** + ** Description: Initialization of the Element instance + ** In Params : @ audio tp element instance + ** @ gclass instance of Element class + ** return : None + ** Comments : 1. Creating new source & sink pads using templates + ** 2. Setting the callback functions to the pads + ** 3. Local data initialization. + ** + */ +static void +gst_audiotp_init(Gstaudiotp *audiotp, GstaudiotpClass *klass) +{ + + audiotp->sinkpad = gst_pad_new_from_static_template(&gst_audiotp_sink_template, "sink"); + audiotp->srcpad = gst_pad_new_from_static_template(&gst_audiotp_src_template, "src"); + + gst_pad_set_chain_function (audiotp->sinkpad, GST_DEBUG_FUNCPTR(gst_audiotp_chain)); + gst_pad_set_event_function (audiotp->sinkpad, GST_DEBUG_FUNCPTR(gst_audiotp_sink_event)); + + gst_pad_use_fixed_caps(audiotp->srcpad); + + gst_element_add_pad(GST_ELEMENT(audiotp), audiotp->sinkpad); + gst_element_add_pad(GST_ELEMENT(audiotp), audiotp->srcpad); + + audiotp->reverse = g_queue_new (); + audiotp->head_prev = GST_CLOCK_TIME_NONE; + audiotp->tail_prev = GST_CLOCK_TIME_NONE; + +} + + +/** + ** + ** Description: Finalization of the Element instance (object) + ** In Params : @ audiotp element instance in the form of GObject + ** return : None + ** Comments : 1. Local data Deinitialization. + ** + ** + */ +static void +gst_audiotp_finalize(GObject *object) +{ + Gstaudiotp *audiotp = GST_AUDIOTP(object); + + while (!g_queue_is_empty (audiotp->reverse)) { + GstMiniObject *data = g_queue_pop_head (audiotp->reverse); + gst_mini_object_unref (data); + } + /* freeing dealy queue */ + g_queue_free(audiotp->reverse); + audiotp->reverse = NULL; + + G_OBJECT_CLASS(parent_class)->finalize(object); +} + + +/** + ** + ** Description: Callback function when the element's state gets changed + ** In Params : @ audiotp plugin element + ** @ type of state change + ** return : status of the state change processing + ** Comments : + ** + ** + */ +static GstStateChangeReturn +gst_audiotp_change_state(GstElement *element, GstStateChange transition) +{ + GstStateChangeReturn res = GST_FLOW_ERROR; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + default: + break; + } + + res = parent_class->change_state(element, transition); + if ( res != GST_STATE_CHANGE_SUCCESS ) { + GST_ERROR ("change state error in parent class\n"); + return GST_STATE_CHANGE_FAILURE; + } + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + + return res; +} + + +/** + ** + ** Description: Callback function when sinkpad gets an event + ** In Params : @ Sinkpad on which the event arrives + ** @ event type + ** return : TRUE/FALSE on success/failure of the event processing. + ** Comments : 1. Process the event and push it to the source pad. + ** + ** + */ +static gboolean +gst_audiotp_sink_event (GstPad *pad, GstEvent *event) +{ + Gstaudiotp *audiotp = NULL; + gboolean res = FALSE; + + audiotp = GST_AUDIOTP(GST_PAD_PARENT(pad)); + + switch (GST_EVENT_TYPE(event)) { + /* Arrives whenever there is a jump in the normal playback. Ex:SEEK */ + case GST_EVENT_NEWSEGMENT: { + GstFormat format; + gdouble rate, arate; + gint64 start, stop, time; + gboolean update; + + GST_INFO_OBJECT (audiotp, "GST_EVENT_NEWSEGMENT"); + gst_event_parse_new_segment_full(event, &update, &rate, &arate, &format, &start, &stop, &time); + + if (format != GST_FORMAT_TIME) { + GST_ERROR("Format is not supported\n"); + res = gst_pad_push_event(audiotp->srcpad, event); + goto done; + } + + GST_INFO_OBJECT (audiotp, "update: %d, rate: %0.3f, arate: %0.3f\n", update, rate, arate); + GST_INFO_OBJECT (audiotp, "start : %" GST_TIME_FORMAT, GST_TIME_ARGS(start)); + GST_INFO_OBJECT (audiotp, "stop : %" GST_TIME_FORMAT, GST_TIME_ARGS(stop)); + GST_INFO_OBJECT (audiotp, "time : %" GST_TIME_FORMAT, GST_TIME_ARGS(time)); + + /* If we receive new_segment without FLUSH events, then we will push all the frame in queue */ + while (!g_queue_is_empty (audiotp->reverse)) { + GstBuffer *MetaDataBuf; + GstFlowReturn ret = GST_FLOW_OK; + if(audiotp->is_reversed) + MetaDataBuf = g_queue_pop_head (audiotp->reverse); + else + MetaDataBuf = g_queue_pop_tail (audiotp->reverse); + ret = gst_audiotp_push_silent_frame (audiotp, MetaDataBuf); + if (GST_FLOW_OK != ret) + { + GST_WARNING_OBJECT (audiotp, "pad_push returned = %s", gst_flow_get_name (ret)); + } + } + gst_segment_set_newsegment_full(&audiotp->segment, update, rate, arate, format, start, stop, time); + res = gst_pad_push_event(audiotp->srcpad, event); + break; + } + + /* Indication of the end of the stream */ + case GST_EVENT_EOS: { + /* queue all buffer timestamps till we receive next discontinuity */ + while (!g_queue_is_empty (audiotp->reverse)) { + GstBuffer *MetaDataBuf; + GstFlowReturn ret = GST_FLOW_OK; + if(audiotp->is_reversed) + MetaDataBuf = g_queue_pop_head (audiotp->reverse); + else + MetaDataBuf = g_queue_pop_tail (audiotp->reverse); + ret = gst_audiotp_push_silent_frame (audiotp, MetaDataBuf); + if (GST_FLOW_OK != ret) { + GST_WARNING_OBJECT (audiotp, "pad_push returned = %s", gst_flow_get_name (ret)); + } + } + + res = gst_pad_push_event(audiotp->srcpad, event); + break; + } + + /* Indication of the SEEK operation start */ + case GST_EVENT_FLUSH_START: { + GST_INFO_OBJECT (audiotp, "GST_EVENT_FLUSH_START"); + res = gst_pad_push_event(audiotp->srcpad, event); + break; + } + + /* Indication of the SEEK operation stop */ + case GST_EVENT_FLUSH_STOP: { + GST_INFO_OBJECT (audiotp, "GST_EVENT_FLUSH_STOP"); + /* make sure that we empty the queue */ + while (!g_queue_is_empty (audiotp->reverse)) { + GST_DEBUG_OBJECT (audiotp, "Flushing buffers in reverse queue...."); + gst_buffer_unref(g_queue_pop_head (audiotp->reverse)); + } + + res = gst_pad_push_event(audiotp->srcpad, event); + break; + } + + default: { + res = gst_pad_push_event(audiotp->srcpad, event); + break; + } + } + + done: + return res; +} + + +/** + ** + ** Description: Callback function when sinkpad gets a buffer (from the previous element) + ** In Params : @ Sinkpad on which the buffer arrives + ** @ input buffer + ** return : status of the buffer processing. + ** Comments : 1. Handle the buffer discontinuity ( in terms of tmestamp) + ** 2. Push or pop buffer based on discontinuity. + ** + ** + */ +static GstFlowReturn +gst_audiotp_chain(GstPad *pad, GstBuffer *buf) +{ + Gstaudiotp *audiotp = GST_AUDIOTP(GST_PAD_PARENT(pad)); + GstFlowReturn ret = GST_FLOW_OK; + + if(buf == NULL) { + ret = GST_FLOW_ERROR; + goto error_exit; + } + + GST_LOG_OBJECT (audiotp, "Input buffer : ts =%" GST_TIME_FORMAT ", dur=%" GST_TIME_FORMAT ", size=%d", + GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buf)), + GST_TIME_ARGS(GST_BUFFER_DURATION(buf)), + GST_BUFFER_SIZE(buf), GST_BUFFER_IS_DISCONT (buf) ? " - discont" :""); + + if (audiotp->segment.rate < 0.0) { + goto send_reverse; + } + + + /* Push the input data to the next element */ + ret = gst_pad_push(audiotp->srcpad, buf); + if (ret != GST_FLOW_OK ) { + GST_WARNING("failed to push buffer %p. reason: %s", buf, gst_flow_get_name (ret)); + buf = NULL; + goto error_exit; + } + return ret; + +send_reverse: + { + GstBuffer *MetaDataBuf = NULL; + GstClockTime headbuf_ts = GST_CLOCK_TIME_NONE; + GstClockTime tailbuf_ts = GST_CLOCK_TIME_NONE; + + /* Discont buffers is mostly due to seek, when buffers of seeked timestamp gets pushed */ + if (GST_BUFFER_IS_DISCONT(buf)) { + if(!g_queue_is_empty (audiotp->reverse)) { + GstBuffer *headbuf = (GstBuffer*) (audiotp->reverse->head->data); + GstBuffer *tailbuf = (GstBuffer*) (audiotp->reverse->tail->data); + + headbuf_ts = GST_BUFFER_TIMESTAMP(headbuf); + tailbuf_ts = GST_BUFFER_TIMESTAMP(tailbuf); + + GST_DEBUG_OBJECT(audiotp,"Headbuf ts =%" GST_TIME_FORMAT ", TailBuf ts =%" GST_TIME_FORMAT "", + GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(headbuf)), + GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(tailbuf))); + + /* Check if the decoder is already having the reversal logic */ + if(GST_BUFFER_TIMESTAMP(headbuf) > GST_BUFFER_TIMESTAMP(tailbuf)) { + GST_INFO_OBJECT (audiotp, "Buffers arrived in reverse order, audiotp NO NEED to reverse..."); + audiotp->is_reversed = TRUE; + } else { + GST_INFO_OBJECT (audiotp, "Buffers arrived in forward order, audiotp NEED to reverse..."); + audiotp->is_reversed = FALSE; + } + } + + while (!g_queue_is_empty (audiotp->reverse)) { + + if(audiotp->is_reversed) + MetaDataBuf = g_queue_pop_head (audiotp->reverse); + else + MetaDataBuf = g_queue_pop_tail (audiotp->reverse); + + if (NULL == MetaDataBuf) { + GST_ERROR_OBJECT (audiotp, "NULL pointer..."); + ret = GST_FLOW_ERROR; + goto error_exit; + } + + /* If buffers arrive in forward order, compare the MetaDatabuf with + * previous head buffer timestamp. + * If buffers arrive in reverse order, compare the MetaDataBuf with + * previous tail buffer timestamp */ + if((GST_BUFFER_TIMESTAMP(MetaDataBuf) < audiotp->head_prev && !audiotp->is_reversed) + || (GST_BUFFER_TIMESTAMP(MetaDataBuf) < audiotp->tail_prev && audiotp->is_reversed)) { + ret = gst_audiotp_push_silent_frame (audiotp, MetaDataBuf); + if (MetaDataBuf) { + gst_buffer_unref (MetaDataBuf); + MetaDataBuf = NULL; + } + + if (GST_FLOW_OK != ret) { + GST_WARNING_OBJECT (audiotp, "pad_push returned = %s", gst_flow_get_name (ret)); + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + return ret; + } + } else { + GST_DEBUG_OBJECT(audiotp, "Dropping the buffer out of segment with time-stamp %"GST_TIME_FORMAT, + GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(MetaDataBuf))); + if (MetaDataBuf) { + gst_buffer_unref (MetaDataBuf); + MetaDataBuf = NULL; + } + } + } + + audiotp->head_prev = headbuf_ts; + audiotp->tail_prev = tailbuf_ts; + } + + MetaDataBuf = gst_buffer_new (); + if (NULL == MetaDataBuf) { + GST_ERROR_OBJECT (audiotp, "Failed to create memory..."); + ret = GST_FLOW_ERROR; + goto error_exit; + } + + /* copy buffer timestamps & FLAGS to metadata buffer */ + gst_buffer_copy_metadata (MetaDataBuf, buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_CAPS); + GST_BUFFER_SIZE(MetaDataBuf) = GST_BUFFER_SIZE(buf); + GST_DEBUG_OBJECT (audiotp, "Pushing into reverse queue data of size: %d", GST_BUFFER_SIZE(MetaDataBuf)); + + /* queue all buffer timestamps till we receive next discontinuity */ + g_queue_push_tail (audiotp->reverse, MetaDataBuf); + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + return GST_FLOW_OK; + } + +#if 0 +/* May be useful in future */ +send_dummy: + { + + /* Resetting the buffer data to zero */ + memset(GST_BUFFER_DATA(buf), 0, GST_BUFFER_SIZE(buf)); + gst_buffer_set_caps(buf, GST_PAD_CAPS(audiotp->srcpad)); + + ret = gst_pad_push(audiotp->srcpad, buf); + if (ret != GST_FLOW_OK) { + GST_ERROR("Failed to push buffer. reason: %s\n", gst_flow_get_name(ret)); + buf = NULL; + goto error_exit; + } + return GST_FLOW_OK; + } +#endif + +error_exit: + + GST_WARNING_OBJECT(audiotp, "Returning from audiotp's chain with reason - %s", gst_flow_get_name (ret)); + if (buf) { + gst_buffer_unref (buf); + buf = NULL; + } + return ret; +} + + +static GstFlowReturn +gst_audiotp_push_silent_frame (Gstaudiotp *audiotp, GstBuffer *MetaDataBuf) +{ + + GstBuffer *out = NULL; + GstFlowReturn ret = GST_FLOW_OK; + + out = gst_buffer_new_and_alloc(GST_BUFFER_SIZE(MetaDataBuf)); + if(out == NULL) { + GST_ERROR_OBJECT (audiotp, "Failed to allocate memory..."); + return GST_FLOW_ERROR; + } + + /* Memset the data of the out buffer so that silent frame is sent */ + memset(GST_BUFFER_DATA(out), 0, GST_BUFFER_SIZE(out)); + + gst_buffer_copy_metadata (out, MetaDataBuf, GST_BUFFER_COPY_FLAGS); + GST_BUFFER_OFFSET (out) = GST_BUFFER_OFFSET_END (out) = 0; + GST_BUFFER_SIZE(out) = GST_BUFFER_SIZE(MetaDataBuf); + GST_BUFFER_TIMESTAMP(out) = GST_BUFFER_TIMESTAMP(MetaDataBuf); + GST_BUFFER_DURATION(out) = GST_BUFFER_DURATION(MetaDataBuf); + + GST_LOG_OBJECT(audiotp, "Out buffer ts =%" GST_TIME_FORMAT ", dur=%" GST_TIME_FORMAT ", size=%d", + GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(out)), + GST_TIME_ARGS(GST_BUFFER_DURATION(out)), + GST_BUFFER_SIZE(out)); + + gst_buffer_set_caps(out, GST_PAD_CAPS(audiotp->srcpad)); + + ret = gst_pad_push(audiotp->srcpad, out); + if (ret != GST_FLOW_OK) { + GST_ERROR_OBJECT (audiotp, "Failed to push buffer. reason: %s\n", gst_flow_get_name(ret)); + out = NULL; + } + + return ret; +} + +static gboolean +gst_audiotp_plugin_init (GstPlugin *plugin) +{ + if (!gst_element_register (plugin, "audiotp", GST_RANK_PRIMARY, gst_audiotp_get_type())) { + return FALSE; + } + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "audiotp", + "Audio trickplay plugin", + gst_audiotp_plugin_init, + VERSION, + "LGPL", + "Samsung Electronics Co", + "http://www.samsung.com") diff --git a/mobile/audiotp/src/gstaudiotp.h b/mobile/audiotp/src/gstaudiotp.h new file mode 100755 index 0000000..0b3dc92 --- /dev/null +++ b/mobile/audiotp/src/gstaudiotp.h @@ -0,0 +1,69 @@ +/* + * audiotp + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_AUDIOTP_H__ +#define __GST_AUDIOTP_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AUDIOTP (gst_audiotp_get_type()) +#define GST_AUDIOTP(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIOTP,Gstaudiotp)) +#define GST_AUDIOTP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOTP,GstaudiotpClass)) +#define GST_AUDIOTP_GET_CLASS(klass) (G_TYPE_INSTANCE_GET_CLASS((klass),GST_TYPE_AUDIOTP,GstaudiotpClass)) +#define GST_IS_AUDIOTP(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIOTP)) +#define GST_IS_AUDIOTP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOTP)) +#define GST_AUDIOTP_CAST(obj) ((Gstaudiotp *)(obj)) + +typedef struct _Gstaudiotp Gstaudiotp; +typedef struct _GstaudiotpClass GstaudiotpClass; + +struct _Gstaudiotp +{ + GstElement element; + GstPad *sinkpad; + GstPad *srcpad; + GQueue *reverse; /* used in reverse trickplay */ + GstSegment segment; + + /* Flag to indicate the new buffer recieved is discountinued in + its time-stamp */ + gboolean discont; + gboolean is_reversed; + GstClockTime head_prev; + GstClockTime tail_prev; +}; + +struct _GstaudiotpClass +{ + GstElementClass parent_class; +}; + +GType gst_audiotp_get_type (void); + +G_END_DECLS + +#endif /* __GST_AUDIOTP_H__ */ \ No newline at end of file diff --git a/mobile/autogen.sh b/mobile/autogen.sh new file mode 100755 index 0000000..d4c6d40 --- /dev/null +++ b/mobile/autogen.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# you can either set the environment variables AUTOCONF and AUTOMAKE +# to the right versions, or leave them unset and get the RedHat 7.3 defaults + +aclocal -I m4 -I common/m4 +libtoolize --copy --force +autoheader +autoconf +automake --add-missing --copy --foreign + +echo "Now type 'make' to compile $package." + diff --git a/mobile/autoregen.sh b/mobile/autoregen.sh new file mode 100755 index 0000000..c67a299 --- /dev/null +++ b/mobile/autoregen.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./autogen.sh $@ diff --git a/mobile/avsystem/Makefile.am b/mobile/avsystem/Makefile.am new file mode 100644 index 0000000..af437a6 --- /dev/null +++ b/mobile/avsystem/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/avsystem/src/Makefile.am b/mobile/avsystem/src/Makefile.am new file mode 100644 index 0000000..dd1576e --- /dev/null +++ b/mobile/avsystem/src/Makefile.am @@ -0,0 +1,60 @@ + +# plugindir is set in configure + +plugin_LTLIBRARIES = libgstavsysaudiosrc.la + +# sources used to compile this plug-in +libgstavsysaudiosrc_la_SOURCES = gstavsyssrc.c \ + gstavsysaudiosrc.c + +libgstavsysaudiosrc_la_CFLAGS = $(GST_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(AVSYSTEM_CFLAGS) \ + $(GST_VIDEO_FLAGS) \ + -I$(includedir)/mmf \ + $(MMTA_CFLAGS) \ + $(GST_AUDIO_CFLAGS) \ + $(VCONF_CFLAGS) \ + $(AVSYSAUDIO_CFLAGS) + +libgstavsysaudiosrc_la_LIBADD = $(GST_LIBS) \ + $(GST_BASE_LIBS) \ + $(DATACOMLIB_LIBS) \ + $(HTTPLIB_LIBS) \ + $(AVSYSTEM_LIBS) \ + $(GST_VIDEO_LIBS) \ + -lgstaudio-0.10 \ + $(MMTA_LIBS) \ + $(GST_AUDIO_LIBS) \ + -ldl \ + $(VCONF_LIBS) \ + $(AVSYSAUDIO_LIBS) + +libgstavsysaudiosrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +if IS_I386 +libgstavsysaudiosrc_la_CFLAGS += -DI386_SIMULATOR +else +endif + +plugin_LTLIBRARIES += libgstavsyssink.la + +## sources used to compile this plug-in +libgstavsyssink_la_SOURCES = gstavsyssink.c \ + gstavsysmemsink.c + +libgstavsyssink_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(AVSYSVIDEO_CFLAGS) $(AVSYSTEM_CFLAGS) -I$(includedir)/mmf +libgstavsyssink_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(DATACOMLIB_LIBS) $(HTTPLIB_LIBS) $(AVSYSVIDEO_LIBS) $(AVSYSTEM_LIBS) $(GST_VIDEO_LIBS) -lgstaudio-0.10 -ldl +libgstavsyssink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + + +libgstavsyssink_la_SOURCES += gstavsysaudiosink.c +libgstavsyssink_la_CFLAGS += $(AVSYSAUDIO_CFLAGS) +libgstavsyssink_la_LIBADD += $(AVSYSAUDIO_LIBS) + +if IS_I386 +libgstavsyssink_la_CFLAGS += -DI386_SIMULATOR +else +endif + + diff --git a/mobile/avsystem/src/gstavsysaudiosink.c b/mobile/avsystem/src/gstavsysaudiosink.c new file mode 100644 index 0000000..b6e5c94 --- /dev/null +++ b/mobile/avsystem/src/gstavsysaudiosink.c @@ -0,0 +1,905 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + + +#include +#include + +#include + +#include "gstavsysaudiosink.h" + +#define _ALSA_DAPM_ +#define __REPLACE_RESET_WITH_CLOSE_AND_REOPEN__ + +#define CONVERT_MUTE_VALUE(_mute) ((_mute) ? AVSYS_AUDIO_MUTE : AVSYS_AUDIO_UNMUTE) + +GST_DEBUG_CATEGORY_EXTERN (avsystem_sink_debug); +#define GST_CAT_DEFAULT avsystem_sink_debug + +#define DEFAULT_USER_ROUTE AVSYSAUDIOSINK_USERROUTE_AUTO +#define DEFAULT_AUDIO_ROUTE AVSYSAUDIOSINK_AUDIOROUTE_USE_EXTERNAL_SETTING +#define DEFAULT_VOLUME_TYPE AVSYS_AUDIO_VOLUME_TYPE_MEDIA +#define DEFAULT_MEDIACALL_MODE AVSYS_AUDIO_ECHO_MODE_NONE +#define DEFAULT_FADEUP_VOLUME FALSE +#define DEFAULT_AUDIO_MUTE AVSYSAUDIOSINK_AUDIO_UNMUTE +#define DEFAULT_AUDIO_LATENCY AVSYSAUDIOSINK_LATENCY_MID +#define DEFAULT_AUDIO_CLOSE_HANDLE_ON_PREPARE FALSE + +//GST_DEBUG_CATEGORY_STATIC (gst_avsystemsink_debug); + +/* element factory information */ +static const GstElementDetails gst_avsysaudiosink_details = + GST_ELEMENT_DETAILS ("AV-system Audio OUT", + "Sink/Audio", + "Output to AV System", + "Samsung Electronics co., ltd"); + +enum +{ + PROP_0, + PROP_AUDIO_MUTE, + PROP_AUDIO_VOLUME_TYPE, + PROP_AUDIO_PRIORITY, + PROP_AUDIO_FADEUPVOLUME, + PROP_AUDIO_ROUTE_POLICY, + PROP_AUDIO_USER_ROUTE, + PROP_AUDIO_LATENCY, + PROP_AUDIO_HANDLE, + PROP_AUDIO_CALLBACK, + PROP_AUDIO_CLOSE_HANDLE_ON_PREPARE, +}; + +GType +gst_avsysaudiosink_audio_mute_get_type (void) +{ + static GType avaudio_mute_type = 0; + static const GEnumValue avaudio_mute[] = { + {AVSYSAUDIOSINK_AUDIO_UNMUTE, "Unmute", "unmute"}, + {AVSYSAUDIOSINK_AUDIO_MUTE, "Mute immediately", "mute"}, + {AVSYSAUDIOSINK_AUDIO_MUTE_WITH_FADEDOWN_EFFECT, "Mute with fadedown effect", "fadedown"}, + {0, NULL, NULL}, + }; + + if (!avaudio_mute_type) { + avaudio_mute_type = + g_enum_register_static ("GstAvsysAudioSinkAudioMute", avaudio_mute); + } + return avaudio_mute_type; +} + +GType +gst_avsysaudiosink_user_route_get_type (void) +{ + static GType user_route_type = 0; + static const GEnumValue user_route[] = { + {AVSYSAUDIOSINK_USERROUTE_AUTO, "Route automatically", "auto"}, + {AVSYSAUDIOSINK_USERROUTE_PHONE, "Route to phone only", "phone"}, + {0, NULL, NULL}, + }; + + if (!user_route_type) { + user_route_type = + g_enum_register_static ("GstAvsysAudioSinkUserRoutePolicy",user_route); + } + return user_route_type; +} + +GType +gst_avsysaudiosink_audio_route_get_type (void) +{ + static GType playback_audio_route_type = 0; + static const GEnumValue playback_audio_route[] = { + {AVSYSAUDIOSINK_AUDIOROUTE_USE_EXTERNAL_SETTING, "Use external sound path", "external"}, + {AVSYSAUDIOSINK_AUDIOROUTE_PLAYBACK_NORMAL, "Auto change between speaker & earphone", "normal"}, + {AVSYSAUDIOSINK_AUDIOROUTE_PLAYBACK_ALERT, "Play via both speaker & earphone", "alert"}, + {AVSYSAUDIOSINK_AUDIOROUTE_PLAYBACK_HEADSET_ONLY, "Play via earphone only", "headset"}, + {0, NULL, NULL}, + }; + + if (!playback_audio_route_type) { + playback_audio_route_type = + g_enum_register_static ("GstAvsysAudioSinkAudioRoutePolicy", playback_audio_route); + } + return playback_audio_route_type; +} + +GType +gst_avsysaudiosink_latency_get_type (void) +{ + static GType avsysaudio_latency_type = 0; + static const GEnumValue avsysaudio_latency[] = { + {AVSYSAUDIOSINK_LATENCY_LOW, "Low latency", "low"}, + {AVSYSAUDIOSINK_LATENCY_MID, "Mid latency", "mid"}, + {AVSYSAUDIOSINK_LATENCY_HIGH, "High latency", "high"}, + {0, NULL, NULL}, + }; + + if (!avsysaudio_latency_type) { + avsysaudio_latency_type = + g_enum_register_static ("GstAvsysAudioSinkLatency", avsysaudio_latency); + } + return avsysaudio_latency_type; +} + +static void gst_avsysaudiosink_init_interfaces (GType type); + +//#define GST_BOILERPLATE_FULL(type, type_as_function, parent_type, parent_type_macro, additional_initializations) + +GST_BOILERPLATE_FULL (GstAvsysAudioSink, gst_avsysaudiosink, GstAudioSink, + GST_TYPE_AUDIO_SINK, gst_avsysaudiosink_init_interfaces); + + +static void gst_avsysaudiosink_finalise (GObject * object); +static void gst_avsysaudiosink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_avsysaudiosink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +#if 0 /*not use*/ +static GstCaps *gst_avsysaudiosink_getcaps (GstBaseSink * bsink); +#endif + +static gboolean gst_avsysaudiosink_avsys_close(GstAvsysAudioSink *avsys_audio); +static gboolean gst_avsysaudiosink_avsys_open(GstAvsysAudioSink *avsys_audio); + +static gboolean gst_avsysaudiosink_open (GstAudioSink * asink); +static gboolean gst_avsysaudiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec); +static gboolean gst_avsysaudiosink_unprepare (GstAudioSink * asink); +static gboolean gst_avsysaudiosink_close (GstAudioSink * asink); +static guint gst_avsysaudiosink_write (GstAudioSink * asink, gpointer data, guint length); +static guint gst_avsysaudiosink_delay (GstAudioSink * asink); +static void gst_avsysaudiosink_reset (GstAudioSink * asink); +static gboolean avsysaudiosink_post_message(GstAvsysAudioSink* self,int errorcode); + + +#define AVSYS_AUDIO_FACTORY_ENDIANNESS "LITTLE_ENDIAN" + + +static GstStaticPadTemplate avsysaudiosink_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) { " AVSYS_AUDIO_FACTORY_ENDIANNESS " }, " + "signed = (boolean) { TRUE }, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) 44100, " + "channels = (int) [ 1, 6 ]; " + "audio/x-raw-int, " + "signed = (boolean) { FALSE }, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) 44100, " + "channels = (int) [ 1, 6 ] " + ) + ); +/* +static inline guint _time_to_sample(GstAvsysAudioSink * asink, GstClockTime diff) +{ + guint result = 0; + result =(GST_TIME_AS_USECONDS(diff) * asink->audio_param.samplerate)/1000000; + return result; +} +*/ + +static void +gst_avsysaudiosink_finalise (GObject * object) +{ + GstAvsysAudioSink *sink = NULL; + + sink = GST_AVSYS_AUDIO_SINK (object); + gst_avsysaudiosink_avsys_close(sink); + g_mutex_free (sink->avsys_audio_lock); + g_mutex_free (sink->avsys_audio_reset_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_avsysaudiosink_init_interfaces (GType type) +{ + /* None */ +} + +static void +gst_avsysaudiosink_base_init (gpointer g_class) +{ + GstElementClass *element_class = NULL; + + element_class = GST_ELEMENT_CLASS (g_class); + gst_element_class_set_details (element_class, &gst_avsysaudiosink_details); + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&avsysaudiosink_sink_factory)); +} + +static GstStateChangeReturn +gst_avsyssudiosink_change_state (GstElement *element, GstStateChange transition); + + +static void +gst_avsysaudiosink_class_init (GstAvsysAudioSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + GstBaseAudioSinkClass *gstbaseaudiosink_class; + GstAudioSinkClass *gstaudiosink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; + gstaudiosink_class = (GstAudioSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + gstelement_class->change_state = GST_DEBUG_FUNCPTR(gst_avsyssudiosink_change_state); + + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_finalise); + gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_get_property); + gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_set_property); + + // gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_getcaps); + + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_open); + gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_prepare); + gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_unprepare); + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_close); + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_write); + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_delay); + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_avsysaudiosink_reset); + + g_object_class_install_property ( gobject_class, PROP_AUDIO_VOLUME_TYPE, + g_param_spec_int ("volumetype", "Avsystem Volume Type", + "Select avsystem audio software volume type", 0, G_MAXINT, + DEFAULT_VOLUME_TYPE, G_PARAM_READWRITE)); + + g_object_class_install_property ( gobject_class, PROP_AUDIO_PRIORITY, + g_param_spec_int ("priority", "Avsystem Sound Priority", "Avsystem sound priority", + AVSYS_AUDIO_PRIORITY_NORMAL, AVSYS_AUDIO_PRIORITY_SOLO_WITH_TRANSITION_EFFECT, + AVSYS_AUDIO_PRIORITY_NORMAL, G_PARAM_READWRITE)); + + g_object_class_install_property ( gobject_class, PROP_AUDIO_HANDLE, + g_param_spec_pointer("audio-handle", "Avsystem handle", + "Avsystem audio handle", + G_PARAM_READWRITE)); + + g_object_class_install_property ( gobject_class, PROP_AUDIO_CALLBACK, + g_param_spec_pointer("audio-callback", "Avsystem callback", + "Avsystem audio callback", + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_AUDIO_FADEUPVOLUME, + g_param_spec_boolean ("fadeup", "Avsystem fadeup volume", + "Enable avsystem audio fadeup volume when pause to play", + DEFAULT_FADEUP_VOLUME, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class ,PROP_AUDIO_MUTE, + g_param_spec_enum("mute", "Avsystem mute", + "Avsystem audio mute", + GST_AVSYS_AUDIO_SINK_MUTE, DEFAULT_AUDIO_MUTE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS )); + + g_object_class_install_property (gobject_class ,PROP_AUDIO_ROUTE_POLICY, + g_param_spec_enum("audio-route", "Audio Route Policy", + "Audio route policy of system", + GST_AVSYS_AUDIO_SINK_AUDIO_ROUTE, DEFAULT_AUDIO_ROUTE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS )); + + g_object_class_install_property (gobject_class ,PROP_AUDIO_USER_ROUTE, + g_param_spec_enum("user-route", "User Route Policy", + "User route policy", + GST_AVSYS_AUDIO_SINK_USER_ROUTE, DEFAULT_USER_ROUTE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS )); + + g_object_class_install_property (gobject_class ,PROP_AUDIO_LATENCY, + g_param_spec_enum("latency", "Audio Backend Latency", + "Audio backend latency", + GST_AVSYS_AUDIO_SINK_LATENCY_TYPE, DEFAULT_AUDIO_LATENCY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS )); + + g_object_class_install_property (gobject_class, PROP_AUDIO_CLOSE_HANDLE_ON_PREPARE, + g_param_spec_boolean ("close-handle-on-prepare", "Close Handle on Prepare", + "Close Handle on Prepare", + DEFAULT_AUDIO_CLOSE_HANDLE_ON_PREPARE, G_PARAM_READWRITE)); +} + +static void +gst_avsysaudiosink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstAvsysAudioSink *sink = NULL; + int nvalue = 0; + gboolean nbool = FALSE; + + sink = GST_AVSYS_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_AUDIO_HANDLE: + sink->cbHandle = g_value_get_pointer(value); + break; + case PROP_AUDIO_CALLBACK: + sink->audio_stream_cb = g_value_get_pointer(value); + break; + case PROP_AUDIO_VOLUME_TYPE: + nvalue = g_value_get_int(value); + sink->volume_type = nvalue; + if (sink->audio_handle != (avsys_handle_t)-1) { + avsys_audio_update_volume_config(sink->audio_handle, sink->volume_type); + } + break; + case PROP_AUDIO_PRIORITY: + nvalue = g_value_get_int(value); + sink->sound_priority = nvalue; + break; + case PROP_AUDIO_MUTE: + nvalue = g_value_get_enum(value); + if (sink->audio_handle != (avsys_handle_t)-1) { + if(AVSYS_SUCCESS(avsys_audio_set_mute_fadedown(sink->audio_handle))) + sink->mute = nvalue; + } else { + sink->mute = nvalue; + } + break; + case PROP_AUDIO_FADEUPVOLUME: + nbool = g_value_get_boolean(value); + sink->use_fadeup_volume = nbool; + break; + case PROP_AUDIO_ROUTE_POLICY: + nvalue = g_value_get_enum(value); + sink->audio_route_policy = nvalue; + switch (sink->audio_route_policy) { + case AVSYSAUDIOSINK_AUDIOROUTE_USE_EXTERNAL_SETTING: + GST_INFO_OBJECT(sink, "use external audio route setting"); + break; + default: + g_print("AVSYSAUDIOSINK :: Unknown audio route option %d\n", sink->audio_route_policy); + GST_ERROR_OBJECT(sink, "Unknown audio route option %d", sink->audio_route_policy); + break; + } + break; + case PROP_AUDIO_USER_ROUTE: + nvalue = g_value_get_enum(value); + sink->user_route_policy = nvalue; + break; + case PROP_AUDIO_LATENCY: + nvalue = g_value_get_enum(value); + sink->latency = nvalue; + break; + case PROP_AUDIO_CLOSE_HANDLE_ON_PREPARE: + nbool = g_value_get_boolean(value); + sink->close_handle_on_prepare = nbool; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_avsysaudiosink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstAvsysAudioSink *sink = NULL; + + sink = GST_AVSYS_AUDIO_SINK (object); + + switch (prop_id) { + case PROP_AUDIO_VOLUME_TYPE: + g_value_set_int(value, sink->volume_type); + break; + case PROP_AUDIO_PRIORITY: + g_value_set_int(value, sink->sound_priority); + break; + case PROP_AUDIO_MUTE: + g_value_set_enum(value, sink->mute); + break; + case PROP_AUDIO_FADEUPVOLUME: + g_value_set_boolean(value, sink->use_fadeup_volume); + break; + case PROP_AUDIO_ROUTE_POLICY: + g_value_set_enum(value, sink->audio_route_policy); + break; + case PROP_AUDIO_USER_ROUTE: + g_value_set_enum(value, sink->user_route_policy); + break; + case PROP_AUDIO_LATENCY: + g_value_set_enum(value, sink->latency); + break; + case PROP_AUDIO_CLOSE_HANDLE_ON_PREPARE: + g_value_set_boolean(value, sink->close_handle_on_prepare); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_avsysaudiosink_init (GstAvsysAudioSink * avsysaudiosink, GstAvsysAudioSinkClass * g_class) +{ + GST_DEBUG_OBJECT (avsysaudiosink, "initializing avsysaudiosink"); + + avsysaudiosink->audio_handle = (avsys_handle_t)-1; + avsysaudiosink->cached_caps = NULL; + avsysaudiosink->avsys_audio_lock = g_mutex_new (); + avsysaudiosink->avsys_audio_reset_lock = g_mutex_new (); + avsysaudiosink->volume_type = DEFAULT_VOLUME_TYPE; + avsysaudiosink->sound_priority = AVSYS_AUDIO_PRIORITY_NORMAL; + avsysaudiosink->mute = DEFAULT_AUDIO_MUTE; + avsysaudiosink->use_fadeup_volume = DEFAULT_FADEUP_VOLUME; + avsysaudiosink->latency = DEFAULT_AUDIO_LATENCY; + avsysaudiosink->audio_route_policy = DEFAULT_AUDIO_ROUTE; + avsysaudiosink->bytes_per_sample = 1; + avsysaudiosink->close_handle_on_prepare = DEFAULT_AUDIO_CLOSE_HANDLE_ON_PREPARE; +#if defined (LPCM_DUMP_SUPPORT) + avsysaudiosink->dumpFp = NULL; +#endif + +} +#if 0 +static GstCaps * +gst_avsysaudiosink_getcaps (GstBaseSink * bsink) +{ + GstElementClass *element_class = NULL; + GstPadTemplate *pad_template = NULL; + GstAvsysAudioSink *sink = GST_AVSYS_AUDIO_SINK (bsink); + GstCaps *caps; + +// debug_fenter(); + + sink = GST_AVSYS_AUDIO_SINK (bsink); + if (sink->audio_handle == -1) + { + GST_DEBUG_OBJECT (sink, "avsystem audio not open, using template caps"); + return NULL; /* base class will get template caps for us */ + } + + if (sink->cached_caps) + { + GST_LOG_OBJECT (sink, "Returning cached caps"); + return gst_caps_ref (sink->cached_caps); + } + + element_class = GST_ELEMENT_GET_CLASS (sink); + pad_template = gst_element_class_get_pad_template (element_class, "sink"); + g_return_val_if_fail (pad_template != NULL, NULL); + + // todo : get supported format. + //caps = gst_avsysaudio_probe_supported_formats (GST_OBJECT (sink), sink->, + //gst_pad_template_get_caps (pad_template)); + + //if (caps) { + //sink->cached_caps = gst_caps_ref (caps); + //} + + GST_INFO_OBJECT (sink, "returning caps %" GST_PTR_FORMAT, caps); + + return caps; +} +#endif + +static gboolean +avsysaudiosink_parse_spec (GstAvsysAudioSink * avsys_audio, GstRingBufferSpec * spec) +{ + /* Check param */ + if (spec->type != GST_BUFTYPE_LINEAR || + spec->channels > 6 || spec->channels < 1 || + !(spec->format == GST_S8 || spec->format == GST_S16_LE) ) + return FALSE; + + switch (spec->format) { + case GST_S8: + avsys_audio->audio_param.format = AVSYS_AUDIO_FORMAT_8BIT; + avsys_audio->bytes_per_sample = 1; + break; + case GST_S16_LE: + avsys_audio->audio_param.format = AVSYS_AUDIO_FORMAT_16BIT; + avsys_audio->bytes_per_sample = 2; + break; + default: + return FALSE; + } + + /// set audio parameter for avsys audio open + switch (avsys_audio->latency) { + case AVSYSAUDIOSINK_LATENCY_LOW: + avsys_audio->audio_param.mode = AVSYS_AUDIO_MODE_OUTPUT_LOW_LATENCY; + break; + case AVSYSAUDIOSINK_LATENCY_MID: + avsys_audio->audio_param.mode = AVSYS_AUDIO_MODE_OUTPUT; + break; + case AVSYSAUDIOSINK_LATENCY_HIGH: + avsys_audio->audio_param.mode = AVSYS_AUDIO_MODE_OUTPUT_CLOCK; + break; + } + + avsys_audio->audio_param.priority = 0; + avsys_audio->audio_param.samplerate = spec->rate; + avsys_audio->audio_param.channels = spec->channels; + avsys_audio->bytes_per_sample *= spec->channels; + + /* set software volume table type */ + avsys_audio->audio_param.vol_type = avsys_audio->volume_type; + avsys_audio->audio_param.priority = avsys_audio->sound_priority; + avsys_audio->audio_param.handle_route = avsys_audio->user_route_policy; + + return TRUE; +} + +static gboolean +gst_avsysaudiosink_open (GstAudioSink * asink) +{ + return TRUE; +} + +static gboolean +gst_avsysaudiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) +{ + GstAvsysAudioSink *avsys_audio = NULL; + guint p_time = 0, b_time = 0; + + avsys_audio = GST_AVSYS_AUDIO_SINK (asink); + + GST_WARNING("Start"); + + // set avsys audio param + if (!avsysaudiosink_parse_spec (avsys_audio, spec)) + goto spec_parse; + + if (gst_avsysaudiosink_avsys_open(avsys_audio) == FALSE) { + GST_ERROR_OBJECT(avsys_audio, "gst_avsysaudiosink_avsys_open() failed"); + goto OPEN_FAILED; + } + + /* Ring buffer size */ + if (AVSYS_STATE_SUCCESS == + avsys_audio_get_period_buffer_time(avsys_audio->audio_handle, &p_time, &b_time)) { + if(p_time == 0 || b_time == 0) + return FALSE; + + spec->latency_time = (guint64)p_time; + spec->buffer_time = (guint64)b_time; + } else { + GST_WARNING_OBJECT(avsys_audio, ""); + return FALSE; + } + spec->segsize = avsys_audio->avsys_size; /* '/16' see avsys_audio_open */ + spec->segtotal = (b_time / p_time) + (((b_time % p_time)/p_time > 0.5) ? 1: 0); + //spec->segtotal+2; + + if (avsys_audio->close_handle_on_prepare) { + if (gst_avsysaudiosink_avsys_close(avsys_audio) == FALSE) { + GST_ERROR_OBJECT(avsys_audio, "gst_avsysaudiosink_avsys_close() failed"); + return FALSE; + } + } + + GST_WARNING("End"); + GST_WARNING_OBJECT (avsys_audio, "latency time %u, buffer time %u, seg total %u\n", + (unsigned int)(spec->latency_time/1000), (unsigned int)(spec->buffer_time/1000), spec->segtotal); + return TRUE; + +spec_parse: + { + GST_ELEMENT_ERROR (avsys_audio, RESOURCE, SETTINGS, (NULL), + ("Setting of swparams failed: " )); + return FALSE; + } + +OPEN_FAILED: + avsysaudiosink_post_message(avsys_audio, GST_RESOURCE_ERROR_OPEN_READ); + return FALSE; +} + +static gboolean +gst_avsysaudiosink_unprepare (GstAudioSink * asink) +{ + GstAvsysAudioSink *avsys_audio = NULL; + gboolean result = TRUE; + avsys_audio = GST_AVSYS_AUDIO_SINK (asink); + + GST_WARNING("Start"); + if(!gst_avsysaudiosink_avsys_close(avsys_audio)) + { + GST_ERROR_OBJECT(avsys_audio, "gst_avsysaudiosink_avsys_close() failed"); + result = FALSE; + } + GST_WARNING("End"); + + return result; +} + +static gboolean +gst_avsysaudiosink_close (GstAudioSink * asink) +{ + GstAvsysAudioSink *avsys_audio = NULL; + + avsys_audio = GST_AVSYS_AUDIO_SINK (asink); + gst_caps_replace (&avsys_audio->cached_caps, NULL); + + return TRUE; +} + + +/* + * Underrun and suspend recovery + */ + +static guint +gst_avsysaudiosink_write (GstAudioSink * asink, gpointer data, guint length) +{ + GstAvsysAudioSink *avsys_audio = NULL; + gint write_len = 0; + + avsys_audio = GST_AVSYS_AUDIO_SINK (asink); + GST_AVSYS_AUDIO_SINK_LOCK (asink); + + if (avsys_audio->audio_stream_cb == NULL) { + write_len = avsys_audio_write(avsys_audio->audio_handle, data, length); + +#if defined (LPCM_DUMP_SUPPORT) + fwrite(data, 1, write_len, avsys_audio->dumpFp); //This is for original data (no volume convert) +#endif + if(write_len != length) + { + goto write_error; + } + + GST_AVSYS_AUDIO_SINK_UNLOCK (asink); + + return write_len; +write_error: + { + GST_AVSYS_AUDIO_SINK_UNLOCK (asink); + + if(AVSYS_FAIL(write_len)) + { + GST_ERROR_OBJECT(avsys_audio, "avsys_audio_write() failed with %d\n", write_len); + } + return length; /* skip one period */ + } + } else { + gboolean result; + result = avsys_audio->audio_stream_cb(data, length, avsys_audio->cbHandle); + if(!result) + { + GST_ERROR_OBJECT(avsys_audio,"auido stream callback failed\n"); + } + GST_AVSYS_AUDIO_SINK_UNLOCK (asink); + return length; + } +} + +static guint +gst_avsysaudiosink_delay (GstAudioSink * asink) +{ + GstAvsysAudioSink *avsys_audio = NULL; + int delay = 0; + guint retValue = 0; + + avsys_audio = GST_AVSYS_AUDIO_SINK (asink); + GST_AVSYS_AUDIO_SINK_RESET_LOCK (asink); + if ((int)avsys_audio->audio_handle != -1) { + if (AVSYS_STATE_SUCCESS == avsys_audio_delay(avsys_audio->audio_handle, &delay)) { + retValue = delay; + } + } + GST_AVSYS_AUDIO_SINK_RESET_UNLOCK (asink); + return retValue; +} + +static void +gst_avsysaudiosink_reset (GstAudioSink * asink) +{ + GstAvsysAudioSink *avsys_audio = NULL; + int avsys_result = AVSYS_STATE_SUCCESS; + + GST_WARNING("Start"); + GST_AVSYS_AUDIO_SINK_LOCK (asink); + avsys_audio = GST_AVSYS_AUDIO_SINK (asink); + +#if defined(__REPLACE_RESET_WITH_CLOSE_AND_REOPEN__) + GST_AVSYS_AUDIO_SINK_RESET_LOCK (asink); + avsys_result = avsys_audio_close (avsys_audio->audio_handle); + if(AVSYS_FAIL(avsys_result)) { + GST_ERROR_OBJECT (avsys_audio, "avsys_audio_close: internal error: "); + } else { + avsys_audio->audio_handle =(avsys_handle_t) -1; + } + GST_AVSYS_AUDIO_SINK_RESET_UNLOCK (asink); +#else + if(AVSYS_STATE_SUCCESS != avsys_audio_reset(avsys_audio->audio_handle)) { + GST_ERROR_OBJECT (avsys_audio, "avsys-reset: internal error: "); + } +#endif + + GST_AVSYS_AUDIO_SINK_UNLOCK (asink); + GST_WARNING("End"); + + return; +} + + +static gboolean +gst_avsysaudiosink_avsys_open(GstAvsysAudioSink *avsys_audio) +{ + int avsys_result; + + GST_AVSYS_AUDIO_SINK_LOCK(avsys_audio); + if (avsys_audio->audio_handle == (avsys_handle_t)-1) { + + GST_LOG_OBJECT (avsys_audio, "avsys_audio_open() with user policy [%d] ", avsys_audio->user_route_policy); + + avsys_result = avsys_audio_open(&avsys_audio->audio_param, &avsys_audio->audio_handle, &avsys_audio->avsys_size); + if (avsys_result != AVSYS_STATE_SUCCESS) { + GST_AVSYS_AUDIO_SINK_UNLOCK (avsys_audio); + avsysaudiosink_post_message(avsys_audio, GST_RESOURCE_ERROR_OPEN_READ); + return FALSE; + } + + GST_LOG_OBJECT (avsys_audio, "Opened av system "); + + GST_AVSYS_AUDIO_SINK_UNLOCK (avsys_audio); + } else { + GST_WARNING_OBJECT(avsys_audio, "audio handle has already opened"); + GST_AVSYS_AUDIO_SINK_UNLOCK (avsys_audio); + return FALSE; + } +#if defined (LPCM_DUMP_SUPPORT) + if (avsys_audio->dumpFp == NULL) { + avsys_audio->dumpFp = fopen("/root/dump.lpcm","w"); + } +#endif + return TRUE; +} + +static gboolean +gst_avsysaudiosink_avsys_close(GstAvsysAudioSink *avsys_audio) +{ + int avsys_result = AVSYS_STATE_SUCCESS; + + GST_AVSYS_AUDIO_SINK_LOCK (avsys_audio); + + if (avsys_audio->audio_handle != (avsys_handle_t)-1 ) { + avsys_result = avsys_audio_close(avsys_audio->audio_handle); + + if (AVSYS_FAIL(avsys_result)) + { + GST_ERROR_OBJECT(avsys_audio, + "avsys_audio_close() failed with 0x%x", avsys_result); + GST_AVSYS_AUDIO_SINK_UNLOCK (avsys_audio); + return FALSE; + } else { + avsys_audio->audio_handle = (avsys_handle_t) -1; + GST_INFO_OBJECT(avsys_audio, "avsys_audio_close() success"); + } + + GST_LOG_OBJECT (avsys_audio, "Closed av system "); + } else { + GST_WARNING_OBJECT(avsys_audio, "audio handle has already closed"); + } + + GST_AVSYS_AUDIO_SINK_UNLOCK (avsys_audio); +#if defined (LPCM_DUMP_SUPPORT) + if(avsys_audio->dumpFp != NULL) + { + fclose(avsys_audio->dumpFp); + avsys_audio->dumpFp = NULL; + } +#endif + return TRUE; +} + +static GstStateChangeReturn +gst_avsyssudiosink_change_state (GstElement *element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstAvsysAudioSink *avsys_audio = GST_AVSYS_AUDIO_SINK (element); + + int avsys_result = AVSYS_STATE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: +#if defined(_ALSA_DAPM_) + switch(avsys_audio->audio_route_policy) { + case AVSYSAUDIOSINK_AUDIOROUTE_USE_EXTERNAL_SETTING: + GST_INFO_OBJECT(avsys_audio, "audio route uses external setting"); + break; + default: + GST_ERROR_OBJECT(avsys_audio, "Unknown audio route option %d\n", avsys_audio->audio_route_policy); + break; + } +#endif +#if defined(__REPLACE_RESET_WITH_CLOSE_AND_REOPEN__) + if (avsys_audio->audio_handle == (avsys_handle_t)-1) { + avsys_result = avsys_audio_open(&avsys_audio->audio_param, &avsys_audio->audio_handle, &avsys_audio->avsys_size); + if (AVSYS_FAIL(avsys_result)) { + GST_ERROR_OBJECT (avsys_audio, "avsys_audio_open: internal error: "); + return GST_STATE_CHANGE_FAILURE; + } + } +#endif + + if (avsys_audio->use_fadeup_volume) { + GST_INFO_OBJECT(avsys_audio, "Set fadeup volume"); + avsys_audio_set_volume_fadeup(avsys_audio->audio_handle); + } + + if(AVSYS_STATE_SUCCESS != avsys_audio_set_mute(avsys_audio->audio_handle, CONVERT_MUTE_VALUE(avsys_audio->mute))) + { + GST_ERROR_OBJECT(avsys_audio, "Set mute failed %d", CONVERT_MUTE_VALUE(avsys_audio->mute)); + } + break; + default: + break; + } + ret = GST_ELEMENT_CLASS(parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) { + return ret; + } + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default: + break; + } + return ret; +} + + +static gboolean +avsysaudiosink_post_message(GstAvsysAudioSink* self,int errorcode) +{ + GST_DEBUG("avsysaudiosink_post_message\n"); + gboolean ret = TRUE; + GstMessage *Msg = NULL; + GQuark domain; + gboolean status = FALSE; + GError *error = NULL; + gint error_code; + /* + if(errorcode>0) + error_code = errorcode; + else + error_code = GST_STREAM_ERROR_TYPE_NOT_FOUND; */ + error_code = errorcode; + domain = gst_resource_error_quark(); + error = g_error_new (domain, error_code, "AVSYSAUDIOSINK_RESOURCE_ERROR"); + Msg = gst_message_new_error(GST_ELEMENT(self), error, "AVSYSAUDIOSINK_ERROR"); + status = gst_element_post_message (GST_ELEMENT(self), Msg); + if (status == FALSE) + { + GST_ERROR("Error in posting message on the bus ...\n"); + ret = FALSE; + } + + return ret; +} diff --git a/mobile/avsystem/src/gstavsysaudiosink.h b/mobile/avsystem/src/gstavsysaudiosink.h new file mode 100644 index 0000000..47da754 --- /dev/null +++ b/mobile/avsystem/src/gstavsysaudiosink.h @@ -0,0 +1,124 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifndef __GST_AVSYSAUDIOSINK_H__ +#define __GST_AVSYSAUDIOSINK_H__ + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AVSYS_AUDIO_SINK (gst_avsysaudiosink_get_type()) +#define GST_AVSYS_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVSYS_AUDIO_SINK,GstAvsysAudioSink)) +#define GST_AVSYS_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVSYS_AUDIO_SINK,GstAvsysAudioSinkClass)) +#define GST_IS_AVSYS_AUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVSYS_AUDIO_SINK)) +#define GST_IS_AVSYS_AUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVSYS_AUDIO_SINK)) +//#define GST_AVSYS_AUDIO_SINK_CAST(obj) ((GstAvsysAudioSink *) (obj)) + +typedef struct _GstAvsysAudioSink GstAvsysAudioSink; +typedef struct _GstAvsysAudioSinkClass GstAvsysAudioSinkClass; + +#define GST_AVSYS_AUDIO_SINK_GET_LOCK(obj) (GST_AVSYS_AUDIO_SINK (obj)->avsys_audio_lock) +#define GST_AVSYS_AUDIO_SINK_LOCK(obj) (g_mutex_lock (GST_AVSYS_AUDIO_SINK_GET_LOCK(obj))) +#define GST_AVSYS_AUDIO_SINK_UNLOCK(obj) (g_mutex_unlock (GST_AVSYS_AUDIO_SINK_GET_LOCK(obj))) + +#define GST_AVSYS_AUDIO_SINK_GET_RESET_LOCK(obj) (GST_AVSYS_AUDIO_SINK (obj)->avsys_audio_reset_lock) +#define GST_AVSYS_AUDIO_SINK_RESET_LOCK(obj) (g_mutex_lock (GST_AVSYS_AUDIO_SINK_GET_RESET_LOCK(obj))) +#define GST_AVSYS_AUDIO_SINK_RESET_UNLOCK(obj) (g_mutex_unlock (GST_AVSYS_AUDIO_SINK_GET_RESET_LOCK(obj))) + + +typedef enum { + AVSYSAUDIOSINK_AUDIO_UNMUTE = 0, + AVSYSAUDIOSINK_AUDIO_MUTE, + AVSYSAUDIOSINK_AUDIO_MUTE_WITH_FADEDOWN_EFFECT, +}GstAvsysAudioSinkAudioMute; + + +typedef enum { + AVSYSAUDIOSINK_AUDIOROUTE_USE_EXTERNAL_SETTING = -1, + AVSYSAUDIOSINK_AUDIOROUTE_PLAYBACK_NORMAL, + AVSYSAUDIOSINK_AUDIOROUTE_PLAYBACK_ALERT, + AVSYSAUDIOSINK_AUDIOROUTE_PLAYBACK_HEADSET_ONLY +}GstAvsysAudioSinkAudioRoutePolicy; + + +typedef enum { + AVSYSAUDIOSINK_USERROUTE_AUTO = 0, + AVSYSAUDIOSINK_USERROUTE_PHONE +}GstAvsysAudioSinkUserRoutePolicy; + +typedef enum { + AVSYSAUDIOSINK_LATENCY_LOW = 0, + AVSYSAUDIOSINK_LATENCY_MID, + AVSYSAUDIOSINK_LATENCY_HIGH, +}GstAvsysAudioSinkLatency; + +#define GST_AVSYS_AUDIO_SINK_USER_ROUTE (gst_avsysaudiosink_user_route_get_type ()) +#define GST_AVSYS_AUDIO_SINK_AUDIO_ROUTE (gst_avsysaudiosink_audio_route_get_type ()) +#define GST_AVSYS_AUDIO_SINK_MUTE (gst_avsysaudiosink_audio_mute_get_type()) +#define GST_AVSYS_AUDIO_SINK_LATENCY_TYPE (gst_avsysaudiosink_latency_get_type ()) + +//this define if for debugging +//#define LPCM_DUMP_SUPPORT +struct _GstAvsysAudioSink { + GstAudioSink sink; + + avsys_handle_t audio_handle; + avsys_audio_param_t audio_param; + gint avsys_size; + gint mute; + gint use_fadeup_volume; + gint close_handle_on_prepare; + gint audio_route_policy; + gint user_route_policy; + gint latency; + + GstCaps *cached_caps; + + GMutex *avsys_audio_lock; + GMutex *avsys_audio_reset_lock; + gint volume_type; + gint sound_priority; + gint bytes_per_sample; + + gpointer cbHandle; + gboolean (*audio_stream_cb) (void *stream, int stream_size, void *user_param); +}; + + +struct _GstAvsysAudioSinkClass { + GstAudioSinkClass parent_class; +}; + +GType gst_avsysaudiosink_get_type (void); +GType gst_avsysaudiosink_audio_route_get_type (void); +GType gst_avsysaudiosink_audio_mute_get_type(void); +GType gst_avsysaudiosink_latency_get_type (void); + +G_END_DECLS + +#endif /* __GST_AVSYSAUDIOSINK_H__ */ diff --git a/mobile/avsystem/src/gstavsysaudiosrc.c b/mobile/avsystem/src/gstavsysaudiosrc.c new file mode 100644 index 0000000..3a4fdc0 --- /dev/null +++ b/mobile/avsystem/src/gstavsysaudiosrc.c @@ -0,0 +1,1005 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include +#include +//#include + +#include /*gettimeofday*/ +#include + +#include "gstavsysaudiosrc.h" + +/** + * Define for Release + * + * _ENABLE_FAKE_READ: enable fake read instead of avsys_audio_read(). (default: 0) + */ +#define _ENABLE_FAKE_READ 0 +//#define USE_GPT8 + + +#define _MIN_RATE 8000 +#define _MAX_RATE 48000 +#define _MIN_CHANNEL 1 +#define _MAX_CHANNEL 2 + + +#define DEFAULT_GPT8_FREQ 26 + +#if _ENABLE_FAKE_READ +static long g_delay_time; +#endif + +#define DEFAULT_MEDIACALL_MODE AVSYS_AUDIO_ECHO_MODE_NONE +#define DEFAULT_AUDIO_LATENCY AVSYSAUDIOSRC_LATENCY_MID + +GST_DEBUG_CATEGORY_EXTERN (avsystem_src_debug); +#define GST_CAT_DEFAULT avsystem_src_debug + +/* elementfactory information */ +static const GstElementDetails gst_avsysaudiosrc_details = + GST_ELEMENT_DETAILS ("AV system source", + "Source/Audio", + "Read from a AV system audio in", + "Samsung Electronics co., ltd."); + + +enum { + PROP_0, +#if 0 +#if !defined(I386_SIMULATOR) + PROP_AUDIO_MEDIA_CALL, +#endif +#endif + PROP_AUDIO_LATENCY, +}; + +enum { + CAPTURE_UNCORK = 0, + CAPTURE_CORK, +}; + +GType +gst_avsysaudiosrc_audio_latency_get_type (void) +{ + static GType capture_audio_latency_type = 0; + static const GEnumValue capture_audio_latency[] = { + {AVSYSAUDIOSRC_LATENCY_LOW, "Set capture latency as low", "low"}, + {AVSYSAUDIOSRC_LATENCY_MID, "Set capture latency as mid", "mid"}, + {AVSYSAUDIOSRC_LATENCY_HIGH, "Set capture latency as high", "high"}, + {0, NULL, NULL}, + }; + + if (!capture_audio_latency_type) { + capture_audio_latency_type = + g_enum_register_static ("GstAvsysAudioSrcAudioLatency", capture_audio_latency); + } + return capture_audio_latency_type; +} + + +GST_BOILERPLATE (GstAvsysAudioSrc, gst_avsysaudiosrc, GstAudioSrc, GST_TYPE_AUDIO_SRC); + +#if _ENABLE_FAKE_READ +static unsigned long fake_delay (unsigned long usec); +#endif + +static guint gst_avsysaudiosrc_delay (GstAudioSrc *asrc); + +static void gst_avsysaudiosrc_finalize (GObject * object); +static void gst_avsysaudiosrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_avsysaudiosrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); + +static GstCaps* gst_avsysaudiosrc_getcaps (GstBaseSrc * bsrc); + +static gboolean gst_avsysaudiosrc_open (GstAudioSrc * asrc); +static gboolean gst_avsysaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec); +static gboolean gst_avsysaudiosrc_unprepare (GstAudioSrc * asrc); +static gboolean gst_avsysaudiosrc_close (GstAudioSrc * asrc); +static guint gst_avsysaudiosrc_read (GstAudioSrc * asrc, gpointer data, guint length); +static void gst_avsysaudiosrc_reset (GstAudioSrc * asrc); +static gboolean gst_avsysaudiosrc_avsys_close (GstAvsysAudioSrc *src); +static gboolean gst_avsysaudiosrc_avsys_open (GstAvsysAudioSrc *src); +static gboolean gst_avsysaudiosrc_avsys_cork (GstAvsysAudioSrc *avsysaudiosrc, int cork); +static gboolean gst_avsysaudiosrc_avsys_start (GstAvsysAudioSrc *src); +static gboolean gst_avsysaudiosrc_avsys_stop (GstAvsysAudioSrc *src); +#if defined(_USE_CAPS_) +static GstCaps *gst_avsysaudiosrc_detect_rates (GstObject * obj, avsys_pcm_hw_params_t * hw_params, GstCaps * in_caps); +static GstCaps *gst_avsysaudiosrc_detect_channels (GstObject * obj,avsys_pcm_hw_params_t * hw_params, GstCaps * in_caps); +static GstCaps *gst_avsysaudiosrc_detect_formats (GstObject * obj,avsys_pcm_hw_params_t * hw_params, GstCaps * in_caps); +static GstCaps *gst_avsysaudiosrc_probe_supported_formats (GstObject * obj, avsys_handle_t handle, const GstCaps * template_caps); +#endif +static GstStateChangeReturn gst_avsys_src_change_state (GstElement * element, GstStateChange transition) ; + + + +/* AvsysAudioSrc signals and args */ +enum { + LAST_SIGNAL +}; + +# define AVSYS_AUDIO_SRC_FACTORY_ENDIANNESS "LITTLE_ENDIAN" + +static GstStaticPadTemplate avsysaudiosrc_src_factory = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ( + "audio/x-raw-int, " + "endianness = (int) { " AVSYS_AUDIO_SRC_FACTORY_ENDIANNESS " }, " + "signed = (boolean) { TRUE }, " + "width = (int) 16, " + "depth = (int) 16, " + "rate = (int) [ 8000, 48000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-raw-int, " + "signed = (boolean) { FALSE }, " + "width = (int) 8, " + "depth = (int) 8, " + "rate = (int) [ 8000, 48000 ], " + "channels = (int) [ 1, 2 ]") + ); + +static inline guint _time_to_sample(GstAvsysAudioSrc *avsyssrc, GstClockTime diff) +{ + guint result = 0; + // sample rate : asrc->audio_param.samplerate + result =(GST_TIME_AS_USECONDS(diff) * avsyssrc->audio_param.samplerate)/1000000; + return result; +} + + +static void +gst_avsysaudiosrc_finalize (GObject * object) +{ + GstAvsysAudioSrc *src = NULL; + + + src = GST_AVSYS_AUDIO_SRC (object); + g_mutex_free (src->avsysaudio_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_avsysaudiosrc_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details (element_class, &gst_avsysaudiosrc_details); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&avsysaudiosrc_src_factory)); +} + +static void +gst_avsysaudiosrc_class_init (GstAvsysAudioSrcClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSrcClass *gstbasesrc_class; + GstBaseAudioSrcClass *gstbaseaudiosrc_class; + GstAudioSrcClass *gstaudiosrc_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; + gstaudiosrc_class = (GstAudioSrcClass *) klass; + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_avsys_src_change_state); + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_finalize); + gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_get_property); + gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_set_property); +#if defined(_USE_CAPS_) + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_getcaps); +#endif + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_open); + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_prepare); + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_unprepare); + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_close); + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_read); + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_delay); + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_avsysaudiosrc_reset); + + g_object_class_install_property (gobject_class ,PROP_AUDIO_LATENCY, + g_param_spec_enum("latency", "Audio Latency", + "Audio latency", + GST_AVSYS_AUDIO_SRC_LATENCY, DEFAULT_AUDIO_LATENCY, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS )); +} + + + +/** + *@note useful range 0 - 1000000 microsecond + */ +#if _ENABLE_FAKE_READ +static unsigned long +fake_delay (unsigned long usec) +{ + struct timeval s_time; + struct timeval c_time; + long s_sec = 0L; + long s_usec = 0L; + long c_sec = 0L; + long c_usec = 0L; + long t_sec = 0L; + long t_usec = 0L; + unsigned long total_usec = 0UL; + unsigned long t = 0UL; + + if (usec == 0UL) { + usleep (0); + return 0; + } + + /*get start time*/ + if (gettimeofday ((struct timeval *)&s_time, NULL) == 0) { + s_sec = s_time.tv_sec; + s_usec = s_time.tv_usec; + } else { + return 0; + } + + for (;;) { + /*get current time*/ + if (gettimeofday ((struct timeval *)&c_time, NULL) == 0) { + c_sec = c_time.tv_sec; + c_usec = c_time.tv_usec; + } else { + return 0; + } + + /*get elasped sec*/ + t_sec = c_sec - s_sec; + + /*get elapsed usec*/ + if ((s_usec) > (c_usec)) { + t_usec = 1000000L - (s_usec) + (c_usec); + t_sec--; + } else { + t_usec = (c_usec) - (s_usec); + } + + /*get total elapsed time*/ + total_usec = (t_sec * 1000000UL) + t_usec; + + t = usec - total_usec; + + if (total_usec >= usec) { + break; + } else { + if (t > 10000UL) { + /*this function does not work in precision*/ + usleep (1); + } + } + } + + return total_usec; +} +#endif + +static guint +gst_avsysaudiosrc_delay (GstAudioSrc *asrc) +{ + GstAvsysAudioSrc *avsys_audio = NULL; + int delay; + guint retValue = 0; + + avsys_audio = GST_AVSYS_AUDIO_SRC (asrc); + if(AVSYS_STATE_SUCCESS == avsys_audio_delay(avsys_audio->audio_handle, &delay)) + retValue = delay; + + return retValue; +} + + + +static void +gst_avsysaudiosrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstAvsysAudioSrc *src = NULL; +// gint getvalue = 0; + src = GST_AVSYS_AUDIO_SRC (object); + + if (src->cached_caps == NULL) + { + switch (prop_id) + { + case PROP_AUDIO_LATENCY: + src->latency = g_value_get_enum(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + } +} + +static void +gst_avsysaudiosrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstAvsysAudioSrc *src; + + src = GST_AVSYS_AUDIO_SRC (object); + + switch (prop_id) + { + case PROP_AUDIO_LATENCY: + g_value_set_enum(value, src->latency); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_avsysaudiosrc_init (GstAvsysAudioSrc * avsysaudiosrc, GstAvsysAudioSrcClass * g_class) +{ + GST_DEBUG_OBJECT (avsysaudiosrc, "initializing"); + + avsysaudiosrc->cached_caps = NULL; + avsysaudiosrc->audio_handle = (avsys_handle_t)-1; + avsysaudiosrc->buffer_size = 0; + avsysaudiosrc->avsysaudio_lock = g_mutex_new (); + avsysaudiosrc->latency = DEFAULT_AUDIO_LATENCY; +} + +#if defined(_USE_CAPS_) +static GstCaps * +gst_avsysaudiosrc_getcaps (GstBaseSrc * bsrc) +{ + GstElementClass *element_class; + GstPadTemplate *pad_template; + GstAvsysAudioSrc *src; + GstCaps *caps = NULL; + + src = GST_AVSYS_AUDIO_SRC (bsrc); + + if(src->audio_handle==(avsys_handle_t)-1){ + GST_DEBUG_OBJECT(src,"device not open, using template caps"); + return NULL; + } + + if (src->cached_caps) + { + GST_LOG_OBJECT (src, "Returning cached caps"); + return gst_caps_ref(src->cached_caps); + } + element_class = GST_ELEMENT_GET_CLASS (src); + pad_template = gst_element_class_get_pad_template (element_class, "src"); + g_return_val_if_fail (pad_template != NULL, NULL); + + caps = gst_avsysaudiosrc_probe_supported_formats (GST_OBJECT (src), src->audio_handle, + gst_pad_template_get_caps (pad_template)); + + if (caps) { + src->cached_caps = gst_caps_ref (caps); + } + + GST_INFO_OBJECT (src, "returning caps %" GST_PTR_FORMAT, caps); + + return caps; +} +#endif +static gboolean +gst_avsysaudiosrc_open (GstAudioSrc * asrc) +{ + return TRUE; +} + +static gboolean +avsysaudiosrc_parse_spec (GstAvsysAudioSrc *avsys_audio, GstRingBufferSpec * spec) +{ + /* Check param */ + if (spec->type != GST_BUFTYPE_LINEAR || + spec->channels > 2 || spec->channels < 1 || + !(spec->format == GST_S8 || spec->format == GST_S16_LE) ) + return FALSE; + + switch(spec->format) + { + case GST_S8: + avsys_audio->audio_param.format = AVSYS_AUDIO_FORMAT_8BIT; + avsys_audio->bytes_per_sample = 1; + break; + case GST_S16_LE: + avsys_audio->audio_param.format = AVSYS_AUDIO_FORMAT_16BIT; + avsys_audio->bytes_per_sample = 2; + break; + default: + GST_DEBUG_OBJECT(avsys_audio, "Only support S8, S16LE format"); + return FALSE; + } + + // set audio parameter for avsys audio open + + switch(avsys_audio->latency) + { + case AVSYSAUDIOSRC_LATENCY_LOW: + avsys_audio->audio_param.mode = AVSYS_AUDIO_MODE_INPUT_LOW_LATENCY; + break; + case AVSYSAUDIOSRC_LATENCY_MID: + avsys_audio->audio_param.mode = AVSYS_AUDIO_MODE_INPUT; + break; + case AVSYSAUDIOSRC_LATENCY_HIGH: + avsys_audio->audio_param.mode = AVSYS_AUDIO_MODE_INPUT_HIGH_LATENCY; + break; + default: + break; + } + + avsys_audio->audio_param.priority = 0; + avsys_audio->audio_param.samplerate = spec->rate; + avsys_audio->audio_param.channels = spec->channels; + + if(spec->channels == 2) + avsys_audio->bytes_per_sample *= 2; + else if(spec->channels > 2) + { + GST_ERROR_OBJECT(avsys_audio,"Unsupported channel number %d", spec->channels); + return FALSE; + } + + return TRUE; +} + +static gboolean +gst_avsysaudiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) +{ + GstAvsysAudioSrc *avsysaudiosrc = NULL; + guint p_time = 0, b_time = 0; + + avsysaudiosrc = GST_AVSYS_AUDIO_SRC (asrc); + + if (!avsysaudiosrc_parse_spec(avsysaudiosrc, spec)) + { + GST_ERROR("avsysaudiosrc_parse_spec failed"); + return FALSE; + } + + /*open avsys audio*/ + if (!gst_avsysaudiosrc_avsys_open (avsysaudiosrc)) + { + GST_ERROR("gst_avsysaudiosrc_avsys_open failed"); + return FALSE; + } + + /* Ring buffer size */ + if (AVSYS_STATE_SUCCESS == + avsys_audio_get_period_buffer_time(avsysaudiosrc->audio_handle, &p_time, &b_time)) + { + if(p_time == 0 || b_time == 0) + return FALSE; + + spec->latency_time = (guint64)p_time; + spec->buffer_time = (guint64)b_time; + } + else + { + return FALSE; + } + spec->segsize = avsysaudiosrc->buffer_size; + spec->segtotal = (b_time / p_time) + (((b_time % p_time)/p_time > 0.5) ? 1: 0); + spec->segtotal += 2; + + GST_INFO_OBJECT(avsysaudiosrc, "audio buffer spec : latency_time(%llu), buffer_time(%llu), segtotal(%d), segsize(%d)\n", + spec->latency_time, spec->buffer_time, spec->segtotal, spec->segsize); + + + return TRUE; +} + +static gboolean +gst_avsysaudiosrc_unprepare (GstAudioSrc * asrc) +{ + GstAvsysAudioSrc *avsysaudiosrc = NULL; + gboolean ret = TRUE; + + avsysaudiosrc = GST_AVSYS_AUDIO_SRC (asrc); + + /*close*/ + GST_AVSYS_AUDIO_SRC_LOCK (avsysaudiosrc); + + if(!gst_avsysaudiosrc_avsys_close(avsysaudiosrc)) + { + GST_ERROR_OBJECT(avsysaudiosrc, "gst_avsysaudiosrc_avsys_close failed"); + ret = FALSE; + } + GST_AVSYS_AUDIO_SRC_UNLOCK (asrc); + + + + return ret; +} + +static gboolean +gst_avsysaudiosrc_close (GstAudioSrc * asrc) +{ + GstAvsysAudioSrc *avsysaudiosrc = NULL; + + avsysaudiosrc = GST_AVSYS_AUDIO_SRC (asrc); + gst_caps_replace (&avsysaudiosrc->cached_caps, NULL); + + return TRUE; +} + +static void +gst_avsysaudiosrc_reset (GstAudioSrc * asrc) +{ + GstAvsysAudioSrc *avsys_audio = NULL; + + avsys_audio = GST_AVSYS_AUDIO_SRC (asrc); + GST_AVSYS_AUDIO_SRC_LOCK (asrc); + + if(AVSYS_STATE_SUCCESS != avsys_audio_reset(avsys_audio->audio_handle)) + { + GST_ERROR_OBJECT (avsys_audio, "avsys-reset: internal error: "); + } + + GST_AVSYS_AUDIO_SRC_UNLOCK (asrc); + + return; +} + + +static GstStateChangeReturn +gst_avsys_src_change_state (GstElement * element, GstStateChange transition) +{ + GstAvsysAudioSrc *avsys = NULL; + GstStateChangeReturn ret ; + + avsys = GST_AVSYS_AUDIO_SRC (element); + GST_DEBUG("gst_avsys_src_change_state"); + + switch (transition) + { + case GST_STATE_CHANGE_NULL_TO_READY: + { + GST_DEBUG ("GST_STATE_CHANGE_NULL_TO_READY\n") ; + break ; + } + case GST_STATE_CHANGE_READY_TO_PAUSED: + { + GST_DEBUG ("GST_STATE_CHANGE_READY_TO_PAUSED\n") ; + break ; + } + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + { + GST_DEBUG ("GST_STATE_CHANGE_PAUSED_TO_PLAYING\n") ; + /* Capture Start */ + if (!gst_avsysaudiosrc_avsys_start (avsys)) { + GST_ERROR("gst_avsysaudiosrc_avsys_start failed"); + } + break ; + } + default: + break ; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + GST_DEBUG ("After parent_class->change_state...\n") ; + switch (transition) + { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + { + GST_DEBUG ("GST_STATE_CHANGE_PLAYING_TO_PAUSED\n") ; + /* Capture Stop */ + if (!gst_avsysaudiosrc_avsys_stop (avsys)) { + GST_ERROR("gst_avsysaudiosrc_avsys_stop failed"); + } + break ; + } + case GST_STATE_CHANGE_PAUSED_TO_READY: + { + GST_DEBUG ("GST_STATE_CHANGE_PAUSED_TO_READY\n") ; + break ; + } + case GST_STATE_CHANGE_READY_TO_NULL: + { + GST_DEBUG ("GST_STATE_CHANGE_READY_TO_NULL\n") ; + break ; + } + default: + break ; + } + + return ret; +} + + + +static guint +gst_avsysaudiosrc_read (GstAudioSrc * asrc, gpointer data, guint length) +{ + GstAvsysAudioSrc *avsysaudiosrc = NULL; + gint readed = 0; + gpointer ptr = NULL; + guint used_length = 0; + + avsysaudiosrc = GST_AVSYS_AUDIO_SRC (asrc); + + ptr = data; + + GST_AVSYS_AUDIO_SRC_LOCK (avsysaudiosrc); +#if _ENABLE_FAKE_READ + readed = avsysaudiosrc->buffer_size; + memset (ptr, 10, avsysaudiosrc->buffer_size); /*maybe can't hear*/ + fake_delay (1000000UL / g_delay_time); +#else + ptr = data; + readed = avsys_audio_read (avsysaudiosrc->audio_handle, ptr, length); + if (readed < 0) + goto _READ_ERROR; +#endif //_ENABLE_FAKE_READ + GST_AVSYS_AUDIO_SRC_UNLOCK (avsysaudiosrc); + + return readed; + +_READ_ERROR: + { + GST_AVSYS_AUDIO_SRC_UNLOCK (asrc); + return length; /* skip one period */ + } +} + +static gboolean +gst_avsysaudiosrc_avsys_cork (GstAvsysAudioSrc *avsysaudiosrc, int cork) +{ + int avsys_result = avsys_audio_cork (avsysaudiosrc->audio_handle, cork); + if (avsys_result != AVSYS_STATE_SUCCESS) { + GST_ERROR_OBJECT(avsysaudiosrc, "avsys_audio_cork() error. [0x%x]\n", avsys_result); + return FALSE; + } + return TRUE; +} + +static gboolean +gst_avsysaudiosrc_avsys_start (GstAvsysAudioSrc *avsysaudiosrc) +{ + gboolean result; + + GST_AVSYS_AUDIO_SRC_LOCK (avsysaudiosrc); + result = gst_avsysaudiosrc_avsys_cork(avsysaudiosrc, CAPTURE_UNCORK); + GST_AVSYS_AUDIO_SRC_UNLOCK (avsysaudiosrc); + + return result; +} + +static gboolean +gst_avsysaudiosrc_avsys_stop (GstAvsysAudioSrc *avsysaudiosrc) +{ + gboolean result; + + GST_AVSYS_AUDIO_SRC_LOCK (avsysaudiosrc); + result = gst_avsysaudiosrc_avsys_cork(avsysaudiosrc, CAPTURE_CORK); + GST_AVSYS_AUDIO_SRC_UNLOCK (avsysaudiosrc); + + return result; +} + +static gboolean +gst_avsysaudiosrc_avsys_open (GstAvsysAudioSrc *avsysaudiosrc) +{ + int avsys_result = 0; + + GST_AVSYS_AUDIO_SRC_LOCK (avsysaudiosrc); + + avsys_result = avsys_audio_open(&avsysaudiosrc->audio_param, &avsysaudiosrc->audio_handle, &avsysaudiosrc->buffer_size); + + if (avsys_result != AVSYS_STATE_SUCCESS) { + GST_ERROR_OBJECT(avsysaudiosrc, "avsys_audio_open() error. [0x%x]\n", avsys_result); + GST_AVSYS_AUDIO_SRC_UNLOCK (avsysaudiosrc); + return FALSE; + } + +#if _ENABLE_FAKE_READ + g_delay_time = (unsigned long)((avsysaudiosrc->samplerate * (avsysaudiosrc->format / 8) * avsysaudiosrc->channels) / avsysaudiosrc->buffer_size); +#endif + + GST_AVSYS_AUDIO_SRC_UNLOCK (avsysaudiosrc); + return TRUE; +} + +static gboolean +gst_avsysaudiosrc_avsys_close(GstAvsysAudioSrc *src) +{ + int ret; + + if (src->audio_handle != (avsys_handle_t)-1) + { + /*close avsys audio*/ + ret = avsys_audio_close (src->audio_handle); + if (AVSYS_FAIL(ret)) + { + GST_ERROR_OBJECT(src, "avsys_audio_close() error 0x%x", ret); + return FALSE; + } + src->audio_handle = (avsys_handle_t)-1; + GST_DEBUG_OBJECT(src, "AVsys audio handle closed"); + } + else + { + GST_WARNING_OBJECT(src,"avsys audio handle has already closed"); + } + + return TRUE; +} +#if defined(_USE_CAPS_) +static GstCaps * +gst_avsysaudiosrc_detect_rates(GstObject *obj, + avsys_pcm_hw_params_t *hw_params, GstCaps *in_caps) +{ + GstCaps *caps; + guint min, max; + gint err, dir, min_rate, max_rate, i; + + GST_LOG_OBJECT(obj, "probing sample rates ..."); + + if ((err = avsys_pcm_hw_params_get_rate_min(hw_params, &min, &dir)) < 0) + goto min_rate_err; + + if ((err = avsys_pcm_hw_params_get_rate_max(hw_params, &max, &dir)) < 0) + goto max_rate_err; + + min_rate = min; + max_rate = max; + + if (min_rate < _MIN_RATE) + min_rate = _MIN_RATE; /* random 'sensible minimum' */ + + if (max_rate <= 0) + max_rate = _MAX_RATE; /* or maybe just use 192400 or so? */ + else if (max_rate > 0 && max_rate < _MIN_RATE) + max_rate = MAX (_MIN_RATE, min_rate); + + GST_DEBUG_OBJECT(obj, "Min. rate = %u (%d)", min_rate, min); + GST_DEBUG_OBJECT(obj, "Max. rate = %u (%d)", max_rate, max); + + caps = gst_caps_make_writable(in_caps); + + for (i = 0; i < gst_caps_get_size(caps); ++i) + { + GstStructure *s; + + s = gst_caps_get_structure(caps, i); + if (min_rate == max_rate) + { + gst_structure_set(s, "rate", G_TYPE_INT, min_rate, NULL); + } + else + { + gst_structure_set(s, "rate", GST_TYPE_INT_RANGE, min_rate, + max_rate, NULL); + } + } + + return caps; + /* ERRORS */ + min_rate_err: + { + GST_ERROR_OBJECT(obj, "failed to query minimum sample rate"); + gst_caps_unref(in_caps); + return NULL; + } + max_rate_err: + { + GST_ERROR_OBJECT(obj, "failed to query maximum sample rate"); + gst_caps_unref(in_caps); + return NULL; + } +} + + +static GstCaps * +gst_avsysaudiosrc_detect_formats(GstObject * obj, + avsys_pcm_hw_params_t * hw_params, GstCaps * in_caps) +{ + avsys_pcm_format_mask_t *mask; + GstStructure *s; + GstCaps *caps; + gint i; + + avsys_pcm_format_mask_malloc(&mask); + avsys_pcm_hw_params_get_format_mask(hw_params, mask); + + caps = gst_caps_new_empty(); + + for (i = 0; i < gst_caps_get_size(in_caps); ++i) + { + GstStructure *scopy; + //gint w; + gint width = 0, depth = 0; + gint sndformat; + + s = gst_caps_get_structure(in_caps, i); + if (!gst_structure_has_name(s, "audio/x-raw-int")) + { + GST_WARNING_OBJECT(obj, "skipping non-int format"); + continue; + } + if (!gst_structure_get_int(s, "width", &width) + || !gst_structure_get_int(s, "depth", &depth)) + continue; + + GST_DEBUG_OBJECT(obj, "width = %d height = %d", width, depth); + if (width == 8) + sndformat = 0;//SND_PCM_FORMAT_S8 + else + //width==16 + sndformat = 2; //SND_PCM_FORMAT_S16_LE + if (avsys_pcm_format_mask_test(mask, sndformat)) + { //must be implemented + /* template contains { true, false } or just one, leave it as it is */ + scopy = gst_structure_copy(s); + + } + else + { + scopy = NULL; + } + if (scopy) + { + /* TODO: proper endianness detection, for now it's CPU endianness only */ + gst_structure_set(scopy, "signed", G_TYPE_BOOLEAN, TRUE, NULL); + gst_structure_set(scopy, "endianness", G_TYPE_INT, G_BYTE_ORDER, + NULL); + gst_caps_append_structure(caps, scopy); + } + + } + + avsys_pcm_format_mask_free(mask); + gst_caps_unref(in_caps); + return caps; +} + + +static GstCaps * +gst_avsysaudiosrc_detect_channels(GstObject * obj, + avsys_pcm_hw_params_t * hw_params, GstCaps * in_caps) +{ + GstCaps *caps; + guint min, max; + gint err, min_channel, max_channel, i; +// gint dir; + + GST_LOG_OBJECT(obj, "probing sample rates ..."); + + if ((err = avsys_pcm_hw_params_get_channels_min(hw_params, &min)) < 0) + goto min_chan_err; + + if ((err = avsys_pcm_hw_params_get_channels_max(hw_params, &max)) < 0) + goto max_chan_err; + + min_channel = min; + max_channel = max; + + if (min_channel < _MIN_CHANNEL) + min_channel = _MIN_CHANNEL; /* random 'sensible minimum' */ + + if (max_channel <= 0) + max_channel = _MAX_CHANNEL; /* or maybe just use 192400 or so? */ + else if (max_channel > 0 && max_channel < _MIN_CHANNEL) + max_channel = MAX (_MAX_CHANNEL, min_channel); + + GST_DEBUG_OBJECT(obj, "Min. channel = %u (%d)", min_channel, min); + GST_DEBUG_OBJECT(obj, "Max. channel = %u (%d)", max_channel, max); + + caps = gst_caps_make_writable(in_caps); + + for (i = 0; i < gst_caps_get_size(caps); ++i) + { + GstStructure *s; + + s = gst_caps_get_structure(caps, i); + if (min_channel == max_channel) + { + gst_structure_set(s, "channels", G_TYPE_INT, _MIN_CHANNEL, NULL); + } + else + { + gst_structure_set(s, "channels", GST_TYPE_INT_RANGE, min_channel, + max_channel, NULL); + } + } + + return caps; + + /* ERRORS */ + min_chan_err: + { + GST_ERROR_OBJECT(obj, "failed to query minimum sample rate"); + gst_caps_unref(in_caps); + return NULL; + } + max_chan_err: + { + GST_ERROR_OBJECT(obj, "failed to query maximum sample rate:"); + gst_caps_unref(in_caps); + return NULL; + } +} + +/* + * gst_avsys_probe_supported_formats: + * + * Takes the template caps and returns the subset which is actually + * supported by this device. + * + */ + +static GstCaps * +gst_avsysaudiosrc_probe_supported_formats(GstObject * obj, + avsys_handle_t handle, const GstCaps * template_caps) +{ + + avsys_pcm_hw_params_t *hw_params; + GstCaps *caps; + gint err; + + avsys_pcm_hw_params_malloc(&hw_params); + if ((err = avsys_pcm_hw_params_any(handle, hw_params)) < 0) + goto error; + + caps = gst_caps_copy(template_caps); + + if (!(caps = gst_avsysaudiosrc_detect_formats(obj, hw_params, caps))) + goto subroutine_error; + + if (!(caps = gst_avsysaudiosrc_detect_rates(obj, hw_params, caps))) + goto subroutine_error; + + if (!(caps = gst_avsysaudiosrc_detect_channels(obj, hw_params, caps))) + goto subroutine_error; + + avsys_pcm_hw_params_free(hw_params); + return caps; + + /* ERRORS */ + error: + { + GST_ERROR_OBJECT(obj, "failed to query formats"); + return NULL; + } + subroutine_error: + { + GST_ERROR_OBJECT(obj, "failed to query formats"); + return NULL; + } +} +#endif diff --git a/mobile/avsystem/src/gstavsysaudiosrc.h b/mobile/avsystem/src/gstavsysaudiosrc.h new file mode 100644 index 0000000..4031e04 --- /dev/null +++ b/mobile/avsystem/src/gstavsysaudiosrc.h @@ -0,0 +1,91 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_AVSYS_AUDIO_SRC_H__ +#define __GST_AVSYS_AUDIO_SRC_H__ + +//#undef _MMCAMCORDER_MERGE_TEMP + +#include +#include + +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AVSYS_AUDIO_SRC (gst_avsysaudiosrc_get_type()) +#define GST_AVSYS_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVSYS_AUDIO_SRC,GstAvsysAudioSrc)) +#define GST_AVSYS_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVSYS_AUDIO_SRC,GstAvsysAudioSrcClass)) +#define GST_IS_AVSYS_AUDIO_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVSYS_AUDIO_SRC)) +#define GST_IS_AVSYS_AUDIO_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVSYS_AUDIO_SRC)) +#define GST_AVSYS_AUDIO_SRC_CAST(obj) ((GstAvsysAudioSrc *)(obj)) + +#define GST_AVSYS_AUDIO_SRC_GET_LOCK(obj) (GST_AVSYS_AUDIO_SRC_CAST (obj)->avsysaudio_lock) +#define GST_AVSYS_AUDIO_SRC_LOCK(obj) (g_mutex_lock (GST_AVSYS_AUDIO_SRC_GET_LOCK (obj))) +#define GST_AVSYS_AUDIO_SRC_UNLOCK(obj) (g_mutex_unlock (GST_AVSYS_AUDIO_SRC_GET_LOCK (obj))) + +typedef struct _GstAvsysAudioSrc GstAvsysAudioSrc; +typedef struct _GstAvsysAudioSrcClass GstAvsysAudioSrcClass; + +typedef enum { + AVSYSAUDIOSRC_LATENCY_LOW = 0, + AVSYSAUDIOSRC_LATENCY_MID, + AVSYSAUDIOSRC_LATENCY_HIGH, +}GstAvsysAudioSrcAudioLatency; + +#define GST_AVSYS_AUDIO_SRC_LATENCY (gst_avsysaudiosrc_audio_latency_get_type()) + + + +/** + * GstAvsysAudioSrc: + * + * Opaque data structure + */ +struct _GstAvsysAudioSrc { + GstAudioSrc src; + + avsys_handle_t audio_handle; + avsys_audio_param_t audio_param; + + gint buffer_size; + GstCaps *cached_caps; + GMutex *avsysaudio_lock; + + gint media_call; + gint bytes_per_sample; + gint latency; + +}; + +struct _GstAvsysAudioSrcClass { + GstAudioSrcClass parent_class; +}; + + +GType gst_avsysaudiosrc_get_type (void); +GType gst_avsysaudiosrc_audio_latency_get_type(void); + +G_END_DECLS + +#endif /* __GST_AVSYS_AUDIO_SRC_H__ */ diff --git a/mobile/avsystem/src/gstavsysmemsink.c b/mobile/avsystem/src/gstavsysmemsink.c new file mode 100644 index 0000000..a47ceaa --- /dev/null +++ b/mobile/avsystem/src/gstavsysmemsink.c @@ -0,0 +1,750 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#if defined(_MM_PROJECT_FLOATER) || defined(_MM_PROJECT_PROTECTOR) || defined(_MM_PROJECT_VOLANS) +#define VERSION "0.10.19" // sec +#define PACKAGE "gstreamer" +#elif defined(_MM_PROJECT_ADORA) +#define VERSION "0.10.9" // mavell +#define PACKAGE "gstreamer" +#else +#include +#endif + +#include +#include + +#include "gstavsysmemsink.h" + +#define debug_enter g_print +#define debug_leave g_print +#define debug_fenter() g_print("enter: %s\n",__FUNCTION__) +#define debug_fleave() g_print("leave: %s\n",__FUNCTION__) +#define debug_msg g_print +#define debug_verbose g_print +#define debug_warning g_print +#define debug_error g_print + +#define GST_CAT_DEFAULT avsysmemsink_debug + +#define DISABLE_YUV_FORMAT_ON_SINK_CAPS + +GST_DEBUG_CATEGORY_STATIC (avsysmemsink_debug); + +enum +{ + SIGNAL_VIDEO_STREAM, + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_WIDTH, + PROP_HEIGHT, + PROP_ROTATE, +}; + +static GstStaticPadTemplate sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, GST_PAD_ALWAYS, + GST_STATIC_CAPS ( +#ifndef DISABLE_YUV_FORMAT_ON_SINK_CAPS + "video/x-raw-yuv, " + "format = (fourcc){YV12}, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " + "height = (int) [ 1, MAX ]; " + "video/x-raw-yuv, " + "format = (fourcc){I420}, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " + "height = (int) [ 1, MAX ]; " + "video/x-raw-rgb, " + "bpp = (int)32, " + "depth = (int)24; " +#else /* BGRA */ + "video/x-raw-rgb, " + "bpp = (int)32, " + "endianness = (int)4321, " + "red_mask = (int)65280, " + "green_mask = (int)16711680, " + "blue_mask = (int)-16777216, " + "alpha_mask = (int)255, " + "width = (int) [ 1, MAX ], " + "height = (int) [ 1, MAX ], " + "framerate = (fraction) [ 0, MAX ]; " +#endif + ) + ); + +static GstElementDetails AvsysMemSink_details = { + "AV-system Stream callback", + "Sink/Video", + "Stream sink for AV-System GStreamer Plug-in", + "" +}; + +static guint gst_avsysmemsink_signals[LAST_SIGNAL] = { 0 }; + + +#ifdef G_ENABLE_DEBUG +#define g_marshal_value_peek_int(v) g_value_get_int (v) +#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) +#else /* !G_ENABLE_DEBUG */ +#define g_marshal_value_peek_int(v) (v)->data[0].v_int +#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer +#endif /* !G_ENABLE_DEBUG */ + + +#define GET_PIXEL(buf, x, y, stride) (*((unsigned char*)(buf) + (x) + (y)*(stride))) + +#define GET_RED(Y,U,V) ((9535 * (Y - 16) + 13074 * (V - 128)) >> 13) +#define GET_GREEN(Y,U,V) ((9535 * (Y - 16) - 6660 * (V - 128) - 3203 * (U - 128)) >> 13 ) +#define GET_BLUE(Y,U,V) ((9535 * (Y - 16) + 16531 * (U - 128)) >> 13 ) + +#define UCLIP(a) (((a)<0)?0:((a)>255)?255:(a)) + + +static void +yuv420toargb(unsigned char *src, unsigned char *dst, int width, int height) +{ + int h,w; + int y=0,u=0,v=0; + int a=0,r=0,g=0,b=0; + + unsigned char* pixel; + + int index=0; + + unsigned char *pY; + unsigned char *pU; + unsigned char *pV; + + GST_DEBUG ("converting yuv420 to argb"); + + pY = src ; + pU = src + (width * height) ; + pV = src + (width * height) + (width * height /4) ; + + a = 255; + + for(h = 0 ; h < height; h++) + { + for(w = 0 ; w < width; w++) + { + y = GET_PIXEL(pY,w,h,width); + u = GET_PIXEL(pU,w/2,h/2,width/2); + v = GET_PIXEL(pV,w/2,h/2,width/2); + + r = GET_RED(y,u,v); + g = GET_GREEN(y,u,v); + b = GET_BLUE(y,u,v); + + r = UCLIP(r); + g = UCLIP(g); + b = UCLIP(b); + + index = (w + (h* width)) * 4; + dst[index] = r; + dst[index+1] = g; + dst[index+2] = b; + dst[index+3] = a; + } + } +} + +static void +rotate_pure(unsigned char *src, unsigned char *dst, int width,int height,int angle,int bpp) +{ + + int size; + int new_x,new_y; + int org_x,org_y; + int dst_width; + int src_idx, dst_idx; + + size = width * height * bpp; + + if(angle == 0) + { + memcpy(dst,src,size); + return; + } + + for(org_y =0; org_y < height; org_y++) + { + for(org_x = 0; org_x < width ; org_x++) + { + if(angle == 90) + { + new_x = height - org_y; + new_y = org_x; + + dst_width = height; + } + else if(angle == 180) + { + new_x = width - org_x; + new_y = height - org_y; + dst_width = width; + } + else if(angle == 270) + { + new_x = org_y; + new_y = width - org_x; + dst_width = height; + } + else + { + g_print("Not support Rotate : %d\n",angle); + return; + } + + src_idx = org_x + (org_y * width); + dst_idx = new_x + (new_y * dst_width); + + memcpy(dst + (dst_idx*bpp), src+(src_idx *bpp),bpp); + } + } + +} + +static void +resize_pure(unsigned char *src, unsigned char *dst, int src_width, int src_height, int dst_width,int dst_height, int bpp) +{ + float xFactor,yFactor; + + float org_fx,org_fy; + int org_x,org_y; + + int x,y; + + int src_index,dst_index; + + unsigned short *pshortSrc; + unsigned short *pshortDst; + + if(bpp == 2) + { + pshortSrc = (unsigned short*)src; + pshortDst = (unsigned short*)dst; + } + + xFactor = (float)((dst_width<<16) / src_width); + yFactor = (float)((dst_height<<16) / src_height); + + for(y = 0; y < dst_height; y++) + { + for(x = 0; x < dst_width; x++) + { + org_fx = (float)((x<<16)/xFactor); + org_fy = (float)((y<<16)/yFactor); + + org_x = (int)(org_fx); + org_y = (int)(org_fy); + + src_index = org_x + (org_y * src_width); + dst_index = x + (y*dst_width); + + memcpy(dst+(dst_index *bpp ),src+(src_index *bpp),bpp); + } + } +} + +/* BOOLEAN:POINTER,INT,INT (avsysvideosink.c:1) */ +void +gst_avsysmemsink_BOOLEAN__POINTER_INT_INT (GClosure *closure, + GValue *return_value G_GNUC_UNUSED, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint G_GNUC_UNUSED, + gpointer marshal_data) +{ + typedef gboolean (*GMarshalFunc_BOOLEAN__POINTER_INT_INT) (gpointer data1, + gpointer arg_1, + gint arg_2, + gint arg_3, + gpointer data2); + register GMarshalFunc_BOOLEAN__POINTER_INT_INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + gboolean v_return; + + g_return_if_fail (return_value != NULL); + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + callback = (GMarshalFunc_BOOLEAN__POINTER_INT_INT) (marshal_data ? marshal_data : cc->callback); + + v_return = callback (data1, + g_marshal_value_peek_pointer (param_values + 1), + g_marshal_value_peek_int (param_values + 2), + g_marshal_value_peek_int (param_values + 3), + data2); + + g_value_set_boolean (return_value, v_return); +} + +static void gst_avsysmemsink_init_interfaces (GType type); + + +GST_BOILERPLATE_FULL (GstAvsysMemSink, gst_avsysmemsink, GstVideoSink, GST_TYPE_VIDEO_SINK, gst_avsysmemsink_init_interfaces); + + +static void +gst_avsysmemsink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GstAvsysMemSink *AvsysMemSink = GST_AVSYS_MEM_SINK (object); + switch (prop_id) { + case PROP_0: + break; + case PROP_WIDTH: + if(AvsysMemSink->dst_width != g_value_get_int (value)) + { + AvsysMemSink->dst_width = g_value_get_int (value); + AvsysMemSink->dst_changed = 1; + } + break; + case PROP_HEIGHT: + if(AvsysMemSink->dst_height != g_value_get_int (value)) + { + AvsysMemSink->dst_height = g_value_get_int (value); + AvsysMemSink->dst_changed = 1; + } + break; + case PROP_ROTATE: + if(AvsysMemSink->rotate != g_value_get_int(value)) + { + AvsysMemSink->rotate = g_value_get_int(value); + AvsysMemSink->dst_changed = 1; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + g_print ("invalid property id\n"); + break; + }; +} + +static void +gst_avsysmemsink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GstAvsysMemSink *AvsysMemSink = GST_AVSYS_MEM_SINK (object); + + switch (prop_id) { + case PROP_0: + break; + case PROP_WIDTH: + g_value_set_int (value, AvsysMemSink->dst_width); + break; + case PROP_HEIGHT: + g_value_set_int (value, AvsysMemSink->dst_height); + break; + case PROP_ROTATE: + g_value_set_int (value, AvsysMemSink->rotate); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + debug_warning ("invalid property id\n"); + break; + } +} + +static void +free_buffer(GstAvsysMemSink *AvsysMemSink) +{ + if(AvsysMemSink->con_buf) + free(AvsysMemSink->con_buf); + + if(AvsysMemSink->rot_buf) + free(AvsysMemSink->rot_buf); + + if(AvsysMemSink->rsz_buf) + free(AvsysMemSink->rsz_buf); + + AvsysMemSink->con_buf = NULL; + AvsysMemSink->rot_buf = NULL; + AvsysMemSink->rsz_buf = NULL; + +} +static GstStateChangeReturn +gst_avsysmemsink_change_state (GstElement *element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstAvsysMemSink *AvsysMemSink = GST_AVSYS_MEM_SINK (element); + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + debug_msg ("GST AVSYS DISPLAY SINK: NULL -> READY\n"); + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + debug_msg ("GST AVSYS DISPLAY SINK: READY -> PAUSED\n"); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + debug_msg ("GST AVSYS DISPLAY SINK: PAUSED -> PLAYING\n"); + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS(parent_class)->change_state (element, transition); + if (ret == GST_STATE_CHANGE_FAILURE) { + return ret; + } + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + debug_msg ("GST AVSYS MEM SINK: PLAYING -> PAUSED\n"); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + debug_msg ("GST AVSYS MEM SINK: PAUSED -> READY\n"); + free_buffer(AvsysMemSink); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + debug_msg ("GST AVSYS MEM SINK: READY -> NULL\n"); + break; + default: + break; + } + + return ret; + + +} + + +static gboolean +gst_avsysmemsink_set_caps (GstBaseSink * bs, GstCaps * caps) +{ + GstAvsysMemSink *s = GST_AVSYS_MEM_SINK (bs); + GstStructure *structure; + gint width = 0; + gint height = 0; + + if (caps != NULL) + { + guint32 fourcc; + char *name = NULL; + int bpp = 0, depth = 0; + + structure = gst_caps_get_structure (caps, 0); + + /**/ + name = (char *) gst_structure_get_name (structure); + GST_DEBUG_OBJECT (s, "CAPS NAME: %s", name); + + if (gst_structure_has_name (structure, "video/x-raw-rgb")) + { + s->is_rgb = TRUE; + } + else if (gst_structure_has_name (structure, "video/x-raw-yuv")) + { + s->is_rgb = FALSE; + } + + /* get source size */ + gst_structure_get_int (structure, "height", &height); + gst_structure_get_int (structure, "width", &width); + + if (gst_structure_get_fourcc (structure, "format", &fourcc)) + { + switch (fourcc) + { + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + debug_warning("set format AVSYS_VIDEO_FORMAT_UYVY\n"); + break; + case GST_MAKE_FOURCC ('Y', 'V', '1', '6'): + case GST_MAKE_FOURCC ('Y', '4', '2', 'B'): + debug_warning("set format AVSYS_VIDEO_FORMAT_YUV422\n"); + break; + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + debug_warning("set format AVSYS_VIDEO_FORMAT_YUV420\n"); + break; + case GST_MAKE_FOURCC ('R', 'G', 'B', ' '): + debug_warning("set format AVSYS_VIDEO_FORMAT_RGB565\n"); + break; + default: + debug_warning("set default format AVSYS_VIDEO_FORMAT_RGB565\n"); + break; + } + } + + if( s->src_width != width || + s->src_height != height) + { + debug_warning ("DISPLAY: Video Source Changed! [%d x %d] -> [%d x %d]\n", + s->src_width, s->src_height, width, height); + s->src_changed = TRUE; + } + + s->src_width = width; + s->src_height = height; + + if(s->dst_width ==0) + { + s->dst_width = width; + s->dst_changed = 1; + } + + if(s->dst_height == 0) + { + s->dst_height = height; + s->dst_changed = 1; + } + debug_msg ("SRC CAPS: width:%d, height:%d \n", width, height); + } + else + { + debug_warning ("caps is NULL.\n"); + } + + debug_fleave (); + + return TRUE; +} + +static GstFlowReturn +gst_avsysmemsink_preroll (GstBaseSink * bsink, GstBuffer * buf) +{ + GstAvsysMemSink *AvsysMemSink = GST_AVSYS_MEM_SINK (bsink); + + AvsysMemSink->src_length = GST_BUFFER_SIZE (buf); + debug_msg ("SRC LENGTH: %d\n", AvsysMemSink->src_length); + + return GST_FLOW_OK; +} + +static GstFlowReturn +gst_avsysmemsink_show_frame (GstBaseSink * bsink, GstBuffer * buf) +{ + GstAvsysMemSink *s = GST_AVSYS_MEM_SINK (bsink); + gboolean res = FALSE; + int f_size; + f_size = GST_BUFFER_SIZE (buf); + unsigned char *dst_buf; + + if ( ! s->is_rgb ) + { + GST_DEBUG_OBJECT (s, "src format is not rgb"); + if (s->dst_changed == TRUE) + { + if(s->con_buf) + { + free(s->con_buf); + s->con_buf = NULL; + } + + if(s->rot_buf) + { + free(s->rot_buf); + s->rot_buf = NULL; + } + + if(s->rsz_buf) + { + free(s->rsz_buf); + s->rsz_buf = NULL; + } + + s->con_buf = malloc(s->src_width * s->src_height * 4); + if(s->rotate != 0) + { + s->rot_buf = malloc(s->src_width * s->src_height * 4); + } + + s->rsz_buf = malloc(s->dst_width * s->dst_height *4); + + s->dst_changed = FALSE; + } + + yuv420toargb(GST_BUFFER_DATA (buf),s->con_buf,s->src_width, s->src_height); + if(s->rotate != 0) + { + rotate_pure(s->con_buf,s->rot_buf,s->src_width, s->src_height,s->rotate,4); + if(s->rotate == 90 || s->rotate == 270) + { + resize_pure(s->rot_buf,s->rsz_buf,s->src_height,s->src_width, + s->dst_width, s->dst_height,4); + } + else + { + resize_pure(s->rot_buf,s->rsz_buf,s->src_width,s->src_height, + s->dst_width, s->dst_height,4); + } + } + else + { + resize_pure(s->con_buf,s->rsz_buf,s->src_width,s->src_height, + s->dst_width, s->dst_height,4); + } + + /* emit signal for video-stream */ + g_signal_emit (s,gst_avsysmemsink_signals[SIGNAL_VIDEO_STREAM], + 0,s->rsz_buf, + s->dst_width,s->dst_height, + &res); + } + else + { + GST_DEBUG_OBJECT (s, "src format is rgb"); + + /* NOTE : video can be resized by convert plugin's set caps on running time. + * So, it should notice it to application through callback func. + */ + g_signal_emit (s, gst_avsysmemsink_signals[SIGNAL_VIDEO_STREAM], + 0, GST_BUFFER_DATA (buf), + s->src_width, s->src_height, + &res); + } + GST_DEBUG_OBJECT (s, "g_signal_emit : src_width=%d, src_height=%d, GST_BUFFER_SIZE=%d", s->src_width,s->src_height,GST_BUFFER_SIZE(buf)); + + /*check video stream callback result.*/ + if (res) + { + //debug_verbose("Video stream is called.\n"); + return GST_FLOW_OK; + } + + return GST_FLOW_OK; +} + +static void +gst_avsysmemsink_init_interfaces (GType type) +{ + /*void*/ +} + + +static void +gst_avsysmemsink_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); + gst_element_class_set_details (element_class, &AvsysMemSink_details); +} + +static void +gst_avsysmemsink_class_init (GstAvsysMemSinkClass *klass) +{ + GObjectClass *gobject_class = (GObjectClass*) klass; + GstElementClass *gstelement_class = (GstElementClass*) klass; + GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass; + + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_avsysmemsink_set_property; + gobject_class->get_property = gst_avsysmemsink_get_property; + + + g_object_class_install_property (gobject_class, PROP_WIDTH, + g_param_spec_int ("width", + "Width", + "Width of display", + 0, G_MAXINT, 176, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + + g_object_class_install_property (gobject_class, PROP_HEIGHT, + g_param_spec_int ("height", + "Height", + "Height of display", + 0, G_MAXINT, 144, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_ROTATE, + g_param_spec_int ("rotate", + "Rotate", + "Rotate of display", + 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + + /** + * GstAvsysVideoSink::video-stream: + */ + gst_avsysmemsink_signals[SIGNAL_VIDEO_STREAM] = g_signal_new ( + "video-stream", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + gst_avsysmemsink_BOOLEAN__POINTER_INT_INT, + G_TYPE_BOOLEAN, + 3, + G_TYPE_POINTER, G_TYPE_INT, G_TYPE_INT); + + gstelement_class->change_state = gst_avsysmemsink_change_state; + + gstbasesink_class->set_caps = gst_avsysmemsink_set_caps; + gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_avsysmemsink_preroll); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_avsysmemsink_show_frame); + + + GST_DEBUG_CATEGORY_INIT (avsysmemsink_debug, + "avsysmemsink", + 0, + "AV system based GStreamer Plug-in"); +} + + +static void +gst_avsysmemsink_init (GstAvsysMemSink *AvsysMemSink, GstAvsysMemSinkClass *klass) +{ + /*private*/ + AvsysMemSink->src_width = 0; + AvsysMemSink->src_height = 0; + + AvsysMemSink->src_changed = 0; + + /*property*/ + AvsysMemSink->dst_width = 0; + AvsysMemSink->dst_height = 0; + + AvsysMemSink->dst_changed = 0; + + AvsysMemSink->rotate = 0; + + AvsysMemSink->con_buf = NULL; + AvsysMemSink->rot_buf = NULL; + AvsysMemSink->rsz_buf = NULL; + + AvsysMemSink->is_rgb = FALSE; +} + + +/* EOF */ diff --git a/mobile/avsystem/src/gstavsysmemsink.h b/mobile/avsystem/src/gstavsysmemsink.h new file mode 100644 index 0000000..bc28029 --- /dev/null +++ b/mobile/avsystem/src/gstavsysmemsink.h @@ -0,0 +1,82 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifndef __GST_AVSYSMEMSINK_H__ +#define __GST_AVSYSMEMSINK_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AVSYS_MEM_SINK (gst_avsysmemsink_get_type()) +#define GST_AVSYS_MEM_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVSYS_MEM_SINK, GstAvsysMemSink)) +#define GST_AVSYS_MEM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVSYS_MEM_SINK, GstAvsysMemSinkClass)) +#define GST_IS_AVSYS_MEM_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVSYS_MEM_SINK)) +#define GST_IS_AVSYS_MEM_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVSYS_MEM_SINK)) + + +typedef struct _GstAvsysMemSink GstAvsysMemSink; +typedef struct _GstAvsysMemSinkClass GstAvsysMemSinkClass; + +struct _GstAvsysMemSink +{ + GstVideoSink videosink; + + int src_width; + int src_height; + + int src_changed; + int src_length; + + + int dst_width; + int dst_height; + + int dst_length; + int dst_changed; + + unsigned char *con_buf; + unsigned char *rot_buf; + unsigned char *rsz_buf; + + int rotate; + + int is_rgb; +}; + +struct _GstAvsysMemSinkClass +{ + GstVideoSinkClass parent_class; +}; + +GType gst_avsysmemsink_get_type (void); + +G_END_DECLS + + +#endif /* __GST_AVSYSMEMSINK_H__ */ + +/* EOF */ diff --git a/mobile/avsystem/src/gstavsyssink.c b/mobile/avsystem/src/gstavsyssink.c new file mode 100644 index 0000000..a1ab29e --- /dev/null +++ b/mobile/avsystem/src/gstavsyssink.c @@ -0,0 +1,66 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "gstavsysaudiosink.h" +#include "gstavsysmemsink.h" + +GST_DEBUG_CATEGORY (avsystem_sink_debug); + +static gboolean +plugin_init (GstPlugin *plugin) +{ + gboolean error; + /*register the exact name you can find in the framework*/ + error = gst_element_register (plugin, "avsysaudiosink", + GST_RANK_PRIMARY + 100, + GST_TYPE_AVSYS_AUDIO_SINK); + + error = gst_element_register (plugin, "avsysmemsink", + GST_RANK_NONE, + GST_TYPE_AVSYS_MEM_SINK); + + if (!error) + goto failed; + + GST_DEBUG_CATEGORY_INIT (avsystem_sink_debug, "avsystemsink", 0, "avsystem sink plugins"); + return TRUE; + +failed: + + return FALSE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "avsyssink", + "AV system video/audio sink plug-in", + plugin_init, + PACKAGE_VERSION, + "LGPL", + "AV System Sink", + "http://www.samsung.com") diff --git a/mobile/avsystem/src/gstavsyssrc.c b/mobile/avsystem/src/gstavsyssrc.c new file mode 100644 index 0000000..adde8df --- /dev/null +++ b/mobile/avsystem/src/gstavsyssrc.c @@ -0,0 +1,63 @@ +/* + * avsystem + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include "gstavsysaudiosrc.h" + +GST_DEBUG_CATEGORY (avsystem_src_debug); + +static gboolean +plugin_init (GstPlugin *plugin) +{ + gboolean error; + /*register the exact name you can find in the framework*/ + error = gst_element_register (plugin, "avsysaudiosrc", + GST_RANK_NONE, + GST_TYPE_AVSYS_AUDIO_SRC); + if (!error) + goto failed; + + GST_DEBUG_CATEGORY_INIT (avsystem_src_debug, "avsystemsrc", 0, "avsystem src plugins"); + return TRUE; + +failed: + + return FALSE; +} + + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "avsysaudiosrc", + "AV system audio source plug-in", + plugin_init, + PACKAGE_VERSION, + "LGPL", + "AV System Source", + "http://www.samsung.com") + diff --git a/mobile/common/ChangeLog b/mobile/common/ChangeLog new file mode 100755 index 0000000..72f093a --- /dev/null +++ b/mobile/common/ChangeLog @@ -0,0 +1,1343 @@ +2008-03-07 Edward Hervey + + * m4/gtk-doc.m4: (GTK_DOC_CHECK): + The previous commit to this file by Stefan Kost mentionned checking for + SED, but NOT checking for gtkdoc-check (wth is that doing there ??). + Therefore, removing the check for gtkdoc-check + +2008-03-03 David Schleef + + * m4/ax_create_stdint_h.m4: Oops, checked in the wrong copy of + this file. (Update from upstream) + +2008-03-03 David Schleef + + * m4/ax_create_stdint_h.m4: Update from upstream. Fixes a bug + compiling with MSVC. + +2008-03-03 Edward Hervey + + * m4/pkg.m4: + Allow override of pkg-config results, as proposed by configure --help. + This is in fact just a backport from upstream pkg.m4. + Fixes #518892 + +2008-03-03 Peter Kjellerstedt + + * ChangeLog: + Changelog surgery of my previous commit to add bugzilla reference. + * m4/gst-args.m4: + Add AG_GST_CHECK_PLUGIN and AG_GST_DISABLE_PLUGIN to make it easier + to include and exclude plug-ins without external references, i.e., + plug-ins listed in GST_PLUGINS_SELECTED. (#498222) + +2008-03-03 Sebastian Dröge + + * gst.supp: + Add another glibc suppression. + +2008-02-29 Peter Kjellerstedt + + * m4/gst-feature.m4: + Make the comment before defines generated via AG_GST_CHECK_FEATURE + look nicer. (#498222) + +2008-02-26 Jan Schmidt + + * m4/Makefile.am: + * m4/as-gcc-inline-assembly.m4: + Add Dave Schleef's GCC inline assembly detection macro + for using in gst-plugins-good in the goom 2k4 plugin. + +2008-02-25 Andy Wingo + + * gst-autogen.sh: Instead of only passing certain arguments to + configure, pass anything that we didn't handle. Much friendlier. + Fixes #34412. + +2008-02-23 Jan Schmidt + + * m4/gst-error.m4: + Store the detected compiler flags into ERROR_CFLAGS rather than + ERROR_CXXFLAGS, and use the macro that checks the C compiler, not + the C++ one. + +2008-02-23 Tim-Philipp Müller + + * m4/gst-error.m4: + Reflow checks for additional warning flags so they're not + nested, which fixes the result reporting in the configure + output. + +2008-02-22 Tim-Philipp Müller + + * m4/as-compiler-flag.m4: + Add AS_CXX_COMPILER_FLAG + + * m4/gst-error.m4: + Add AG_GST_SET_ERROR_CXXFLAGS (Forte bits need testing) + +2008-02-22 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Add 'check-inspected-versions' target; this helps identify + files that should have been removed or where the version + number should (ideally) be updated before a release + (which doesn't happen automatically if the releaser doesn't + build that plugin locally). Not adding at a distcheck hook + yet though, because it's not really that important and would + probably also be a problem on buildbots. + +2008-02-22 Sebastian Dröge + + * gst.supp: + Add even more glibc 2.7 suppressions. + +2008-02-22 Sebastian Dröge + + * gst.supp: + Add another suppression for GLib caching some values after + the first call. + +2008-02-12 Sebastian Dröge + + Patch by: + Tim Mooney + + * m4/gst-error.m4: + Use no%E_MACRO_REDEFINED on Solaris to prevent compiler warnings. + Fixes bug #515905. + +2008-02-11 Sebastian Dröge + + * gst.supp: + Add a few more glibc 2.7 suppressions to make the avisubtitle unit + test valgrind clean. Fixes bug #515703. + +2008-02-08 Stefan Kost + + * ChangeLog: + Changelog surgery for last commit. + +2008-02-08 Stefan Kost + + * m4/gtk-doc.m4: + Conditionally check for SED. Also sync a bit with upstream macro. + +2008-02-08 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + Use '$(SED)' instead of 'sed'. Don't use -i for in-place as its gnu + only, move to a temp file instead. + +2008-02-06 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + As our docs are versioned, we need to patch the index.sgml file to have + correct paths there, unless we also want to fork gtk-doc's xsl (which + we don't). This hopefully fixes xrefs between modules. + +2008-02-02 Sebastian Dröge + + * m4/gst-feature.m4: + Use printf instead of echo as "echo -e" isn't POSIX and doesn't work + with strict POSIX shells like tcsh or dash and also not every platform + has a /bin/echo that supports it. + +2008-01-24 Stefan Kost + + * ChangeLog: + ChangeLog surgery. + + * gstdoc-scangobj: + Sync the object scanner with gtk-doc fixes. Update args and hierarchy + files. + +2008-01-20 Sebastian Dröge + + * check.mak: + * coverage/lcov.mak: + * gtk-doc-plugins.mak: + * release.mak: + Use $(MAKE) instead of make to fix the build if GNU make is called + something else on the system. + + * m4/as-docbook.m4: + Fix path for docbook.xsl if we have no /etc/xml/catalog and add a + docbook-xsl search path for FreeBSD. + +2008-01-18 Sebastian Dröge + + * gst.supp: + Add a suppression for a glibc bug: + http://valgrind.org/docs/manual/faq.html#faq.exit_errors> + +2008-01-18 Sebastian Dröge + + * gst.supp: + Add some more glibc 2.7 suppressions and make the GLib suppressions + for the home/tmp/etc directory caching a bit more generic. + +2008-01-18 Sebastian Dröge + + * gst.supp: + Add some glibc 2.7 supressions as found on Debian/unstable. + +2008-01-14 Jan Schmidt + + * download-translations: + Apparently I have problems with leaving things commented out when + I edit shell scripts. + +2008-01-12 Jan Schmidt + + * download-translations: + Remove bash-isms + +2008-01-12 Jan Schmidt + + * check-exports: + Restore the cleanup rm of our tmp file which I didn't mean to leave + commented out. + +2008-01-12 Jan Schmidt + + * check-exports: + Fixes to make check-export work on both Solaris and Linux + + * m4/gst-error.m4: + Disable extra warning category (argument mismatch) as an error + on Forte, as it prevents the libcheck fail_if macros from compiling. + + * win32.mak: + Substitute the GStreamer version so things will keep working in 0.11 + +2008-01-11 Tim-Philipp Müller + + Patch by: Peter Kjellerstedt + + * m4/gst-glib2.m4: + * m4/gst-libxml2.m4: + Improve/fix output from configure if either glib-2.0 or + libxml2 are not installed (#498222). + +2008-01-09 Stefan Kost + + * coverage/lcov.mak: + Update coverage make-rules: use them conditionaly, use libtool mode + and use lcov to cleanup. + +2007-12-18 Sebastian Dröge + + * glib-gen.mak: + Also use #include "header" instead of #include
for the + headers that were used to generate the source files for the same + reason as below. + + Remove whitespace before #include. + +2007-12-18 Sebastian Dröge + + * glib-gen.mak: + Use #include "header" instead of #include
for the generated + enum C files as the file will always be in the same directory and + some compilers seem to be a bit strict about that unless . is added + to the include path. + + Include all headers that were used to generate the source files in + the C file as they're used there. + +2007-12-17 Tim-Philipp Müller + + * win32.mak: (win32), (win32defs), (win32crlf): + Make check for CR LF in Visual C++ 6.0 project files + work, based on patch by David Schleef (#496722, #393626). + +2007-12-17 Tim-Philipp Müller + + * Makefile.am: + Don't forget to dist the new win32.mak. + +2007-12-17 Tim-Philipp Müller + + * win32.mak: (win32), (win32defs): + Move common win32 Makefile foo into this new file. + +2007-12-15 Stefan Kost + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + We should have never forked this that much :/. + +2007-12-13 Tim-Philipp Müller + + * check-exports: + Fix build on the ppc64 build bot. + +2007-12-13 Tim-Philipp Müller + + * check-exports: + Suppress more unintentional exports (too much hassle to rename them, + since the win32 project files would need changing too). + +2007-12-12 Tim-Philipp Müller + + * Makefile.am: + check-exports should be disted. + +2007-12-12 Tim-Philipp Müller + + * check-exports: + Add quick'n'dirty script to check the exported symbols of a library + against the symbols in the corresponding .def file (#493983). Based + on script by Ole André Vadla Ravnås. + +2007-11-06 Jan Schmidt + + * gtk-doc-plugins.mak: + Fix distcheck by making sure the types files are treated like the + other gtkdoc-scangobj generated files. + +2007-09-21 Sebastian Dröge + + * m4/gst-args.m4: + Let the AG_GST_ARG_ENABLE_EXPERIMENTAL macro default to disable + building of experimental plugins. Nobody uses it yet and the + --enable--experimental stuff from gst-plugins-good defaults to + disable too. + +2007-09-06 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Just use the normal 'check' target and avoid a circular + dependency. + +2007-09-06 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Add rule to error out if .hierarchy file contains tabs. + +2007-08-20 Tim-Philipp Müller + + * download-translations: + * po.mak: + If there are new languages, they need to be added to po/LINGUAS. + +2007-08-20 Tim-Philipp Müller + + * download-translations: + * po.mak: + Fix up 'download-po' a bit, so that we find new translations + for languages that aren't in our po/LINGUAS file yet too. + +2007-07-16 Jan Schmidt + + * gst.supp: + Add a suppression for GLib caching the tmp dir seen on an + Ubuntu Feisty system. + +2007-07-13 Jan Schmidt + + * m4/gst-feature.m4: + If we want to use 'echo -e', call /bin/echo instead of the shell's + since -e is a bash extension, and our /bin/sh might not be being + provided by bash. + +2007-07-01 Thomas Vander Stichele + + * po.mak: + Translation project has moved. Also, no idea how this used to + work given that we weren't downloading a .po file. + +2007-06-25 Stefan Kost + + * gst-xmlinspect.py: + * plugins.xsl: + Also extract element caps for plugin-docs. Fixes parts of #117692. + +2007-06-21 Tim-Philipp Müller + + Patch by: Andreas Schwab + + * m4/gst-feature.m4: + Fix quoting (#449493). + +2007-06-10 Sebastian Dröge + + * m4/gst-parser.m4: + Only generate the parser if bison >= 1.875 _and_ flex >= 2.5.31 is + installed and use pre-generated sources otherwise. Fixes bug #444820. + +2007-05-11 Michael Smith + + * gst.supp: + Suppression variant for our good friend the TLS leak, this time for + Ubuntu Feisty/x86. + +2007-05-09 Tim-Philipp Müller + + * gtk-doc-plugins.mak: + Fix make distcheck again; change some spaces to tabs in makefile. + +2007-04-29 Thomas Vander Stichele + + * gtk-doc-plugins.mak (-module): + Error out when the html build step gives warnings, so they get + fixed properly. + +2007-04-23 Stefan Kost + + * m4/gst-feature.m4: + Add macro AG_GST_PARSE_SUBSYSTEM_DISABLES that checks the defines in + the configuration header and AC_DEFINES the setings. + +2007-04-19 Sebastian Dröge + + Patch by: Vincent Torri + + * m4/gst-parser.m4: + Put the AC_MSG_RESULT output in brackets to get it properly written to + the terminal. + +2007-04-18 Sebastian Dröge + + * m4/gst-parser.m4: + Check for flex >= 2.5.31 and set GENERATE_PARSER if we have at least + that version. Otherwise use pre-generated parser sources as we can't + raise the required flex version. HAVE_MT_SAVE_FLEX is obsolete now + as we use a new enough flex version anyway. First part of #349180 + +2007-04-10 Thomas Vander Stichele + + * m4/gst-check.m4: + Allow pre-setting the GST(PB)_TOOLS/PLUGINS_DIR variables to help + builds against older GStreamer. + +2007-03-25 Sebastian Dröge + + * m4/gst-parser.m4: + Fix the flex version check. It ignored the micro version before. + +2007-03-09 Jan Schmidt + + * check.mak: + Use the same timeout when generating valgrind suppressions as + running the valgrind test. + + * gst.supp: + Add some more suppressions and stuff. + +2007-03-08 Jan Schmidt + + * check.mak: + Make sure GSlice is disabled when building suppressions too. + + * gst.supp: + Add around *850* lines of suppressions for one-time initialisations + inside libasound and gconf/bonobo/ORBit. I feel so dirty. + +2007-03-07 Jan Schmidt + + * gst.supp: + add a suppression for this GConf flup on the FC5 buildbot. + +2007-03-06 Jan Schmidt + + * gst.supp: + Make the suppression a little more generic, to catch the FC5 + backtrace too. + +2007-03-06 Jan Schmidt + + * gst.supp: + Add a suppression for libcdio 0.76. It leaks an internal struct + when the CD-ROM device is not accessible. + +2007-02-28 Thomas Vander Stichele + + * m4/gst-arch.m4: + Move a line that was in the wrong macro + +2007-02-28 Thomas Vander Stichele + + * m4/gst.m4: + Add + * m4/gst-arch.m4: + * m4/gst-args.m4: + * m4/gst-check.m4: + * m4/gst-debuginfo.m4: + * m4/gst-default.m4: + * m4/gst-doc.m4: + * m4/gst-error.m4: + * m4/gst-feature.m4: + * m4/gst-function.m4: + * m4/gst-gettext.m4: + * m4/gst-glib2.m4: + * m4/gst-libxml2.m4: + * m4/gst-parser.m4: + * m4/gst-plugin-docs.m4: + * m4/gst-plugindir.m4: + * m4/gst-valgrind.m4: + * m4/gst-x11.m4: + Convert all macros to use AG_GST style so we can properly warn + when they're missing if configure.ac calls AG_GST_INIT + Will require update in all GStreamer modules. + +2007-02-11 Stefan Kost + + * m4/gst-args.m4: + Remove 'enable' from configure switch description as this leads to + confusing lines like "disable enable builing ...". + * m4/gst-feature.m4: + Fix comment to sound less horrible. + +2007-02-07 Tim-Philipp Müller + + Patch by: Will Newton + + * m4/gst-check.m4: + Use $PKG_CONFIG rather than pkg-config directly, the one in our path + might not be the one we want, like when cross-compiling. Also, other + macros such as PKG_CHECK_MODULES use $PKG_CONFIG, so we should + probably too just for consistency. Fixes #405288. + +2007-01-08 Tim-Philipp Müller + + * m4/gst-parser.m4: + Need to use double square brackets again so m4 doesn't remove them + (fixes #378931). + + * m4/gst-args.m4: + Use double square brackets here as well, for the same reason. + +2007-01-05 Tim-Philipp Müller + + * m4/gst-parser.m4: + Use 'sed' rather than 'tr' to strip trailing letters from version + numbers, since 'tr' might not be available and we know sed is + (#378931). + +2006-10-21 Tim-Philipp Müller + + * check.mak: + Increase default timeout under valgrind, 60 is just too short and + some tests take a bit longer these days and not everyone has a + beefy machine. + +2006-09-29 Michael Smith + + * gst.supp: + More suppressions for edgy. + +2006-09-28 Jan Schmidt + + * m4/gst-glib2.m4: + Use gmodule-no-export-2.0.pc instead of gmodule-2.0.pc - we neither + want nor need --export-dynamic (which ends up making us export a bunch + of unneeded symbols) + +2006-09-14 Tim-Philipp Müller + + * gst.supp: + Some suppressions for the more recent ld.so in ubuntu edgy. + +2006-08-23 Tim-Philipp Müller + + * gst.supp: + Shorten function trail so the suppression works on + my ubuntu dapper system with core cvs as well. + +2006-07-28 Jan Schmidt + + * gst.supp: + Extra suppressions from my Ubuntu x86_64 machine + +2006-07-24 Tim-Philipp Müller + + Patch by: Frederic Peters + + * m4/gst-parser.m4: + Need to double square brackets in .m4 files. Should fix bison + version detection with version numbers like 1.23a (#348354). + +2006-07-24 Jan Schmidt + + * check.mak: + Valgrind fails to find tests written in tests/check/ directly (rather + than a subdir) - because valgrind gets run with a filename that + doesn't contain a relative path, it goes searching /usr/bin instead. + Run with ./.... to make things work either way. + + * gtk-doc-plugins.mak: + Add $(top_builddir)/src as a place to look for plugins + when building too, since that's where gst-template keeps things + +2006-07-23 Stefan Kost + + Patch by: Frederic Peters + + * m4/gst-parser.m4: + Fix bison detection (#348354) + +2006-07-21 Stefan Kost + + * m4/gst-parser.m4: + check for bison and flex + +2006-07-13 Thomas Vander Stichele + + * m4/gst-plugin-docs.m4: + remove the configure argument for enabling plugin doc build; + having gtk-doc enabled and pyxml present is enough of a trigger + +2006-07-03 Thomas Vander Stichele + + * coverage/lcov.mak: + fix up rules to work with gst-python as well + run "make lcov" to test and generate the reports + run "make lcov-reset" to redo it after that + +2006-07-02 Thomas Vander Stichele + + * Makefile.am: + * check.mak: + add an inspect target that inspects every element feature, + so we can have that added for coverage + * coverage/lcov.mak: + add support for lcov + +2006-07-02 Thomas Vander Stichele + + * m4/gst-args.m4: + when building with gcov, reset CFLAGS and friends to O0 + +2006-07-02 Thomas Vander Stichele + + * m4/gst-args.m4: + Find the gcov that matches the gcc version + Only allow gcov if we use gcc + +2006-07-02 Thomas Vander Stichele + + * Makefile.am: + * coverage/coverage-report-entry.pl: + * coverage/coverage-report.pl: + * coverage/coverage-report.xsl: + copy coverage reporting files from dbus + +2006-07-01 Thomas Vander Stichele + + * m4/gst-args.m4: + libtool strips gcov's -f flags, so libgcov does not get + linked in. Setting GCOV_LIBS with -lgcov fixes libtool's + stripping + also show what pkg-config-path we set + +2006-06-22 Tim-Philipp Müller + + Patch by: Peter Kjellerstedt + + * m4/gst-feature.m4: + Show list of plugins without external dependencies that + will not be built as well (#344136). + +2006-06-15 Tim-Philipp Müller + + * m4/gst-plugin-docs.m4: + add GST_PLUGIN_DOCS, which checks for everything needed + to build the plugin docs (namely gtk-doc and pyxml); also + adds a new --enable-plugin-docs configure switch; will + set ENABLE_PLUGIN_DOCS conditional for use in Makefile.am + files (see #344039). + +2006-06-11 Thomas Vander Stichele + + * m4/gst-check.m4: + add GST_PKG_CHECK_MODULES, which in the normal case of checking + for a dependency lib for a plug-in only needs two arguments + to do the right thing. + * m4/gst-feature.m4: + clean up output a little of feature checking; also deal with + non-plug-in feature checks + * m4/Makefile.am: + * m4/gst-gstreamer.m4: + remove this file; it's a useless check + +2006-06-06 Thomas Vander Stichele + + * m4/gst-arch.m4: + add PPC64 so we can have separate structure sizes for it + +2006-06-05 Edward Hervey + + * gtk-doc.mak: + Check for the proper .devhelp2 file to remove. + +2006-05-31 Thomas Vander Stichele + + * gtk-doc.mak: + allow a magic variable to suppress errors from docbuilding + +2006-05-30 Thomas Vander Stichele + + * gtk-doc.mak: + error out if gtkdoc-mktmpl finds unused declarations + +2006-05-28 Edward Hervey + + * gst.supp: + Reverting previous commit. That's good to know, Edward, but why ? + +2006-05-28 Edward Hervey + + * gst.supp: + Added suppresion for memleak in g_option_context_parse on fc5-64 + +2006-05-19 Thomas Vander Stichele + + * m4/gst-check.m4: + set GSTPB_PLUGINS_DIR just like GST_PLUGINS_DIR + +2006-05-18 Tim-Philipp Müller + + * check.mak: + Fix 'make help' in check directories, it should be + 'valgrind.gen-suppressions' not 'valgrind-gen-suppressions' + (not changing target to match help string on purpose to keep + scripts etc. functional). + +2006-05-18 Thomas Vander Stichele + + Patch by: Peter Kjellerstedt + + * m4/gst-arch.m4: + add support for CRIS and CRISv32. + +2006-05-17 Jan Schmidt + + * m4/gst-args.m4: + Fix the macros for command-line supplied package and origin names + so they don't end up being configure as "" (Fixes #341479) + +2006-05-14 Jan Schmidt + + * gtk-doc.mak: + Add uninstall rule to remove .devhelp2 files. + +2006-05-09 Edward Hervey + + * gst.supp: + Add suppression for GSlice version of + g_type_init calloc leak + +2006-04-05 Michael Smith + + * gst.supp: + Delete a bogus suppression for the registry code. + Generalise a suppression for a glib bug (see #337404) + +2006-04-04 Michael Smith + + * gst.supp: + Add a leak suppression: the existing glibc-doesn't-free-TLS one + wasn't triggering here. + +2006-04-04 Michael Smith + + * gst.supp: + Add some minimally-neccesary suppressions for my x86/dapper system. + +2006-04-01 Thomas Vander Stichele + + * plugins.xsl: + Do not display an origin link if origin does not start with http + See #323798 + +2006-04-01 Thomas Vander Stichele + + * m4/gst-args.m4: + * m4/gst-feature.m4: + add more macros + * m4/gst-x11.m4: + X11-related checks + +2006-04-01 Thomas Vander Stichele + + * m4/as-version.m4: + newer version + * m4/gst-args.m4: + * m4/gst-doc.m4: + update and add other macros to be shared across projects + +2006-03-24 Thomas Vander Stichele + + * gst.supp: + add a suppression for g_parse_debug_string + +2006-03-23 Stefan Kost + + * gstdoc-scangobj: + sync fully with gtkdoc-0.15 + +2006-03-23 Stefan Kost + + * gstdoc-scangobj: + * gtk-doc.mak: + sync a little with gtk-doc mainline + +2006-03-17 Wim Taymans + + * gst.supp: + add another clone suppression + change all glibc suppressions to match 2.3.* + +2006-03-09 Thomas Vander Stichele + + * m4/check.m4: + fix test so it actually works when the normal check is used + over debian's/ubuntu's + +2006-03-08 Jan Schmidt + + * check.mak: + Set G_SLICE=always-malloc when valgrinding tests + (closes #333272) + +2006-02-21 Jan Schmidt + + * m4/gst-glib2.m4: + Fix debug output when the GLib version prerequisite is not found + +2006-02-13 Andy Wingo + + * m4/check.m4: Hack around Debian/Ubuntu's broken installation of + the PIC version of check as libcheck_pic.a. Should work with + cross-compilation too. Grr. + +2006-02-06 Thomas Vander Stichele + + * m4/gst-default.m4: + switch to auto* sinks for defaults + +2006-02-02 Wim Taymans + + * check.mak: + add a .valgrind.gen-suppressions target to aid in generating + suppressions + * gst.supp: + add more repressions from my debian glibc as of today + +2006-02-02 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + only add srcdir/gst if it exists + +2006-01-30 Thomas Vander Stichele + + * release.mak: + don't complain about disted enums in win32 + +2006-01-20 Thomas Vander Stichele + + * m4/gst-check.m4: + AC_SUBST CFLAGS and LIBS + do a non-command because something is stripping out our AC_SUBST + +2006-01-20 Thomas Vander Stichele + + * m4/gst-args.m4: + * m4/gst-valgrind.m4: + properly give a "no" result manually when providing a + not-found action to fix configure output + +2006-01-20 Thomas Vander Stichele + + * m4/pkg.m4: + update with a more recent version + +2006-01-07 Thomas Vander Stichele + + * gettext.patch: + make Makefile depend on LINGUAS, so rebuilds work when adding + a language + +2006-01-03 Michael Smith + + * check.mak: + Clarify error message from valgrind test runs. + +2005-12-16 Thomas Vander Stichele + + * m4/gst-arch.m4: + define HOST_CPU + +2005-11-29 Thomas Vander Stichele + + * check.mak: + add a valgrind-forever target for tests + +2005-11-28 Thomas Vander Stichele + + * check.mak: + when a "make test.check" run fails, make it rerun the test with + at least debug level 2 + +2005-11-14 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-check.m4: + fix check for base plugins + * m4/gst-default.m4: + add m4 to set default elements + +2005-10-18 Thomas Vander Stichele + + * m4/gst-check.m4: + check for tools correctly + +2005-10-18 Thomas Vander Stichele + + * gtk-doc.mak: + only enable breaking on new API when make distcheck passes, + not before + +2005-10-18 Thomas Vander Stichele + + * m4/gst-check.m4: + Resurrect Julien's dead body and wipe his mind clean + +2005-10-18 Thomas Vander Stichele + + * m4/gst-check.m4: + Kill Julien + +2005-10-17 Julien MOUTTE + + * m4/gst-check.m4: I know Thomas will kill me but this + ifelse statement seems incorrect as it is always setting + required to "yes". With this one it seems to work. Fixes + build of gst-plugins-base on my setup where gstreamer-check + is definitely not present/required. + +2005-10-18 Stefan Kost + + * gtk-doc.mak: + make build break on new api that has not been added to the + sections file + +2005-10-17 Thomas Vander Stichele + + * m4/gst-glib2.m4: + * m4/Makefile.am: + * m4/gst-check.m4: + add macro for easy checks for GStreamer libs + +2005-10-16 Thomas Vander Stichele + + * m4/gst-glib2.m4: + update, warn in error cases + +2005-10-16 Thomas Vander Stichele + + * m4/gst-error.m4: + add GST_SET_DEFAULT_LEVEL + +2005-10-16 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-gettext.m4: + remove the AM_GNU_GETTEXT* calls, they need to be in configure.ac + * m4/gst-glib2.m4: + clean up and re-use in core soon + * m4/gst-plugindir.m4: + macro to set up PLUGINDIR and plugindir define/var + +2005-10-15 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-gettext.m4: + add macro for setting up gettext + +2005-10-15 Thomas Vander Stichele + + * m4/gst-args.m4: + add some .m4's for argument checking that can be shared among modules + +2005-10-15 Thomas Vander Stichele + + * m4/as-libtool.m4: + set _LT_LDFLAGS + * m4/gst-libxml2.m4: + document + +2005-10-15 Thomas Vander Stichele + + * m4/gst-arch.m4: + indent a little + add AC_REQUIRE + * m4/gst-error.m4: + clean up + +2005-10-12 Thomas Vander Stichele + + * gst-autogen.sh: + update version detection expression to catch stuff like + Libtool (libtool15) 1.5.0 + +2005-10-11 Thomas Vander Stichele + + * gst.supp: + commit 6 new suppressions related to g_module_open; can these + really not be folded into one ? + +2005-10-11 Edward Hervey + + * gst.supp: + made the suppression more generic + Added pthread memleak suppresions + Added nss_parse_* memleak suppresion (used by g_option_context_parse) + +2005-10-11 Thomas Vander Stichele + + * check.mak: + be more strict, more leak resolution + * gst.supp: + clean up the g_type_init suppressions + +2005-10-07 Thomas Vander Stichele + + * m4/Makefile.am: + * m4/gst-valgrind.m4: + put the valgrind detection in an .m4 + +2005-09-29 Thomas Vander Stichele + + * check.mak: + add some more targets, like "help", but also more intensive tests + +2005-09-23 Thomas Vander Stichele + + * gtk-doc.mak: + make certain doc warnings fatal so people maintain docs again + +2005-09-23 Thomas Vander Stichele + + * Makefile.am: + * gtk-doc-plugins.mak: + * scangobj-merge.py: + merge additions from the .signals.new and .args.new file in + the original ones, only updating if necessary + +2005-09-23 Thomas Vander Stichele + + * gst-xmlinspect.py: + * gstdoc-scangobj: + * gtk-doc-plugins.mak: + fix properly for new API; make update in plugins dir now works + +2005-09-20 Thomas Vander Stichele + + * gst-xmlinspect.py: + * gstdoc-scangobj: + some fixes for new API + * gtk-doc-plugins.mak: + set environment properly + +2005-09-17 David Schleef + + * gtk-doc-plugins.mak: Use new environment variables. + +2005-09-16 Michael Smith + + * gstdoc-scangobj: + Make the scanobj code reflect registry/plugin API changes + +2005-09-15 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + split out scanobj step (which will be run by doc maintainer) + from scan step (which will be run on every build) + clean up some of the commands for make distcheck + +2005-09-15 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + * mangle-tmpl.py: + first stab at reorganizing the plugins build so we can maintain + element docs + +2005-09-14 David Schleef + + * as-libtool.mak: Remove + * m4/as-libtool.m4: The libtool bug that this worked around has + been fixed. + * m4/as-version.m4: Don't define GST_RELEASE, since it causes + config.h to be regenerated needlessly, and we don't use it. + +2005-09-14 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + error out on inspect failure + +2005-09-14 Michael Smith + + * glib-gen.mak: + Don't call glib-mkenums with arguments that confuse/break MinGW, + fixes 316155. + +2005-09-03 Thomas Vander Stichele + + * gtk-doc-plugins.mak: + * gtk-doc.mak: + * m4/gst-doc.m4: + separate out gtk-doc and docbook stuff + have two separate --enable configure flags + +2005-08-26 Thomas Vander Stichele + + * check.mak: + add a .gdb target; rebuild registry for each target, otherwise + a code rebuild always triggers a reg rebuild, and it's just too + annoying + * gstdoc-scangobj: + +2005-08-21 Thomas Vander Stichele + + * check.mak: + separate out REGISTRY_ENVIRONMENT; we want to use that from + our valgrind runs, but we also want TESTS_ENVIRONMENT to contain + everything that the first test, gst-register, needs + +2005-08-21 Thomas Vander Stichele + + * check.mak: + parse output of valgrind and check for definitely lost, and error + out; somehow I was led to believe valgrind returns non-zero for + leaks, but I can't make it do that, so let's parse + +2005-08-20 Thomas Vander Stichele + + * check.mak: + for some weird reason valgrind does not report actual memleaks + if GST_PLUGIN_PATH is set to anything but the core gstreamer dir + while valgrind is running. Since the registry is going to go + anyway, I don't want to waste any more time on this; I just run + valgrind without GST_PLUGIN_PATH set. Since the registry loading + doesn't check if GST_PLUGIN_PATH got changed as a reason to rebuild + the registry, that's actually fine. + +2005-08-15 Thomas Vander Stichele + + * mangle-tmpl.py: + keep original Long_Description; only insert an include if it's + not already the first line in there + * plugins.xsl: + output more information for plugins, including an origin hyperlink + +2005-08-15 Thomas Vander Stichele + + * gst-xmlinspect.py: + a first stab at inspecting plugins and outputting an xml description + * gtk-doc-plugins.mak: + a gtk-doc using snippet for plugins documentation + * plugins.xsl: + a stylesheet to convert gst-xmlinspect.py output to docbook output + for inclusion in the gtk-doc stuff + +2005-07-20 Ronald S. Bultje + + * m4/gst-doc.m4: + s/pdf/eps/ in test for whether we output EPS images (#309379). + +2005-07-18 Andy Wingo + + * m4/as-libtool-tags.m4: Ooh, backported from libtool 1.6. Much + better. Thanks, Paolo Bonzini! + + * m4/Makefile.am (EXTRA_DIST): + * m4/as-libtool-tags.m4: New file, tries to disable some CXX and + fortran checks. + +2005-07-08 Thomas Vander Stichele + + * m4/gst-error.m4: + add macro to set ERROR_CFLAGS + +2005-06-30 Jan Schmidt + + * gst-autogen.sh: + Remove the old autoregen.sh if it exists before recreating it, + to prevent confusing any shell process that might be reading it + currently. + +2005-06-29 Thomas Vander Stichele + + * m4/gtk-doc.m4: + added + +2005-06-03 Stefan Kost + + * gst-autogen.sh: create autoregen.sh *before* shifting the options + +2005-05-17 Thomas Vander Stichele + + * gst-autogen.sh: only update autoregen.sh on actual runs + +2005-03-11 Thomas Vander Stichele + + * m4/check.m4: m4 from the check unit test suite + +2004-12-14 David Schleef + + * m4/gst-arch.m4: remove MMX stuff, since it doesn't work and + isn't needed anywhere + +2004-12-08 Thomas Vander Stichele + + * gst-autogen.sh: + allow failure command to be run so we can clean upfrom autopoint + +2004-09-03 Zeeshan Ali Khattak + * m4/gst-feature.m4: Trying to correct the GST_CHECK_CONFIGPROG macro + +2004-07-21 Benjamin Otte + + * m4/.cvsignore: exciting updates for libtool m4 files + +2004-07-12 David Schleef + + * m4/as-objc.m4: Add a macro to test for objective C + +2004-06-12 Thomas Vander Stichele + + * m4/gst-feature.m4: + not all of them support --plugin-libs, so redirect stderr + +2004-06-12 Thomas Vander Stichele + + * m4/as-scrub-include.m4: + sync with upstream to 0.1.4. Fixes #132440 + +2004-06-07 Benjamin Otte + + * m4/gst-feature.m4: + write a big marker into configure output when checking next plugin + to allow easier parsing of why plugins are(n't) built. + +2004-06-01 Thomas Vander Stichele + + * m4/as-compiler-flag.m4: + * m4/as-compiler.m4: + * m4/as-libtool.m4: + * m4/as-version.m4: + sync with upstream, change sticky options to -ko + +2004-05-24 Thomas Vander Stichele + + * m4/as-scrub-include.m4: synced with upstream + +2004-05-03 Thomas Vander Stichele + + * po.mak: + snippet for updating .po files + +2004-03-18 Thomas Vander Stichele + + * Makefile.am: + * m4/Makefile.am: + integrate these with the dist + +2004-03-17 Thomas Vander Stichele + + * release.mak: add a release target + +2004-03-09 Thomas Vander Stichele + + patch by: Stephane Loeuillet + + * m4/ax_create_stdint_h.m4: + use head -n instead of head - (#136500) + +2004-03-05 Thomas Vander Stichele + + * m4/gst-doc.m4: don't build PS without dvips binary + +2004-02-22 Julio M. Merino Vidal + + reviewed by: Benjamin Otte + + * m4/as-docbook.m4: + don't use == operator with test(1) (fixes #135115) + +2004-02-16 Thomas Vander Stichele + + * common/m4/gst-arch.m4: x86_64 is x86 too (clue from Fedora 2 test) + +2004-02-13 Thomas Vander Stichele + + * m4/gst-feature.m4: + remove AM_CONDITIONAL for the subsystem since automake 1.6.x + requires that call be in configure.ac + +2004-02-13 Thomas Vander Stichele + + * m4/gst-libxml2.m4: + take required version as argument, and default to 2.4.9 if not + specified + +2004-02-12 Thomas Vander Stichele + + * m4/gst-feature.m4: + rename and fix up GST_CHECK_DISABLE_SUBSYSTEM + +2004-02-11 Thomas Vander Stichele + + * common/m4/as-ac-expand.m4: + * common/m4/as-auto-alt.m4: + * common/m4/as-compiler-flag.m4: + * common/m4/as-compiler.m4: + * common/m4/as-docbook.m4: + * common/m4/as-libtool.m4: + * common/m4/as-scrub-include.m4: + * common/m4/as-version.m4: + * common/m4/glib-gettext.m4: + * common/m4/gst-arch.m4: + * common/m4/gst-debuginfo.m4: + * common/m4/gst-doc.m4: + * common/m4/gst-feature.m4: + * common/m4/gst-function.m4: + * common/m4/gst-glib2.m4: + * common/m4/gst-gstreamer.m4: + * common/m4/gst-libxml2.m4: + * common/m4/gst-makecontext.m4: + * common/m4/gst-mcsc.m4: + * common/m4/pkg.m4: + fix underquoted macros as reported by automake 1.8.x (#133800) + +2004-02-11 Johan Dahlin + + * gst-autogen.sh: Use A-Z instead of A-z in sed expression to + avoid a warning + +2004-02-05 Thomas Vander Stichele + + * m4/gst-doc.m4: + we use --output-format=xml and --ingnore-files options to + gtkdoc-mkdb, which got added between 0.9 and 1.0 + +2004-02-04 Thomas Vander Stichele + + * m4/as-libtool.m4: remove AM_PROG_LIBTOOL so it can move back + to configure.ac to shut up libtoolize + +2004-02-03 Thomas Vander Stichele + + * glib-gen.mak: added; used to generate enums and marshal code + +2004-01-13 Thomas Vander Stichele + + * gettext.patch: added; used by autogen.sh to make sure + GETTEXT_PACKAGE is understood from po/Makefile.in.in -> po/Makefile.in + diff --git a/mobile/common/Makefile.am b/mobile/common/Makefile.am new file mode 100644 index 0000000..cac4ff5 --- /dev/null +++ b/mobile/common/Makefile.am @@ -0,0 +1,16 @@ +SUBDIRS = m4 + +EXTRA_DIST = \ + ChangeLog \ + gettext.patch \ + glib-gen.mak gtk-doc.mak upload.mak release.mak win32.mak \ + gst-autogen.sh \ + check-exports \ + c-to-xml.py gst-xmlinspect.py mangle-tmpl.py scangobj-merge.py \ + gtk-doc-plugins.mak \ + plugins.xsl gstdoc-scangobj \ + gst.supp check.mak \ + coverage/lcov.mak \ + coverage/coverage-report.pl \ + coverage/coverage-report.xsl \ + coverage/coverage-report-entry.pl diff --git a/mobile/common/c-to-xml.py b/mobile/common/c-to-xml.py new file mode 100755 index 0000000..8448fd2 --- /dev/null +++ b/mobile/common/c-to-xml.py @@ -0,0 +1,34 @@ +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +Convert a C program to valid XML to be included in docbook +""" + +import sys +import os +from xml.sax import saxutils + +def main(): + if len(sys.argv) == 1: + sys.stderr.write("Please specify a source file to convert") + sys.exit(1) + source = sys.argv[1] + + if not os.path.exists(source): + sys.stderr.write("%s does not exist.\n" % source) + sys.exit(1) + + content = open(source, "r").read() + + # print header + print '' + print '' + print + print '' + + # print content + print saxutils.escape(content).encode('UTF-8') + print '' + +main() diff --git a/mobile/common/check-exports b/mobile/common/check-exports new file mode 100755 index 0000000..16df41f --- /dev/null +++ b/mobile/common/check-exports @@ -0,0 +1,71 @@ +#!/bin/sh +# check-exports +# +# quick'n'dirty script that retrieves the list of exported symbols of a given +# library using 'nm', and compares that against the list of symbols-to-export +# of our win32/common/libfoo.def files. + +if [ $# -ne 2 ]; then + echo "Usage: $0 library.def library.so" + exit 1 +fi + +def_path="$1" +def_name="$(basename $def_path)" +lib_path="$2" + +lib_result="`mktemp /tmp/defname.XXXXXX`" + +LC_ALL=C +export LC_ALL + +# On Solaris, add -p to get the correct output format +NMARGS= +if nm -V 2>&1 |grep Solaris > /dev/null; then + NMARGS=-p +fi + +# FIXME 0.11: in 0.11, we should change the export filter to only export +# _gst_foo, but not __gst_foo (we can't change this now, since we added +# __gst_debug_min and __gst_debug_enabled at some point and need to keep +# ABI compatibility). So below we special-case some symbols that shouldn't +# really be exported, either because we're too lazy to rename them to something +# that's not exported (like the _gst_parse_* stuff) or because we had them in +# public headers at some point although they shouldn't be and so we need to +# keep them exported now (like _gst_debug_init, +# __gst_element_factory_add_interface or +# __gst_element_factory_add_static_pad_template). We suppress them here to +# make sure they're at least not exported in the windows msvc build (they +# were never in the .def file, so they never got exported). +# _end is special cased because for some reason it is reported as an exported +# BSS symbol, unlike on linux where it's a local absolute symbol. +nm $NMARGS $lib_path | awk \ + '{ + if ($3 !~ /^_gst_parse_yy/ && \ + $3 !~ /^_gst_[a-z]*_init/ && \ + $3 !~ /^_gst_parse_launch/ && \ + $3 !~ /^__gst_element_details_/ && \ + $3 !~ /^__gst_element_factory_add_/ && \ + $3 !~ /^gst_interfaces_marshal/ && \ + $3 ~ /^[_]*(gst_|Gst|GST_).*/) + { + if ($2 ~ /^[BSDG]$/) + print "\t" $3 " DATA" + else if ($2 == "T") + print "\t" $3 + } + }' | sort | awk '{ if (NR == 1) print "EXPORTS"; print $0; }' \ + > $lib_result + +diffoutput=`diff -u $def_path $lib_result` + +rm $lib_result + +if test "x$diffoutput" = "x"; then + exit 0; +else + echo -n "$diffoutput" >&2 + echo >&2 + exit 1; +fi + diff --git a/mobile/common/check.mak b/mobile/common/check.mak new file mode 100755 index 0000000..d31569f --- /dev/null +++ b/mobile/common/check.mak @@ -0,0 +1,149 @@ +clean-local-check: + for i in `find . -name ".libs" -type d`; do \ + rm -rf $$i; \ + done + +if HAVE_VALGRIND +# hangs spectacularly on some machines, so let's not do this by default yet +check-valgrind: + $(MAKE) valgrind +else +check-valgrind: + @true +endif + +LOOPS = 10 + +# run any given test by running make test.check +# if the test fails, run it again at at least debug level 2 +%.check: % + @$(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $* || \ + $(TESTS_ENVIRONMENT) \ + GST_DEBUG=$$GST_DEBUG,*:2 \ + CK_DEFAULT_TIMEOUT=20 \ + $* + +# run any given test in a loop +%.torture: % + @for i in `seq 1 $(LOOPS)`; do \ + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $*; done + +# run any given test in an infinite loop +%.forever: % + @while true; do \ + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=20 \ + $* || break; done + +# valgrind any given test by running make test.valgrind +%.valgrind: % + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=360 \ + G_SLICE=always-malloc \ + libtool --mode=execute \ + $(VALGRIND_PATH) -q \ + $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ + --tool=memcheck --leak-check=full --trace-children=yes \ + --leak-resolution=high --num-callers=20 \ + ./$* 2>&1 | tee valgrind.log + @if grep "==" valgrind.log > /dev/null 2>&1; then \ + rm valgrind.log; \ + exit 1; \ + fi + @rm valgrind.log + +# valgrind any given test and generate suppressions for it +%.valgrind.gen-suppressions: % + $(TESTS_ENVIRONMENT) \ + CK_DEFAULT_TIMEOUT=360 \ + G_SLICE=always-malloc \ + libtool --mode=execute \ + $(VALGRIND_PATH) -q \ + $(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \ + --tool=memcheck --leak-check=full --trace-children=yes \ + --leak-resolution=high --num-callers=20 \ + --gen-suppressions=all \ + ./$* 2>&1 | tee suppressions.log + +# valgrind any given test until failure by running make test.valgrind-forever +%.valgrind-forever: % + @while $(MAKE) $*.valgrind; do \ + true; done + +# gdb any given test by running make test.gdb +%.gdb: % + $(TESTS_ENVIRONMENT) \ + CK_FORK=no \ + libtool --mode=execute \ + gdb $* + +# torture tests +torture: $(TESTS) + -rm test-registry.xml + @echo "Torturing tests ..." + for i in `seq 1 $(LOOPS)`; do \ + $(MAKE) check || \ + (echo "Failure after $$i runs"; exit 1) || \ + exit 1; \ + done + @banner="All $(LOOPS) loops passed"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo $$dashes; echo $$banner; echo $$dashes + +# forever tests +forever: $(TESTS) + -rm test-registry.xml + @echo "Forever tests ..." + while true; do \ + $(MAKE) check || \ + (echo "Failure"; exit 1) || \ + exit 1; \ + done + +# valgrind all tests +valgrind: $(TESTS) + @echo "Valgrinding tests ..." + @failed=0; \ + for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \ + $(MAKE) $$t.valgrind; \ + if test "$$?" -ne 0; then \ + echo "Valgrind error for test $$t"; \ + failed=`expr $$failed + 1`; \ + whicht="$$whicht $$t"; \ + fi; \ + done; \ + if test "$$failed" -ne 0; then \ + echo "$$failed tests had leaks or errors under valgrind:"; \ + echo "$$whicht"; \ + false; \ + fi + +# inspect every plugin feature +GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_MAJORMINOR) +inspect: + @echo "Inspecting features ..." + for e in `$(TESTS_ENVIRONMENT) $(GST_INSPECT) | head -n -2 \ + | cut -d: -f2`; \ + do echo Inspecting $$e; \ + $(GST_INSPECT) $$e > /dev/null 2>&1; done + +help: + @echo "make check -- run all checks" + @echo "make torture -- run all checks $(LOOPS) times" + @echo "make (dir)/(test).check -- run the given check once" + @echo "make (dir)/(test).forever -- run the given check forever" + @echo "make (dir)/(test).torture -- run the given check $(LOOPS) times" + @echo + @echo "make (dir)/(test).gdb -- start up gdb for the given test" + @echo + @echo "make valgrind -- valgrind all tests" + @echo "make (dir)/(test).valgrind -- valgrind the given test" + @echo "make (dir)/(test).valgrind-forever -- valgrind the given test forever" + @echo "make (dir)/(test).valgrind.gen-suppressions -- generate suppressions" + @echo " and save to suppressions.log" + @echo "make inspect -- inspect all plugin features" + diff --git a/mobile/common/coverage/coverage-report-entry.pl b/mobile/common/coverage/coverage-report-entry.pl new file mode 100755 index 0000000..8f653af --- /dev/null +++ b/mobile/common/coverage/coverage-report-entry.pl @@ -0,0 +1,70 @@ +#!/usr/bin/perl +# +# Copyright (C) 2006 Daniel Berrange +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +print < + +Coverage report for $ARGV[0] + + + +

Coverage report for $ARGV[0]

+ +
+EOF
+
+
+while (<>) {
+    s/&/&/g;
+    s//>/g;
+
+    if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
+	my $class = $2 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    } elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
+	my $class = $1 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    } elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
+	my $class = "terrible";
+	$_ = "$_";
+    } elsif (/^\s*call\s+\d+\s+never executed.*$/) {
+	my $class = "terrible";
+	$_ = "$_";
+    } elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
+	my $class = $1 > 0 ? "perfect" : "terrible";
+	$_ = "$_";
+    }
+    
+
+    print;
+}
+
+print <
+
+
+EOF
diff --git a/mobile/common/coverage/coverage-report.pl b/mobile/common/coverage/coverage-report.pl
new file mode 100755
index 0000000..046bc37
--- /dev/null
+++ b/mobile/common/coverage/coverage-report.pl
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2006 Daniel Berrange
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+use warnings;
+use strict;
+
+my %coverage = ( functions => {}, files => {} );
+
+my %filemap;
+
+my $type;
+my $name;
+
+my @functions;
+
+while (<>) {
+    if (/^Function '(.*)'\s*$/) {
+	$type = "function";
+	$name = $1;
+	$coverage{$type}->{$name} = {};
+	push @functions, $name;
+    } elsif (/^File '(.*?)'\s*$/) {
+	$type = "file";
+	$name = $1;
+	$coverage{$type}->{$name} = {};
+	
+	foreach my $func (@functions) {
+	    $coverage{"function"}->{$func}->{file} = $name;
+	}
+	@functions = ();
+    } elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{lines} = $2;
+	$coverage{$type}->{$name}->{linesCoverage} = $1;
+    } elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{branches} = $2;
+	$coverage{$type}->{$name}->{branchesCoverage} = $1;
+    } elsif (/^Taken at least once:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{conds} = $2;
+	$coverage{$type}->{$name}->{condsCoverage} = $1;
+    } elsif (/^Calls executed:(.*)%\s*of\s*(\d+)\s*$/) {
+	$coverage{$type}->{$name}->{calls} = $2;
+	$coverage{$type}->{$name}->{callsCoverage} = $1;
+    } elsif (/^No branches$/) {
+	$coverage{$type}->{$name}->{branches} = 0;
+	$coverage{$type}->{$name}->{branchesCoverage} = "100.00";
+	$coverage{$type}->{$name}->{conds} = 0;
+	$coverage{$type}->{$name}->{condsCoverage} = "100.00";
+    } elsif (/^No calls$/) {
+	$coverage{$type}->{$name}->{calls} = 0;
+	$coverage{$type}->{$name}->{callsCoverage} = "100.00";
+    } elsif (/^\s*(.*):creating '(.*)'\s*$/) {
+	$filemap{$1} = $2;
+    } elsif (/^\s*$/) {
+	# nada
+    } else {
+	warn "Shit [$_]\n";
+    }
+}
+
+my %summary;
+foreach my $type ("function", "file") {
+    $summary{$type} = {};
+    foreach my $m ("lines", "branches", "conds", "calls") {
+	my $totalGot = 0;
+	my $totalMiss = 0;
+	my $count = 0;
+	foreach my $func (keys %{$coverage{function}}) {
+	    $count++;
+	    my $got = $coverage{function}->{$func}->{$m};
+	    $totalGot += $got;
+	    my $miss = $got * $coverage{function}->{$func}->{$m ."Coverage"} / 100;
+	    $totalMiss += $miss;
+	}
+	$summary{$type}->{$m} = sprintf("%d", $totalGot);
+	$summary{$type}->{$m . "Coverage"} = sprintf("%.2f", $totalMiss / $totalGot * 100);
+    }
+}
+
+
+
+print "\n";
+
+foreach my $type ("function", "file") {
+    printf "<%ss>\n", $type;
+    foreach my $name (sort { $a cmp $b } keys %{$coverage{$type}}) {
+	my $rec = $coverage{$type}->{$name};
+	printf "  \n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}});
+	printf "    \n", $rec->{lines}, $rec->{linesCoverage};
+	if (exists $rec->{branches}) {
+	    printf "    \n", $rec->{branches}, $rec->{branchesCoverage};
+	}
+	if (exists $rec->{conds}) {
+	    printf "    \n", $rec->{conds}, $rec->{condsCoverage};
+	}
+	if (exists $rec->{calls}) {
+	    printf "    \n", $rec->{calls}, $rec->{callsCoverage};
+	}
+	print  "  \n";
+    }
+    
+    printf "  \n";
+    printf "    \n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage};
+    printf "    \n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage};
+    printf "    \n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage};
+    printf "    \n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage};
+    printf  "  \n";
+    printf "\n", $type;
+}
+
+print "\n";
diff --git a/mobile/common/coverage/coverage-report.xsl b/mobile/common/coverage/coverage-report.xsl
new file mode 100755
index 0000000..b19ebb6
--- /dev/null
+++ b/mobile/common/coverage/coverage-report.xsl
@@ -0,0 +1,235 @@
+
+
+
+
+  
+
+  
+    
+      
+        Coverage report
+        
+      
+      
+        

Coverage report

+ + + +
+ + +

Function coverage

+ + + +
+ + + +

File coverage

+ + + +
+ + + + + + + + + + + + + + + + + + + + + odd + + + even + + + + + + + + + + + + + + odd + + + even + + + + + + +
NameLinesBranchesConditionsCalls
+
+ + + + + + + + + + + + + + Summary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + perfect + + + excellant + + + good + + + poor + + + bad + + + terrible + + + + + % of + + +
diff --git a/mobile/common/coverage/lcov.mak b/mobile/common/coverage/lcov.mak new file mode 100755 index 0000000..0ca9456 --- /dev/null +++ b/mobile/common/coverage/lcov.mak @@ -0,0 +1,42 @@ +## .PHONY so it always rebuilds it +.PHONY: lcov-reset lcov lcov-run lcov-report lcov-upload + +# run lcov from scratch, always +lcov-reset: + $(MAKE) lcov-run + $(MAKE) lcov-report + +# run lcov from scratch if the dir is not there +lcov: + $(MAKE) lcov-reset + +if GST_GCOV_ENABLED +# reset run coverage tests +lcov-run: + @-rm -rf lcov + lcov --directory . --zerocounters + -if test -d tests/check; then $(MAKE) -C tests/check inspect; fi + -$(MAKE) check + +# generate report based on current coverage data +lcov-report: + mkdir lcov + lcov --compat-libtool --directory . --capture --output-file lcov/lcov.info + lcov -l lcov/lcov.info | grep -v "`cd $(top_srcdir) && pwd`" | cut -d: -f1 > lcov/remove + lcov -l lcov/lcov.info | grep "tests/check/" | cut -d: -f1 >> lcov/remove + lcov -r lcov/lcov.info `cat lcov/remove` > lcov/lcov.cleaned.info + rm lcov/remove + mv lcov/lcov.cleaned.info lcov/lcov.info + genhtml -t "$(PACKAGE_STRING)" -o lcov --num-spaces 2 lcov/lcov.info + +lcov-upload: lcov + rsync -rvz -e ssh --delete lcov/* gstreamer.freedesktop.org:/srv/gstreamer.freedesktop.org/www/data/coverage/lcov/$(PACKAGE) + +else +lcov-run: + echo "Need to reconfigure with --enable-gcov" + +lcov-report: + echo "Need to reconfigure with --enable-gcov" +endif + diff --git a/mobile/common/gettext.patch b/mobile/common/gettext.patch new file mode 100755 index 0000000..659718e --- /dev/null +++ b/mobile/common/gettext.patch @@ -0,0 +1,23 @@ +--- po/Makefile.in.in.orig 2006-01-07 12:03:45.000000000 +0100 ++++ po/Makefile.in.in 2006-01-07 12:04:23.000000000 +0100 +@@ -11,6 +11,9 @@ + PACKAGE = @PACKAGE@ + VERSION = @VERSION@ + ++# thomas: add GETTEXT_PACKAGE substitution as used in Makevars ++GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ ++ + SHELL = /bin/sh + @SET_MAKE@ + +@@ -305,7 +308,9 @@ + update-gmo: Makefile $(GMOFILES) + @: + +-Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in ++# thomas: add LINGUAS as a dependency so that the Makefile gets rebuilt ++# properly when we add languages ++Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in LINGUAS + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status diff --git a/mobile/common/glib-gen.mak b/mobile/common/glib-gen.mak new file mode 100755 index 0000000..f9027da --- /dev/null +++ b/mobile/common/glib-gen.mak @@ -0,0 +1,44 @@ +# these are the variables your Makefile.am should set +# the example is based on the colorbalance interface + +#glib_enum_headers=$(colorbalance_headers) +#glib_enum_define=GST_COLOR_BALANCE +#glib_enum_prefix=gst_color_balance + +enum_headers=$(foreach h,$(glib_enum_headers),\n\#include \"$(h)\") + +# these are all the rules generating the relevant files +%-marshal.h: %-marshal.list + glib-genmarshal --header --prefix=$(glib_enum_prefix)_marshal $^ > $*-marshal.h.tmp + mv $*-marshal.h.tmp $*-marshal.h + +%-marshal.c: %-marshal.list + echo "#include \"$*-marshal.h\"" >> $*-marshal.c.tmp + glib-genmarshal --body --prefix=$(glib_enum_prefix)_marshal $^ >> $*-marshal.c.tmp + mv $*-marshal.c.tmp $*-marshal.c + +%-enumtypes.h: $(glib_enum_headers) + glib-mkenums \ + --fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include \n\nG_BEGIN_DECLS\n" \ + --fprod "\n/* enumerations from \"@filename@\" */\n" \ + --vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \ + --ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \ + $^ > $@ + +%-enumtypes.c: $(glib_enum_headers) + @if test "x$(glib_enum_headers)" == "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi + glib-mkenums \ + --fhead "#include \"$*-enumtypes.h\"\n$(enum_headers)" \ + --fprod "\n/* enumerations from \"@filename@\" */" \ + --vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \ + --vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \ + --vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \ + $^ > $@ + +# a hack rule to make sure .Plo files exist because they get include'd +# from Makefile's +.deps/%-marshal.Plo: + touch $@ + +.deps/%-enumtypes.Plo: + touch $@ diff --git a/mobile/common/gst-autogen.sh b/mobile/common/gst-autogen.sh new file mode 100755 index 0000000..ae60f7e --- /dev/null +++ b/mobile/common/gst-autogen.sh @@ -0,0 +1,294 @@ +# a silly hack that generates autoregen.sh but it's handy +# Remove the old autoregen.sh first to create a new file, +# as the current one may be being read by the shell executing +# this script. +if [ -f "autoregen.sh" ]; then + rm autoregen.sh +fi +echo "#!/bin/sh" > autoregen.sh +echo "./autogen.sh $@ \$@" >> autoregen.sh +chmod +x autoregen.sh + +# helper functions for autogen.sh + +debug () +# print out a debug message if DEBUG is a defined variable +{ + if test ! -z "$DEBUG" + then + echo "DEBUG: $1" + fi +} + +version_check () +# check the version of a package +# first argument : package name (executable) +# second argument : optional path where to look for it instead +# third argument : source download url +# rest of arguments : major, minor, micro version +# all consecutive ones : suggestions for binaries to use +# (if not specified in second argument) +{ + PACKAGE=$1 + PKG_PATH=$2 + URL=$3 + MAJOR=$4 + MINOR=$5 + MICRO=$6 + + # for backwards compatibility, we let PKG_PATH=PACKAGE when PKG_PATH null + if test -z "$PKG_PATH"; then PKG_PATH=$PACKAGE; fi + debug "major $MAJOR minor $MINOR micro $MICRO" + VERSION=$MAJOR + if test ! -z "$MINOR"; then VERSION=$VERSION.$MINOR; else MINOR=0; fi + if test ! -z "$MICRO"; then VERSION=$VERSION.$MICRO; else MICRO=0; fi + + debug "major $MAJOR minor $MINOR micro $MICRO" + + for SUGGESTION in $PKG_PATH; do + COMMAND="$SUGGESTION" + + # don't check if asked not to + test -z "$NOCHECK" && { + echo -n " checking for $COMMAND >= $VERSION ... " + } || { + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + } + + debug "checking version with $COMMAND" + ($COMMAND --version) < /dev/null > /dev/null 2>&1 || + { + echo "not found." + continue + } + # strip everything that's not a digit, then use cut to get the first field + pkg_version=`$COMMAND --version|head -n 1|sed 's/^.*)[^0-9]*//'|cut -d' ' -f1` + debug "pkg_version $pkg_version" + # remove any non-digit characters from the version numbers to permit numeric + # comparison + pkg_major=`echo $pkg_version | cut -d. -f1 | sed s/[a-zA-Z\-].*//g` + pkg_minor=`echo $pkg_version | cut -d. -f2 | sed s/[a-zA-Z\-].*//g` + pkg_micro=`echo $pkg_version | cut -d. -f3 | sed s/[a-zA-Z\-].*//g` + test -z "$pkg_major" && pkg_major=0 + test -z "$pkg_minor" && pkg_minor=0 + test -z "$pkg_micro" && pkg_micro=0 + debug "found major $pkg_major minor $pkg_minor micro $pkg_micro" + + #start checking the version + debug "version check" + + # reset check + WRONG= + + if [ ! "$pkg_major" -gt "$MAJOR" ]; then + debug "major: $pkg_major <= $MAJOR" + if [ "$pkg_major" -lt "$MAJOR" ]; then + debug "major: $pkg_major < $MAJOR" + WRONG=1 + elif [ ! "$pkg_minor" -gt "$MINOR" ]; then + debug "minor: $pkg_minor <= $MINOR" + if [ "$pkg_minor" -lt "$MINOR" ]; then + debug "minor: $pkg_minor < $MINOR" + WRONG=1 + elif [ "$pkg_micro" -lt "$MICRO" ]; then + debug "micro: $pkg_micro < $MICRO" + WRONG=1 + fi + fi + fi + + if test ! -z "$WRONG"; then + echo "found $pkg_version, not ok !" + continue + else + echo "found $pkg_version, ok." + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + fi + done + + echo "not found !" + echo "You must have $PACKAGE installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at $URL" + return 1; +} + +aclocal_check () +{ + # normally aclocal is part of automake + # so we expect it to be in the same place as automake + # so if a different automake is supplied, we need to adapt as well + # so how's about replacing automake with aclocal in the set var, + # and saving that in $aclocal ? + # note, this will fail if the actual automake isn't called automake* + # or if part of the path before it contains it + if [ -z "$automake" ]; then + echo "Error: no automake variable set !" + return 1 + else + aclocal=`echo $automake | sed s/automake/aclocal/` + debug "aclocal: $aclocal" + if [ "$aclocal" != "aclocal" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-aclocal=$aclocal" + fi + if [ ! -x `which $aclocal` ]; then + echo "Error: cannot execute $aclocal !" + return 1 + fi + fi +} + +autoheader_check () +{ + # same here - autoheader is part of autoconf + # use the same voodoo + if [ -z "$autoconf" ]; then + echo "Error: no autoconf variable set !" + return 1 + else + autoheader=`echo $autoconf | sed s/autoconf/autoheader/` + debug "autoheader: $autoheader" + if [ "$autoheader" != "autoheader" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader" + fi + if [ ! -x `which $autoheader` ]; then + echo "Error: cannot execute $autoheader !" + return 1 + fi + fi + +} +autoconf_2_52d_check () +{ + # autoconf 2.52d has a weird issue involving a yes:no error + # so don't allow it's use + test -z "$NOCHECK" && { + ac_version=`$autoconf --version|head -n 1|sed 's/^[a-zA-Z\.\ ()]*//;s/ .*$//'` + if test "$ac_version" = "2.52d"; then + echo "autoconf 2.52d has an issue with our current build." + echo "We don't know who's to blame however. So until we do, get a" + echo "regular version. RPM's of a working version are on the gstreamer site." + exit 1 + fi + } + return 0 +} + +die_check () +{ + # call with $DIE + # if set to 1, we need to print something helpful then die + DIE=$1 + if test "x$DIE" = "x1"; + then + echo + echo "- Please get the right tools before proceeding." + echo "- Alternatively, if you're sure we're wrong, run with --nocheck." + exit 1 + fi +} + +autogen_options () +{ + if test "x$1" = "x"; then + return 0 + fi + + while test "x$1" != "x" ; do + optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + case "$1" in + --noconfigure) + NOCONFIGURE=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --noconfigure" + echo "+ configure run disabled" + shift + ;; + --nocheck) + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --nocheck" + NOCHECK=defined + echo "+ autotools version check disabled" + shift + ;; + --debug) + DEBUG=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug" + echo "+ debug output enabled" + shift + ;; + -h|--help) + echo "autogen.sh (autogen options) -- (configure options)" + echo "autogen.sh help options: " + echo " --noconfigure don't run the configure script" + echo " --nocheck don't do version checks" + echo " --debug debug the autogen process" + echo + echo " --with-autoconf PATH use autoconf in PATH" + echo " --with-automake PATH use automake in PATH" + echo + echo "Any argument either not in the above list or after a '--' will be " + echo "passed to ./configure." + exit 1 + ;; + --with-automake=*) + AUTOMAKE=$optarg + echo "+ using alternate automake in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-automake=$AUTOMAKE" + shift + ;; + --with-autoconf=*) + AUTOCONF=$optarg + echo "+ using alternate autoconf in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF" + shift + ;; + --) shift ; break ;; + *) + echo "+ passing argument $1 to configure" + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1" + shift + ;; + esac + done + + for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done + if test ! -z "$CONFIGURE_EXT_OPT" + then + echo "+ options passed to configure: $CONFIGURE_EXT_OPT" + fi +} + +toplevel_check () +{ + srcfile=$1 + test -f $srcfile || { + echo "You must run this script in the top-level $package directory" + exit 1 + } +} + + +tool_run () +{ + tool=$1 + options=$2 + run_if_fail=$3 + echo "+ running $tool $options..." + $tool $options || { + echo + echo $tool failed + eval $run_if_fail + exit 1 + } +} diff --git a/mobile/common/gst-xmlinspect.py b/mobile/common/gst-xmlinspect.py new file mode 100755 index 0000000..0d7f696 --- /dev/null +++ b/mobile/common/gst-xmlinspect.py @@ -0,0 +1,168 @@ +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +examine all plugins and elements and output xml documentation for them +used as part of the plugin documentation build +""" + +import sys +import os +import pygst +pygst.require('0.10') +import gst + +INDENT_SIZE = 2 + +# all templates + +PAD_TEMPLATE = """ + %(name)s + %(direction)s + %(presence)s +
%(details)s
+
""" + +ELEMENT_TEMPLATE = """ + %(name)s + %(longname)s + %(class)s + %(description)s + %(author)s + +%(pads)s + +""" + +PLUGIN_TEMPLATE = """ + %(name)s + %(description)s + %(filename)s + %(basename)s + %(version)s + %(license)s + %(source)s + %(package)s + %(origin)s + +%(elements)s + +""" + +def xmlencode(line): + """ + Replace &, <, and > + """ + line = "&".join(line.split("&")) + line = "<".join(line.split("<")) + line = ">".join(line.split(">")) + return line + +def get_offset(indent): + return " " * INDENT_SIZE * indent + +def output_pad_template(pt, indent=0): + print "PAD TEMPLATE", pt.name_template + paddir = ("unknown","source","sink") + padpres = ("always","sometimes","request") + + d = { + 'name': xmlencode(pt.name_template), + 'direction': xmlencode(paddir[pt.direction]), + 'presence': xmlencode(padpres[pt.presence]), + 'details': xmlencode(pt.static_caps.string), + } + block = PAD_TEMPLATE % d + + offset = get_offset(indent) + return offset + ("\n" + offset).join(block.split("\n")) + +def output_element_factory(elf, indent=0): + print "ELEMENT", elf.get_name() + + padsoutput = [] + padtemplates = elf.get_static_pad_templates() + for padtemplate in padtemplates: + padsoutput.append(output_pad_template(padtemplate, indent)) + + d = { + 'name': xmlencode(elf.get_name()), + 'longname': xmlencode(elf.get_longname()), + 'class': xmlencode(elf.get_klass()), + 'description': xmlencode(elf.get_description()), + 'author': xmlencode(elf.get_author()), + 'pads': "\n".join(padsoutput), + } + block = ELEMENT_TEMPLATE % d + + offset = get_offset(indent) + return offset + ("\n" + offset).join(block.split("\n")) + +def output_plugin(plugin, indent=0): + print "PLUGIN", plugin.get_name() + version = plugin.get_version() + + elements = {} + gst.debug('getting features for plugin %s' % plugin.get_name()) + registry = gst.registry_get_default() + features = registry.get_feature_list_by_plugin(plugin.get_name()) + gst.debug('plugin %s has %d features' % (plugin.get_name(), len(features))) + for feature in features: + if isinstance(feature, gst.ElementFactory): + elements[feature.get_name()] = feature + #gst.debug("got features") + + elementsoutput = [] + keys = elements.keys() + keys.sort() + for name in keys: + feature = elements[name] + elementsoutput.append(output_element_factory(feature, indent + 2)) + + filename = plugin.get_filename() + basename = filename + if basename: + basename = os.path.basename(basename) + d = { + 'name': xmlencode(plugin.get_name()), + 'description': xmlencode(plugin.get_description()), + 'filename': filename, + 'basename': basename, + 'version': version, + 'license': xmlencode(plugin.get_license()), + 'source': xmlencode(plugin.get_source()), + 'package': xmlencode(plugin.get_package()), + 'origin': xmlencode(plugin.get_origin()), + 'elements': "\n".join(elementsoutput), + } + block = PLUGIN_TEMPLATE % d + + offset = get_offset(indent) + return offset + ("\n" + offset).join(block.split("\n")) + +def main(): + if len(sys.argv) == 1: + sys.stderr.write("Please specify a source module to inspect") + sys.exit(1) + source = sys.argv[1] + + if len(sys.argv) > 2: + os.chdir(sys.argv[2]) + + registry = gst.registry_get_default() + all = registry.get_plugin_list() + for plugin in all: + gst.debug("inspecting plugin %s from source %s" % ( + plugin.get_name(), plugin.get_source())) + # this skips gstcoreelements, with bin and pipeline + if plugin.get_filename() is None: + continue + if plugin.get_source() != source: + continue + + filename = "plugin-%s.xml" % plugin.get_name() + handle = open(filename, "w") + handle.write(output_plugin(plugin)) + handle.close() + +main() diff --git a/mobile/common/gst.supp b/mobile/common/gst.supp new file mode 100755 index 0000000..9b2a3a2 --- /dev/null +++ b/mobile/common/gst.supp @@ -0,0 +1,1988 @@ +### this file contains suppressions for valgrind when running +### the gstreamer unit tests +### it might be useful for wider use as well + +### syscall suppressions + +{ + + Memcheck:Param + clone(parent_tidptr) + fun:clone + fun:clone +} + +{ + + Memcheck:Param + clone(child_tidptr) + fun:clone + fun:clone +} + +{ + + Memcheck:Param + clone(tlsinfo) + fun:clone + fun:clone +} + +### glibc suppressions + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file +} + +# glibc does not deallocate thread-local storage + +{ + + Memcheck:Leak + fun:calloc + fun:_dl_allocate_tls + fun:pthread_create@@* +} + +# I get an extra stack entry on x86/dapper +{ + + Memcheck:Leak + fun:calloc + obj:/lib/ld-2.3.*.so + fun:_dl_allocate_tls + fun:pthread_create@@* +} + + +{ + + Memcheck:Cond + fun:strstr + fun:__pthread_initialize_minimal + obj:/lib/libpthread-*.so + obj:/lib/libpthread-*.so + fun:call_init + fun:_dl_init + obj:/lib/ld-*.so +} + +# a thread-related free problem in glibc from Edgard +{ + __libc_freeres_rw_acess + Memcheck:Addr4 + obj:* + obj:* + obj:* + obj:* + obj:* + fun:__libc_freeres +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so +} + +# g_module_open-related problems +{ + + Memcheck:Addr2 + fun:memcpy + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:init_post + fun:g_option_context_parse + fun:gst_init_check + fun:gst_init + fun:gst_check_init + fun:main +} + +{ + + Memcheck:Addr4 + fun:memcpy + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:gst_registry_scan_path_level + fun:init_post + fun:g_option_context_parse + fun:gst_init_check + fun:gst_init + fun:gst_check_init + fun:main +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:do_sym + fun:_dl_sym + fun:dlsym_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlsym + fun:g_module_symbol + fun:g_module_open + fun:gst_plugin_load_file +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file +} +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_plugin_load_by_name + fun:gst_plugin_feature_load +} + +{ + + Memcheck:Leak + fun:malloc + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_plugin_load_by_name +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:dl_open_worker + obj:/lib/ld-2.3.*.so + fun:_dl_open + fun:dlopen_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:do_sym + fun:_dl_sym + fun:dlsym_doit + obj:/lib/ld-2.3.*.so + fun:_dlerror_run + fun:dlsym + fun:g_module_symbol + fun:g_module_open +} + +{ + + Memcheck:Param + futex(uaddr2) + fun:pthread_once + obj:/lib/libc-2.3.*.so + obj:/lib/libc-2.3.*.so + fun:mbsnrtowcs + fun:vfprintf + fun:vsprintf + fun:sprintf + obj:/lib/libc-2.3.*.so + fun:tmpfile + fun:setup_pipe + fun:setup_messaging_with_key + fun:setup_messaging +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + fun:_dl_sym + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlsym + fun:g_module_symbol + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen + fun:g_module_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + fun:iconv_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/ld-2.7.so + fun:__libc_dlopen_mode + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + obj:/lib/i686/cmov/libc-2.7.so + fun:iconv_open +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + obj:/lib/ld-2.7.so + obj:/lib/i686/cmov/libdl-2.7.so + fun:dlopen +} + +# suppression for a glibc bug: +# http://valgrind.org/docs/manual/faq.html#faq.exit_errors> +{ + + Memcheck:Free + fun:free + obj:*libc-*.so + fun:__libc_freeres + fun:* + fun:_Exit +} + +# valgrind doesn't allow me to specify a suppression for Addr1, Addr2, Addr4 +# as Addr*, so 3 copies for that; and then 2 of each for that pesky memcpy +{ + + Memcheck:Addr1 + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr2 + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} +{ + + Memcheck:Addr4 + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr1 + fun:memcpy + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr2 + fun:memcpy + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} +{ + + Memcheck:Addr4 + fun:memcpy + fun:_dl_signal_error + fun:_dl_map_object_deps + fun:dl_open_worker + fun:_dl_catch_error + fun:_dl_open + fun:dlopen_doit + fun:_dl_catch_error + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 + fun:g_module_open +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/libc-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:_dl_open + obj:/lib/libdl-2.3.*.so + obj:/lib/ld-2.3.*.so +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.*.so + obj:/lib/libc-2.3.*.so + obj:/lib/ld-2.3.*.so + fun:_dl_open + obj:/lib/libdl-2.3.*.so + obj:/lib/ld-2.3.*.so + obj:/lib/libdl-2.3.*.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_file + fun:gst_plugin_load_by_name + fun:gst_plugin_feature_load +} + +{ + + Memcheck:Addr4 + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libc-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libc-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + fun:dlopen +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libc-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/tls/i686/cmov/libdl-2.3.6.so + fun:dlopen +} + +### glib suppressions +{ + + Memcheck:Cond + fun:g_parse_debug_string + obj:/usr/lib*/libglib-2.0.so.* + fun:g_slice_alloc + fun:g_slice_alloc0 +} + +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:g_strdup + fun:g_quark_from_string + obj:* + obj:* + fun:g_type_register_fundamental + obj:* + fun:g_type_init_with_debug_flags + fun:g_type_init + fun:init_pre +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + obj:* + obj:* + fun:g_type_register_fundamental +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + obj:* + obj:* + fun:g_type_init_with_debug_flags +} + +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:g_slice_alloc + obj:* + obj:* + fun:g_type_init_with_debug_flags +} + +#pthread memleaks + +{ + Thread creation leak + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate* + fun:_dl_allocate* + fun:__pthread_initialize_minimal +} + +{ + Thread management leak + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate* + fun:_dl_allocate* + fun:__pthread_* +} + +{ + Thread management leak 2 + Memcheck:Leak + fun:memalign + fun:_dl_allocate* + fun:_dl_allocate* + fun:__pthread_* +} + +{ + pthread_create Syscall param write(buf) points to uninitialised byte(s) + Memcheck:Param + write(buf) + fun:pthread_create@@GLIBC_2.2.5 + fun:g_thread_create* + +} + +# nss_parse_* memleak (used by g_option_context_parse) +{ + nss_parse_* memleak + Memcheck:Leak + fun:malloc + fun:nss_parse_service_list + fun:__nss_database_lookup +} + +# liboil suppressions +{ + + Memcheck:Value8 + obj:/usr/lib/liboil-0.3.so.0.1.0 + obj:/usr/lib/liboil-0.3.so.0.1.0 + obj:/usr/lib/liboil-0.3.so.0.1.0 + fun:oil_cpu_fault_check_try + fun:oil_test_check_impl + fun:oil_class_optimize + fun:oil_optimize_all + fun:oil_init +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.3.6.so +} + +{ + + Memcheck:Param + futex(uaddr2) + fun:pthread_once + obj:/lib/libc-2.3.6.so + obj:/lib/libc-2.3.6.so + fun:setlocale + fun:init_pre + fun:g_option_context_parse + fun:gst_init_check + fun:gst_init + fun:gst_check_init + fun:main +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + fun:_dl_open + obj:/lib/libdl-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/libdl-2.3.6.so + fun:dlopen + fun:g_module_open + fun:gst_plugin_load_file +} +# this exists in a bunch of different variations, hence the short tail/trace +{ + + Memcheck:Addr4 + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so +} +{ + + Memcheck:Addr8 + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so +} + +# More edgy suppressions (Mike) +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + fun:dlopen_doit + obj:/lib/ld-2.4.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + fun:dlopen_doit + obj:/lib/ld-2.4.so + fun:_dlerror_run + fun:dlopen@@GLIBC_2.1 +} + +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + fun:do_sym + fun:_dl_sym +} + +# This one's overly general, but there's zero other information in the stack +# trace - just these five lines! +{ + + Memcheck:Cond + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so + obj:/lib/ld-2.4.so +} + +{ + + Memcheck:Leak + fun:calloc + obj:/lib/ld-2.4.so + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.1 +} + +# TLS leaks for feisty/x86 +{ + + Memcheck:Leak + fun:calloc + fun:allocate_dtv + fun:_dl_allocate_tls + fun:pthread_create@@GLIBC_2.1 +} + +{ + + Memcheck:Leak + fun:calloc + obj:/usr/lib/libcdio.so.6.0.1 + fun:cdio_open_am_linux + obj:/usr/lib/libcdio.so.6.0.1 + fun:cdio_open_am +} + +{ + + Memcheck:Addr8 + obj:/lib/ld-2.5.so +} + +{ + + Memcheck:Cond + fun:snd_pcm_direct_shm_create_or_connect + fun:snd_pcm_dsnoop_open + fun:_snd_pcm_dsnoop_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_plug_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_asym_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 +} + +{ + + Memcheck:Cond + fun:snd_pcm_hw_param_set_near + fun:set_hwparams +} + +{ + + Memcheck:Cond + fun:_snd_pcm_hw_param_set_min + fun:snd_pcm_hw_param_set_min + fun:snd_pcm_hw_param_set_near + fun:set_hwparams +} + +{ + + Memcheck:Cond + fun:_snd_pcm_hw_param_set_min + fun:snd_pcm_hw_param_set_min + fun:snd_pcm_hw_param_set_near + fun:set_hwparams +} + +{ + + Memcheck:Cond + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_hw_param_set_near + fun:set_hwparams +} +{ + + Memcheck:Cond + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_close + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Cond + fun:snd_pcm_direct_shm_create_or_connect + fun:snd_pcm_dmix_open + fun:_snd_pcm_dmix_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_softvol_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_plug_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_asym_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:malloc + fun:strdup + fun:snd_dlobj_cache_add + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:snd_pcm_dsnoop_open + fun:_snd_pcm_dsnoop_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_plug_open + obj:/*lib/libasound.so.2.0.0 + fun:snd_pcm_open_slave + fun:_snd_pcm_asym_open + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 +} +# Catch about 15 variations on inserting info into an ALSA +# internal cache +{ + + Memcheck:Leak + fun:malloc + fun:snd_dlobj_cache_add + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:malloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks +} +{ + + Memcheck:Leak + fun:malloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + fun:snd_config_hook_load_for_all_cards + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + fun:snd_config_hook_load_for_all_cards + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_update_r + fun:snd_config_update +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + fun:snd_config_hook_load_for_all_cards + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + fun:snd_config_hook_load_for_all_cards + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + fun:snd_config_hook_load_for_all_cards + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:calloc + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_hook_load + fun:snd_config_hook_load_for_all_cards + obj:/*lib/libasound.so.2.0.0 + fun:snd_config_searcha_hooks + fun:snd_config_search_alias_hooks + fun:snd_config_search_definition + obj:/*lib/libasound.so.2.0.0 +} +{ + + Memcheck:Leak + fun:malloc + obj:/lib/libc*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getgrnam_r + fun:getgrnam + fun:snd_pcm_direct_parse_open_conf +} + +{ + + Memcheck:Leak + fun:calloc + fun:_XCBInitDisplayLock + fun:XOpenDisplay +} + +# GConf internal initialisations related to getting the default client. +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so.* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + obj:/usr/lib/libORBit-2.so.* + fun:PortableServer_POA_servant_to_reference + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so.* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:ORBit_demarshal_value + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_small_invoke_stub + fun:ConfigServer_get_default_database + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + obj:/usr/lib/libORBit-2.so.* + fun:IOP_generate_profiles + fun:ORBit_marshal_object + fun:ORBit_marshal_value + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_small_invoke_stub + fun:ConfigServer_add_client + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_by_tc + obj:/usr/lib/libORBit-2.so.* + fun:PortableServer_POA_servant_to_reference + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_by_tc + obj:/usr/lib/libORBit-2.so.* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so.* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so.* + obj:/usr/lib/libgconf-2.so.* + fun:gconf_engine_get_default +} + +# Some libORBit/bonobo initialisation stuff +{ + + Memcheck:Leak + fun:malloc + fun:g_malloc + fun:ORBit_alloc_string + fun:CORBA_string_dup + fun:Bonobo_ActivationEnvValue_set + fun:bonobo_activation_init_activation_env + fun:bonobo_activation_orb_init + fun:bonobo_activation_init +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:PortableServer_POA_servant_to_reference + obj:/usr/lib/libbonobo-2.so* +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + fun:ORBit_small_allocbuf + fun:ORBit_adaptor_setup + obj:/usr/lib/libORBit-2.so* + fun:ORBit_POA_setup_root + fun:ORBit_init_internals + fun:CORBA_ORB_init +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc_tcval + fun:ORBit_adaptor_setup + obj:/usr/lib/libORBit-2.so* + fun:ORBit_POA_setup_root + fun:ORBit_init_internals + fun:CORBA_ORB_init +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_allocbuf + fun:bonobo_activation_init_activation_env + fun:bonobo_activation_orb_init + fun:bonobo_activation_init +} + +# More GConf stuff from the FC5 buildbot, mostly variations on the +# above stack traces +{ + + Memcheck:Param + writev(vector[...]) + fun:writev + obj:/usr/lib/libORBit-2.so* + fun:link_connection_writev + fun:giop_send_buffer_write + obj:/usr/lib/libORBit-2.so* + fun:ORBit_small_invoke_stub + fun:ORBit_small_invoke_stub_n + fun:ORBit_c_stub_invoke + fun:ConfigServer_ping + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:PortableServer_POA_servant_to_reference + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc + obj:/usr/lib/libORBit-2.so* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:CORBA_ORB_string_to_object + obj:/usr/lib/libgconf-2.so* + fun:gconf_get_current_lock_holder + fun:gconf_activate_server + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:ORBit_demarshal_IOR + fun:ORBit_demarshal_object + fun:ORBit_demarshal_value + obj:/usr/lib/libORBit-2.so* + fun:ORBit_small_invoke_stub + fun:ORBit_small_invoke_stub_n + fun:ORBit_c_stub_invoke + fun:ConfigServer_get_default_database + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:calloc + fun:g_malloc0 + fun:ORBit_alloc* + fun:ORBit_small_alloc* + obj:/usr/lib/libORBit-2.so* + fun:ORBit_OAObject_object_to_objkey + fun:IOP_generate_profiles + fun:ORBit_marshal_object + fun:ORBit_marshal_value + obj:/usr/lib/libORBit-2.so* + fun:ORBit_small_invoke_stub + fun:ORBit_small_invoke_stub_n + fun:ORBit_c_stub_invoke + fun:ConfigServer_add_client + obj:/usr/lib/libgconf-2.so* + obj:/usr/lib/libgconf-2.so* + fun:gconf_engine_get_default +} +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.* + fun:g_get_home_dir +} +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.* + fun:g_get_user_name +} +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.* + fun:g_get_tmp_dir +} + +{ + + Memcheck:Leak + fun:malloc + obj:*libc-*.so + fun:__nss_database_lookup + obj:* + obj:* + fun:getpwnam_r + obj:/usr/lib*/libglib-2.0.so.0.* + fun:g_get_host_name +} + + +## Some Fontconfig errors. +{ + + Memcheck:Leak + fun:malloc + fun:FcPatternObjectInsertElt + fun:FcPatternObjectAddWithBinding + fun:FcPatternAppend + fun:FcEndElement + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad + fun:FcConfigParseAndLoad + fun:FcParseInclude + fun:FcEndElement + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad +} +{ + + Memcheck:Leak + fun:malloc + fun:FcStrCopy + fun:FcEndElement + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad + fun:FcConfigParseAndLoad + fun:FcParseInclude + fun:FcEndElement + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + obj:/usr/lib/libexpat.so.1.0.0 + fun:XML_ParseBuffer + fun:FcConfigParseAndLoad + fun:FcInitLoadConfig + fun:FcInitLoadConfigAndFonts +} + diff --git a/mobile/common/gstdoc-scangobj b/mobile/common/gstdoc-scangobj new file mode 100755 index 0000000..90ba889 --- /dev/null +++ b/mobile/common/gstdoc-scangobj @@ -0,0 +1,1607 @@ +#!/usr/bin/perl -w +# -*- cperl -*- +# +# gtk-doc - GTK DocBook documentation generator. +# Copyright (C) 1998 Damon Chaplin +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# + +# +# This gets information about object heirarchies and signals +# by compiling a small C program. CFLAGS and LDFLAGS must be +# set appropriately before running this script. +# +# NOTE: the lookup_signal_arg_names() function contains the argument names of +# standard GTK signal handlers. This may need to be updated for new +# GTK signals or Gnome widget signals. + +use Getopt::Long; + +unshift @INC, '/usr/share/gtk-doc/data'; +require "gtkdoc-common.pl"; + +# Options + +# name of documentation module +my $MODULE; +my $OUTPUT_DIR; +my $PRINT_VERSION; +my $PRINT_HELP; +my $TYPE_INIT_FUNC="g_type_init ()"; + +# --nogtkinit is deprecated, as it is the default now anyway. +%optctl = (module => \$MODULE, + source => \$SOURCE, + types => \$TYPES_FILE, + nogtkinit => \$NO_GTK_INIT, + 'type-init-func' => \$TYPE_INIT_FUNC, + 'output-dir' => \$OUTPUT_DIR, + 'version' => \$PRINT_VERSION, + 'help' => \$PRINT_HELP); + +GetOptions(\%optctl, "module=s", "source=s", "types:s", "output-dir:s", "nogtkinit", "type-init-func:s", "version", "help"); + +if ($NO_GTK_INIT) { + # Do nothing. This just avoids a warning. +} + +if ($PRINT_VERSION) { + print "1.5\n"; + exit 0; +} + +if (!$MODULE) { + $PRINT_HELP = 1; +} + +if ($PRINT_HELP) { + print "gstdoc-scangobj version 1.5\n"; + print "\n--module=MODULE_NAME Name of the doc module being parsed"; + print "\n--source=SOURCE_NAME Name of the source module for plugins"; + print "\n--types=FILE The name of the file to store the types in"; + print "\n--type-init-func=FUNC The init function to call instead of g_type_init ()"; + print "\n--output-dir=DIRNAME The directory where the results are stored"; + print "\n--version Print the version of this program"; + print "\n--help Print this help\n"; + exit 0; +} + +$OUTPUT_DIR = $OUTPUT_DIR ? $OUTPUT_DIR : "."; + +# THOMAS: dynamic types; only use types file for headers + $TYPES_FILE = $TYPES_FILE ? $TYPES_FILE : "$OUTPUT_DIR/$MODULE.types"; + +open (TYPES, $TYPES_FILE) || die "Cannot open $TYPES_FILE: $!\n"; +open (OUTPUT, ">$MODULE-scan.c") || die "Cannot open $MODULE-scan.c: $!\n"; + +my $old_signals_filename = "$OUTPUT_DIR/$MODULE.signals"; +my $new_signals_filename = "$OUTPUT_DIR/$MODULE.signals.new"; +my $old_hierarchy_filename = "$OUTPUT_DIR/$MODULE.hierarchy"; +my $new_hierarchy_filename = "$OUTPUT_DIR/$MODULE.hierarchy.new"; +my $old_interfaces_filename = "$OUTPUT_DIR/$MODULE.interfaces"; +my $new_interfaces_filename = "$OUTPUT_DIR/$MODULE.interfaces.new"; +my $old_prerequisites_filename = "$OUTPUT_DIR/$MODULE.prerequisites"; +my $new_prerequisites_filename = "$OUTPUT_DIR/$MODULE.prerequisites.new"; +my $old_args_filename = "$OUTPUT_DIR/$MODULE.args"; +my $new_args_filename = "$OUTPUT_DIR/$MODULE.args.new"; + +# write a C program to scan the types + +$includes = ""; +#@types = (); + +for () { + if (/^#include/) { + $includes .= $_; +# } elsif (/^%/) { +# next; +# } elsif (/^\s*$/) { +# next; +# } else { +# chomp; +# push @types, $_; + } +} + +#$ntypes = @types + 1; + +print OUTPUT < +#include +#include +#include + +$includes +#ifdef GTK_IS_WIDGET_CLASS +#include +#endif +GType *object_types = NULL; + +static GType * +get_object_types (void) +{ + GList *plugins = NULL; + GList *factories = NULL; + GList *l; + GstElementFactory *factory = NULL; + + gint i = 0; + + /* get a list of features from plugins in our source module */ + plugins = gst_registry_get_plugin_list (gst_registry_get_default()); + + while (plugins) { + GList *features; + GstPlugin *plugin; + const gchar *source; + + plugin = (GstPlugin *) (plugins->data); + plugins = g_list_next (plugins); + source = gst_plugin_get_source (plugin); + /*g_print ("plugin: %s source: %s\\n", plugin->desc.name, source);*/ + if (!source || strcmp (source, "$SOURCE") != 0) { + continue; + } + g_print ("plugin: %s source: %s\\n", plugin->desc.name, source); + + features = + gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), + plugin->desc.name); + while (features) { + GstPluginFeature *feature; + feature = GST_PLUGIN_FEATURE (features->data); + feature = gst_plugin_feature_load (feature); + if (!feature) { + g_warning ("Could not load plugin feature %s", + gst_plugin_feature_get_name (feature)); + } + + if (GST_IS_ELEMENT_FACTORY (feature)) { + factory = GST_ELEMENT_FACTORY (feature); + factories = g_list_prepend (factories, factory); + } + features = g_list_next (features); + } + } + + g_message ("number of element factories: %d", g_list_length (factories)); + + /* allocate the object_types array to hold them */ + object_types = g_new0 (GType, g_list_length (factories)+1); + + l = factories; + i = 0; + + /* fill it */ + while (l) { + GType type; + factory = GST_ELEMENT_FACTORY (l->data); + type = gst_element_factory_get_element_type (factory); + g_message ("adding type %p for factory %s", (void *) type, gst_element_factory_get_longname (factory)); + object_types[i] = type; + i++; + l = g_list_next (l); + } + object_types[i] = 0; +EOT + +print OUTPUT <\\n%s::%s\\n%s\\n%s\\n%s\\n\\n", + object_name, query_info.signal_name, ret_type_buffer, flags, buffer); +} + + +/* Returns the type name to use for a signal argument or return value, given + the GtkType from the signal info. It also sets is_pointer to TRUE if the + argument needs a '*' since it is a pointer. */ +static const gchar * +get_type_name (GType type, gboolean * is_pointer) +{ + const gchar *type_name; + + *is_pointer = FALSE; + type_name = g_type_name (type); + + switch (type) { + case G_TYPE_NONE: + case G_TYPE_CHAR: + case G_TYPE_UCHAR: + case G_TYPE_BOOLEAN: + case G_TYPE_INT: + case G_TYPE_UINT: + case G_TYPE_LONG: + case G_TYPE_ULONG: + case G_TYPE_FLOAT: + case G_TYPE_DOUBLE: + case G_TYPE_POINTER: + /* These all have normal C type names so they are OK. */ + return type_name; + + case G_TYPE_STRING: + /* A GtkString is really a gchar*. */ + *is_pointer = TRUE; + return "gchar"; + + case G_TYPE_ENUM: + case G_TYPE_FLAGS: + /* We use a gint for both of these. Hopefully a subtype with a decent + name will be registered and used instead, as GTK+ does itself. */ + return "gint"; + + case G_TYPE_BOXED: + /* The boxed type shouldn't be used itself, only subtypes. Though we + return 'gpointer' just in case. */ + return "gpointer"; + + case G_TYPE_PARAM: + /* A GParam is really a GParamSpec*. */ + *is_pointer = TRUE; + return "GParamSpec"; + + default: + break; + } + + /* For all GObject subclasses we can use the class name with a "*", + e.g. 'GtkWidget *'. */ + if (g_type_is_a (type, G_TYPE_OBJECT)) + *is_pointer = TRUE; + + if (G_TYPE_IS_CLASSED (type)) + *is_pointer = TRUE; + + /* All boxed subtypes will be pointers as well. */ + if (g_type_is_a (type, G_TYPE_BOXED)) + *is_pointer = TRUE; + + /* All pointer subtypes will be pointers as well. */ + if (g_type_is_a (type, G_TYPE_POINTER)) + *is_pointer = TRUE; + + /* But enums are not */ + if (g_type_is_a (type, G_TYPE_ENUM) || + g_type_is_a (type, G_TYPE_FLAGS)) + *is_pointer = FALSE; + + return type_name; +} + + +static const gchar * +get_gdk_event (const gchar * signal_name) +{ + static const gchar *GbGDKEvents[] = + { + "button_press_event", "GdkEventButton", + "button_release_event", "GdkEventButton", + "motion_notify_event", "GdkEventMotion", + "delete_event", "GdkEvent", + "destroy_event", "GdkEvent", + "expose_event", "GdkEventExpose", + "key_press_event", "GdkEventKey", + "key_release_event", "GdkEventKey", + "enter_notify_event", "GdkEventCrossing", + "leave_notify_event", "GdkEventCrossing", + "configure_event", "GdkEventConfigure", + "focus_in_event", "GdkEventFocus", + "focus_out_event", "GdkEventFocus", + "map_event", "GdkEvent", + "unmap_event", "GdkEvent", + "property_notify_event", "GdkEventProperty", + "selection_clear_event", "GdkEventSelection", + "selection_request_event", "GdkEventSelection", + "selection_notify_event", "GdkEventSelection", + "proximity_in_event", "GdkEventProximity", + "proximity_out_event", "GdkEventProximity", + "drag_begin_event", "GdkEventDragBegin", + "drag_request_event", "GdkEventDragRequest", + "drag_end_event", "GdkEventDragRequest", + "drop_enter_event", "GdkEventDropEnter", + "drop_leave_event", "GdkEventDropLeave", + "drop_data_available_event", "GdkEventDropDataAvailable", + "other_event", "GdkEventOther", + "client_event", "GdkEventClient", + "no_expose_event", "GdkEventNoExpose", + "visibility_notify_event", "GdkEventVisibility", + "window_state_event", "GdkEventWindowState", + "scroll_event", "GdkEventScroll", + NULL + }; + + gint i; + + for (i = 0; GbGDKEvents[i]; i += 2) + { + if (!strcmp (signal_name, GbGDKEvents[i])) + return GbGDKEvents[i + 1]; + } + return "GdkEvent"; +} + + +/* This returns argument names to use for some known GTK signals. + It is passed a widget name, e.g. 'GtkCList' and a signal name, e.g. + 'select_row' and it returns a pointer to an array of argument types and + names. */ +static const gchar ** +lookup_signal_arg_names (const gchar * type, const gchar * signal_name) +{ + /* Each arg array starts with the object type name and the signal name, + and then signal arguments follow. */ + static const gchar *GbArgTable[][16] = + { + {"GtkCList", "select_row", + "gint row", + "gint column", + "GdkEventButton *event"}, + {"GtkCList", "unselect_row", + "gint row", + "gint column", + "GdkEventButton *event"}, + {"GtkCList", "click_column", + "gint column"}, + + {"GtkCList", "resize_column", + "gint column", + "gint width"}, + + {"GtkCList", "extend_selection", + "GtkScrollType scroll_type", + "gfloat position", + "gboolean auto_start_selection"}, + {"GtkCList", "scroll_vertical", + "GtkScrollType scroll_type", + "gfloat position"}, + {"GtkCList", "scroll_horizontal", + "GtkScrollType scroll_type", + "gfloat position"}, + + {"GtkCTree", "tree_select_row", + "GtkCTreeNode *node", + "gint column"}, + {"GtkCTree", "tree_unselect_row", + "GtkCTreeNode *node", + "gint column"}, + {"GtkCTree", "tree_expand", + "GtkCTreeNode *node"}, + {"GtkCTree", "tree_collapse", + "GtkCTreeNode *node"}, + {"GtkCTree", "tree_move", + "GtkCTreeNode *node", + "GtkCTreeNode *new_parent", + "GtkCTreeNode *new_sibling"}, + {"GtkCTree", "change_focus_row_expansion", + "GtkCTreeExpansionType expansion"}, + + {"GtkEditable", "insert_text", + "gchar *new_text", + "gint new_text_length", + "gint *position"}, + {"GtkEditable", "delete_text", + "gint start_pos", + "gint end_pos"}, + {"GtkEditable", "set_editable", + "gboolean is_editable"}, + {"GtkEditable", "move_cursor", + "gint x", + "gint y"}, + {"GtkEditable", "move_word", + "gint num_words"}, + {"GtkEditable", "move_page", + "gint x", + "gint y"}, + {"GtkEditable", "move_to_row", + "gint row"}, + {"GtkEditable", "move_to_column", + "gint column"}, + + {"GtkEditable", "kill_char", + "gint direction"}, + {"GtkEditable", "kill_word", + "gint direction"}, + {"GtkEditable", "kill_line", + "gint direction"}, + + + {"GtkInputDialog", "enable_device", + "GdkDevice *deviceid"}, + {"GtkInputDialog", "disable_device", + "GdkDevice *deviceid"}, + + {"GtkListItem", "extend_selection", + "GtkScrollType scroll_type", + "gfloat position", + "gboolean auto_start_selection"}, + {"GtkListItem", "scroll_vertical", + "GtkScrollType scroll_type", + "gfloat position"}, + {"GtkListItem", "scroll_horizontal", + "GtkScrollType scroll_type", + "gfloat position"}, + + {"GtkMenuShell", "move_current", + "GtkMenuDirectionType direction"}, + {"GtkMenuShell", "activate_current", + "gboolean force_hide"}, + + + {"GtkNotebook", "switch_page", + "GtkNotebookPage *page", + "guint page_num"}, + {"GtkStatusbar", "text_pushed", + "guint context_id", + "gchar *text"}, + {"GtkStatusbar", "text_popped", + "guint context_id", + "gchar *text"}, + {"GtkTipsQuery", "widget_entered", + "GtkWidget *widget", + "gchar *tip_text", + "gchar *tip_private"}, + {"GtkTipsQuery", "widget_selected", + "GtkWidget *widget", + "gchar *tip_text", + "gchar *tip_private", + "GdkEventButton *event"}, + {"GtkToolbar", "orientation_changed", + "GtkOrientation orientation"}, + {"GtkToolbar", "style_changed", + "GtkToolbarStyle style"}, + {"GtkWidget", "draw", + "GdkRectangle *area"}, + {"GtkWidget", "size_request", + "GtkRequisition *requisition"}, + {"GtkWidget", "size_allocate", + "GtkAllocation *allocation"}, + {"GtkWidget", "state_changed", + "GtkStateType state"}, + {"GtkWidget", "style_set", + "GtkStyle *previous_style"}, + + {"GtkWidget", "install_accelerator", + "gchar *signal_name", + "gchar key", + "gint modifiers"}, + + {"GtkWidget", "add_accelerator", + "guint accel_signal_id", + "GtkAccelGroup *accel_group", + "guint accel_key", + "GdkModifierType accel_mods", + "GtkAccelFlags accel_flags"}, + + {"GtkWidget", "parent_set", + "GtkObject *old_parent"}, + + {"GtkWidget", "remove_accelerator", + "GtkAccelGroup *accel_group", + "guint accel_key", + "GdkModifierType accel_mods"}, + {"GtkWidget", "debug_msg", + "gchar *message"}, + {"GtkWindow", "move_resize", + "gint *x", + "gint *y", + "gint width", + "gint height"}, + {"GtkWindow", "set_focus", + "GtkWidget *widget"}, + + {"GtkWidget", "selection_get", + "GtkSelectionData *data", + "guint info", + "guint time"}, + {"GtkWidget", "selection_received", + "GtkSelectionData *data", + "guint time"}, + + {"GtkWidget", "drag_begin", + "GdkDragContext *drag_context"}, + {"GtkWidget", "drag_end", + "GdkDragContext *drag_context"}, + {"GtkWidget", "drag_data_delete", + "GdkDragContext *drag_context"}, + {"GtkWidget", "drag_leave", + "GdkDragContext *drag_context", + "guint time"}, + {"GtkWidget", "drag_motion", + "GdkDragContext *drag_context", + "gint x", + "gint y", + "guint time"}, + {"GtkWidget", "drag_drop", + "GdkDragContext *drag_context", + "gint x", + "gint y", + "guint time"}, + {"GtkWidget", "drag_data_get", + "GdkDragContext *drag_context", + "GtkSelectionData *data", + "guint info", + "guint time"}, + {"GtkWidget", "drag_data_received", + "GdkDragContext *drag_context", + "gint x", + "gint y", + "GtkSelectionData *data", + "guint info", + "guint time"}, + + {NULL} + }; + + gint i; + + for (i = 0; GbArgTable[i][0]; i++) + { +#if 1 + if (!strcmp (type, GbArgTable[i][0]) + && !strcmp (signal_name, GbArgTable[i][1])) + return &GbArgTable[i][2]; +#endif + } + return NULL; +} + +/* This outputs the hierarchy of all objects which have been initialized, + i.e. by calling their XXX_get_type() initialization function. */ +static void +output_object_hierarchy (void) +{ + FILE *fp; + gint i; + + fp = fopen (hierarchy_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", hierarchy_filename, strerror(errno)); + return; + } + output_hierarchy (fp, G_TYPE_OBJECT, 0); + output_hierarchy (fp, G_TYPE_INTERFACE, 0); + + for (i=0; object_types[i]; i++) { + if (!g_type_parent (object_types[i]) && + (object_types[i] != G_TYPE_NONE) && + (object_types[i] != G_TYPE_OBJECT) && + (object_types[i] != G_TYPE_INTERFACE) + ) { + g_warning ("printing hierarchy for root type: %s", + g_type_name (object_types[i])); + output_hierarchy (fp, object_types[i], 0); + } + } + /* for debugging + for (i=0; object_types[i]; i++) { + if(object_types[i] != G_TYPE_NONE) { + g_print ("type has not been added to hierarchy: %s\\n", + g_type_name (object_types[i])); + } + } + for debugging */ + + fclose (fp); +} + +/* This is called recursively to output the hierarchy of a widget. */ +static void +output_hierarchy (FILE *fp, + GType type, + guint level) +{ + guint i; + GType *children; + guint n_children; + + if (!type) + return; + + /* for debugging + for (i=0; object_types[i]; i++) { + if(object_types[i] == type) { + g_print ("added type to hierarchy (level %d): %s\\n", + level, g_type_name (type)); + object_types[i] = G_TYPE_NONE; + break; + } + } + for debugging */ + + for (i = 0; i < level; i++) + fprintf (fp, " "); + fprintf (fp, g_type_name (type)); + fprintf (fp, "\\n"); + + children = g_type_children (type, &n_children); + + for (i=0; i < n_children; i++) { + output_hierarchy (fp, children[i], level + 1); + } + + g_free (children); +} + +static void output_object_interfaces (void) +{ + guint i; + FILE *fp; + + fp = fopen (interfaces_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", interfaces_filename, strerror(errno)); + return; + } + output_interfaces (fp, G_TYPE_OBJECT); + + for (i = 0; object_types[i]; i++) + { + if (!g_type_parent (object_types[i]) && + (object_types[i] != G_TYPE_OBJECT) && + G_TYPE_IS_INSTANTIATABLE (object_types[i])) + { + output_interfaces (fp, object_types[i]); + } + } + fclose (fp); +} + +static void +output_interfaces (FILE *fp, + GType type) +{ + guint i; + GType *children, *interfaces; + guint n_children, n_interfaces; + + if (!type) + return; + + interfaces = g_type_interfaces (type, &n_interfaces); + + if (n_interfaces > 0) + { + fprintf (fp, g_type_name (type)); + for (i=0; i < n_interfaces; i++) + fprintf (fp, " %s", g_type_name (interfaces[i])); + fprintf (fp, "\\n"); + } + g_free (interfaces); + + children = g_type_children (type, &n_children); + + for (i=0; i < n_children; i++) + output_interfaces (fp, children[i]); + + g_free (children); +} + +static void output_interface_prerequisites (void) +{ + FILE *fp; + + fp = fopen (prerequisites_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", prerequisites_filename, strerror(errno)); + return; + } + output_prerequisites (fp, G_TYPE_INTERFACE); + fclose (fp); +} + +static void +output_prerequisites (FILE *fp, + GType type) +{ +#if GLIB_CHECK_VERSION(2,1,0) + guint i; + GType *children, *prerequisites; + guint n_children, n_prerequisites; + + if (!type) + return; + + prerequisites = g_type_interface_prerequisites (type, &n_prerequisites); + + if (n_prerequisites > 0) + { + fprintf (fp, g_type_name (type)); + for (i=0; i < n_prerequisites; i++) + fprintf (fp, " %s", g_type_name (prerequisites[i])); + fprintf (fp, "\\n"); + } + g_free (prerequisites); + + children = g_type_children (type, &n_children); + + for (i=0; i < n_children; i++) + output_prerequisites (fp, children[i]); + + g_free (children); +#endif +} + +static void +output_args (void) +{ + FILE *fp; + gint i; + + fp = fopen (args_filename, "w"); + if (fp == NULL) + { + g_warning ("Couldn't open output file: %s : %s", args_filename, strerror(errno)); + return; + } + + for (i = 0; object_types[i]; i++) { + output_object_args (fp, object_types[i]); + } + + fclose (fp); +} + +static gint +compare_param_specs (const void *a, const void *b) +{ + GParamSpec *spec_a = *(GParamSpec **)a; + GParamSpec *spec_b = *(GParamSpec **)b; + + return strcmp (g_param_spec_get_name (spec_a), g_param_spec_get_name (spec_b)); +} + +/* Its common to have unsigned properties restricted + * to the signed range. Therefore we make this look + * a bit nicer by spelling out the max constants. + */ + +/* Don't use "==" with floats, it might trigger a gcc warning. */ +#define GTKDOC_COMPARE_FLOAT(x, y) (x <= y && x >= y) + +static gchar* +describe_double_constant (gdouble value) +{ + gchar *desc; + + if (GTKDOC_COMPARE_FLOAT (value, G_MAXDOUBLE)) + desc = g_strdup ("G_MAXDOUBLE"); + else if (GTKDOC_COMPARE_FLOAT (value, G_MINDOUBLE)) + desc = g_strdup ("G_MINDOUBLE"); + else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXDOUBLE)) + desc = g_strdup ("-G_MAXDOUBLE"); + else if (GTKDOC_COMPARE_FLOAT (value, G_MAXFLOAT)) + desc = g_strdup ("G_MAXFLOAT"); + else if (GTKDOC_COMPARE_FLOAT (value, G_MINFLOAT)) + desc = g_strdup ("G_MINFLOAT"); + else if (GTKDOC_COMPARE_FLOAT (value, -G_MAXFLOAT)) + desc = g_strdup ("-G_MAXFLOAT"); + else + desc = g_strdup_printf ("%lg", value); + + return desc; +} + +static gchar* +describe_signed_constant (gint64 value) +{ + gchar *desc; + + if (value == G_MAXINT) + desc = g_strdup ("G_MAXINT"); + else if (value == G_MININT) + desc = g_strdup ("G_MININT"); + else if (value == G_MAXUINT) + desc = g_strdup ("G_MAXUINT"); + else if (value == G_MAXLONG) + desc = g_strdup ("G_MAXLONG"); + else if (value == G_MINLONG) + desc = g_strdup ("G_MINLONG"); + else if (value == G_MAXULONG) + desc = g_strdup ("G_MAXULONG"); + else if (value == G_MAXINT64) + desc = g_strdup ("G_MAXINT64"); + else if (value == G_MININT64) + desc = g_strdup ("G_MININT64"); + else + desc = g_strdup_printf ("%" G_GINT64_FORMAT, value); + + return desc; +} + +static gchar* +describe_unsigned_constant (guint64 value) +{ + gchar *desc; + + if (value == G_MAXINT) + desc = g_strdup ("G_MAXINT"); + else if (value == G_MININT) + desc = g_strdup ("G_MININT"); + else if (value == G_MAXUINT) + desc = g_strdup ("G_MAXUINT"); + else if (value == G_MAXLONG) + desc = g_strdup ("G_MAXLONG"); + else if (value == G_MINLONG) + desc = g_strdup ("G_MINLONG"); + else if (value == G_MAXULONG) + desc = g_strdup ("G_MAXULONG"); + else if (value == G_MAXINT64) + desc = g_strdup ("G_MAXINT64"); + else if (value == G_MININT64) + desc = g_strdup ("G_MININT64"); + else if (value == G_MAXUINT64) + desc = g_strdup ("G_MAXUINT64"); + else + desc = g_strdup_printf ("%" G_GUINT64_FORMAT, value); + + return desc; +} + +static gchar* +describe_type (GParamSpec *spec) +{ + gchar *desc; + gchar *lower; + gchar *upper; + + if (G_IS_PARAM_SPEC_CHAR (spec)) + { + GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec); + + lower = describe_signed_constant (pspec->minimum); + upper = describe_signed_constant (pspec->maximum); + if (pspec->minimum == G_MININT8 && pspec->maximum == G_MAXINT8) + desc = g_strdup (""); + else if (pspec->minimum == G_MININT8) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXINT8) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_UCHAR (spec)) + { + GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec); + + lower = describe_unsigned_constant (pspec->minimum); + upper = describe_unsigned_constant (pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT8) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXUINT8) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_INT (spec)) + { + GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec); + + lower = describe_signed_constant (pspec->minimum); + upper = describe_signed_constant (pspec->maximum); + if (pspec->minimum == G_MININT && pspec->maximum == G_MAXINT) + desc = g_strdup (""); + else if (pspec->minimum == G_MININT) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXINT) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_UINT (spec)) + { + GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec); + + lower = describe_unsigned_constant (pspec->minimum); + upper = describe_unsigned_constant (pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXUINT) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_LONG (spec)) + { + GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec); + + lower = describe_signed_constant (pspec->minimum); + upper = describe_signed_constant (pspec->maximum); + if (pspec->minimum == G_MINLONG && pspec->maximum == G_MAXLONG) + desc = g_strdup (""); + else if (pspec->minimum == G_MINLONG) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXLONG) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_ULONG (spec)) + { + GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec); + gchar *upper; + + lower = describe_unsigned_constant (pspec->minimum); + upper = describe_unsigned_constant (pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXULONG) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXULONG) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_INT64 (spec)) + { + GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec); + + lower = describe_signed_constant (pspec->minimum); + upper = describe_signed_constant (pspec->maximum); + if (pspec->minimum == G_MININT64 && pspec->maximum == G_MAXINT64) + desc = g_strdup (""); + else if (pspec->minimum == G_MININT64) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXINT64) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_UINT64 (spec)) + { + GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec); + + lower = describe_unsigned_constant (pspec->minimum); + upper = describe_unsigned_constant (pspec->maximum); + if (pspec->minimum == 0 && pspec->maximum == G_MAXUINT64) + desc = g_strdup (""); + else if (pspec->minimum == 0) + desc = g_strdup_printf ("<= %s", upper); + else if (pspec->maximum == G_MAXUINT64) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_FLOAT (spec)) + { + GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec); + + lower = describe_double_constant (pspec->minimum); + upper = describe_double_constant (pspec->maximum); + if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXFLOAT)) + { + if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)) + desc = g_strdup (""); + else + desc = g_strdup_printf ("<= %s", upper); + } + else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXFLOAT)) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else if (G_IS_PARAM_SPEC_DOUBLE (spec)) + { + GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec); + + lower = describe_double_constant (pspec->minimum); + upper = describe_double_constant (pspec->maximum); + if (GTKDOC_COMPARE_FLOAT (pspec->minimum, -G_MAXDOUBLE)) + { + if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)) + desc = g_strdup (""); + else + desc = g_strdup_printf ("<= %s", upper); + } + else if (GTKDOC_COMPARE_FLOAT (pspec->maximum, G_MAXDOUBLE)) + desc = g_strdup_printf (">= %s", lower); + else + desc = g_strdup_printf ("[%s,%s]", lower, upper); + g_free (lower); + g_free (upper); + } + else + { + desc = g_strdup (""); + } + + return desc; +} + +static gchar* +describe_default (GParamSpec *spec) +{ + gchar *desc; + + if (G_IS_PARAM_SPEC_CHAR (spec)) + { + GParamSpecChar *pspec = G_PARAM_SPEC_CHAR (spec); + + desc = g_strdup_printf ("%d", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UCHAR (spec)) + { + GParamSpecUChar *pspec = G_PARAM_SPEC_UCHAR (spec); + + desc = g_strdup_printf ("%u", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_BOOLEAN (spec)) + { + GParamSpecBoolean *pspec = G_PARAM_SPEC_BOOLEAN (spec); + + desc = g_strdup_printf ("%s", pspec->default_value ? "TRUE" : "FALSE"); + } + else if (G_IS_PARAM_SPEC_INT (spec)) + { + GParamSpecInt *pspec = G_PARAM_SPEC_INT (spec); + + desc = g_strdup_printf ("%d", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UINT (spec)) + { + GParamSpecUInt *pspec = G_PARAM_SPEC_UINT (spec); + + desc = g_strdup_printf ("%u", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_LONG (spec)) + { + GParamSpecLong *pspec = G_PARAM_SPEC_LONG (spec); + + desc = g_strdup_printf ("%ld", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_LONG (spec)) + { + GParamSpecULong *pspec = G_PARAM_SPEC_ULONG (spec); + + desc = g_strdup_printf ("%lu", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_INT64 (spec)) + { + GParamSpecInt64 *pspec = G_PARAM_SPEC_INT64 (spec); + + desc = g_strdup_printf ("%" G_GINT64_FORMAT, pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UINT64 (spec)) + { + GParamSpecUInt64 *pspec = G_PARAM_SPEC_UINT64 (spec); + + desc = g_strdup_printf ("%" G_GUINT64_FORMAT, pspec->default_value); + } + else if (G_IS_PARAM_SPEC_UNICHAR (spec)) + { + GParamSpecUnichar *pspec = G_PARAM_SPEC_UNICHAR (spec); + + if (g_unichar_isprint (pspec->default_value)) + desc = g_strdup_printf ("'%c'", pspec->default_value); + else + desc = g_strdup_printf ("%u", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_ENUM (spec)) + { + GParamSpecEnum *pspec = G_PARAM_SPEC_ENUM (spec); + + GEnumValue *value = g_enum_get_value (pspec->enum_class, pspec->default_value); + if (value) + desc = g_strdup_printf ("%s", value->value_name); + else + desc = g_strdup_printf ("%d", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_FLAGS (spec)) + { + GParamSpecFlags *pspec = G_PARAM_SPEC_FLAGS (spec); + guint default_value; + GString *acc; + + default_value = pspec->default_value; + acc = g_string_new (""); + + while (default_value) + { + GFlagsValue *value = g_flags_get_first_value (pspec->flags_class, default_value); + + if (!value) + break; + + if (acc->len > 0) + g_string_append (acc, "|"); + g_string_append (acc, value->value_name); + + default_value &= ~value->value; + } + + if (default_value == 0) + desc = g_string_free (acc, FALSE); + else + { + desc = g_strdup_printf ("%d", pspec->default_value); + g_string_free (acc, TRUE); + } + } + else if (G_IS_PARAM_SPEC_FLOAT (spec)) + { + GParamSpecFloat *pspec = G_PARAM_SPEC_FLOAT (spec); + + desc = g_strdup_printf ("%g", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_DOUBLE (spec)) + { + GParamSpecDouble *pspec = G_PARAM_SPEC_DOUBLE (spec); + + desc = g_strdup_printf ("%lg", pspec->default_value); + } + else if (G_IS_PARAM_SPEC_STRING (spec)) + { + GParamSpecString *pspec = G_PARAM_SPEC_STRING (spec); + + if (pspec->default_value) + { + gchar *esc = g_strescape (pspec->default_value, NULL); + + desc = g_strdup_printf ("\\"%s\\"", esc); + + g_free (esc); + } + else + desc = g_strdup_printf ("NULL"); + } + else + { + desc = g_strdup (""); + } + + return desc; +} + + +static void +output_object_args (FILE *fp, GType object_type) +{ + gpointer class; + const gchar *object_class_name; + guint arg; + gchar flags[16], *pos; + GParamSpec **properties; + guint n_properties; + gboolean child_prop; + gboolean style_prop; + gboolean is_pointer; + const gchar *type_name; + gchar *type_desc; + gchar *default_value; + + if (G_TYPE_IS_OBJECT (object_type)) + { + class = g_type_class_peek (object_type); + if (!class) + return; + + properties = g_object_class_list_properties (class, &n_properties); + } +#if GLIB_MAJOR_VERSION > 2 || (GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION >= 3) + else if (G_TYPE_IS_INTERFACE (object_type)) + { + class = g_type_default_interface_ref (object_type); + + if (!class) + return; + + properties = g_object_interface_list_properties (class, &n_properties); + } +#endif + else + return; + + object_class_name = g_type_name (object_type); + + child_prop = FALSE; + style_prop = FALSE; + + while (TRUE) { + qsort (properties, n_properties, sizeof (GParamSpec *), compare_param_specs); + for (arg = 0; arg < n_properties; arg++) + { + GParamSpec *spec = properties[arg]; + const gchar *nick, *blurb, *dot; + + if (spec->owner_type != object_type) + continue; + + pos = flags; + /* We use one-character flags for simplicity. */ + if (child_prop && !style_prop) + *pos++ = 'c'; + if (style_prop) + *pos++ = 's'; + if (spec->flags & G_PARAM_READABLE) + *pos++ = 'r'; + if (spec->flags & G_PARAM_WRITABLE) + *pos++ = 'w'; + if (spec->flags & G_PARAM_CONSTRUCT) + *pos++ = 'x'; + if (spec->flags & G_PARAM_CONSTRUCT_ONLY) + *pos++ = 'X'; + *pos = 0; + + nick = g_param_spec_get_nick (spec); + blurb = g_param_spec_get_blurb (spec); + + dot = ""; + if (blurb) { + int str_len = strlen (blurb); + if (str_len > 0 && blurb[str_len - 1] != '.') + dot = "."; + } + + type_desc = describe_type (spec); + default_value = describe_default (spec); + type_name = get_type_name (spec->value_type, &is_pointer); + fprintf (fp, "\\n%s::%s\\n%s%s\\n%s\\n%s\\n%s\\n%s%s\\n%s\\n\\n\\n", + object_class_name, g_param_spec_get_name (spec), type_name, is_pointer ? "*" : "", type_desc, flags, nick ? nick : "(null)", blurb ? blurb : "(null)", dot, default_value); + g_free (type_desc); + g_free (default_value); + } + + g_free (properties); + +#ifdef GTK_IS_CONTAINER_CLASS + if (!child_prop && GTK_IS_CONTAINER_CLASS (class)) { + properties = gtk_container_class_list_child_properties (class, &n_properties); + child_prop = TRUE; + continue; + } +#endif + +#ifdef GTK_IS_WIDGET_CLASS +#if GTK_CHECK_VERSION(2,1,0) + if (!style_prop && GTK_IS_WIDGET_CLASS (class)) { + properties = gtk_widget_class_list_style_properties (GTK_WIDGET_CLASS (class), &n_properties); + style_prop = TRUE; + continue; + } +#endif +#endif + + break; + } +} +EOT + +close OUTPUT; + +# Compile and run our file + +$CC = $ENV{CC} ? $ENV{CC} : "gcc"; +$LD = $ENV{LD} ? $ENV{LD} : $CC; +$CFLAGS = $ENV{CFLAGS} ? "$ENV{CFLAGS} -Wall -g" : "-Wall -g"; +$LDFLAGS = $ENV{LDFLAGS} ? $ENV{LDFLAGS} : ""; + +my $o_file; +if ($CC =~ /libtool/) { + $o_file = "$MODULE-scan.lo" +} else { + $o_file = "$MODULE-scan.o" +} + +print "gtk-doc: Compiling scanner\n"; +$command = "$CC $CFLAGS -c -o $o_file $MODULE-scan.c"; +system($command) == 0 or die "Compilation of scanner failed: $!\n"; + +print "gtk-doc: Linking scanner\n"; +$command = "$LD -o $MODULE-scan $o_file $LDFLAGS"; +system($command) == 0 or die "Linking of scanner failed: $!\n"; + +print "gtk-doc: Running scanner $MODULE-scan\n"; +system("sh -c ./$MODULE-scan") == 0 or die "Scan failed: $!\n"; + +unlink "./$MODULE-scan.c", "./$MODULE-scan.o", "./$MODULE-scan.lo", "./$MODULE-scan"; + +#&UpdateFileIfChanged ($old_signals_filename, $new_signals_filename, 0); +&UpdateFileIfChanged ($old_hierarchy_filename, $new_hierarchy_filename, 0); +&UpdateFileIfChanged ($old_interfaces_filename, $new_interfaces_filename, 0); +&UpdateFileIfChanged ($old_prerequisites_filename, $new_prerequisites_filename, 0); +#&UpdateFileIfChanged ($old_args_filename, $new_args_filename, 0); + + diff --git a/mobile/common/gtk-doc-plugins.mak b/mobile/common/gtk-doc-plugins.mak new file mode 100755 index 0000000..71f60ba --- /dev/null +++ b/mobile/common/gtk-doc-plugins.mak @@ -0,0 +1,397 @@ +# This is an include file specifically tuned for building documentation +# for GStreamer plug-ins + +help: + @echo + @echo "If you are a doc maintainer, run 'make update' to update" + @echo "the documentation files maintained in CVS" + @echo + @echo Other useful make targets: + @echo + @echo check-inspected-versions: make sure the inspected plugin info + @echo is up to date before a release + @echo + +# update the stuff maintained by doc maintainers +update: + $(MAKE) inspect-update + $(MAKE) scanobj-update + +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +# thomas: make docs parallel installable +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ + +EXTRA_DIST = \ + scanobj-build.stamp \ + $(srcdir)/inspect/*.xml \ + inspect.stamp \ + inspect-build.stamp \ + $(SCANOBJ_FILES) \ + $(content_files) \ + $(extra_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_OVERRIDES) \ + $(DOC_MODULE)-sections.txt + +MAINTAINER_DOC_STAMPS = \ + scanobj-build.stamp \ + inspect-build.stamp \ + inspect.stamp + +# we don't add inspect-build.stamp and scanobj-build.stamp here since they are +# built manually by docs maintainers and result is commited to CVS +DOC_STAMPS = \ + scan-build.stamp \ + tmpl-build.stamp \ + sgml-build.stamp \ + html-build.stamp \ + scan.stamp \ + tmpl.stamp \ + sgml.stamp \ + html.stamp + +# files generated/updated by gtkdoc-scangobj +SCANOBJ_FILES = \ + $(DOC_MODULE).signals \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + $(DOC_MODULE).types \ + $(DOC_MODULE).args + +SCANOBJ_FILES_O = \ + .libs/$(DOC_MODULE)-scan.o + +# files generated/updated by gtkdoc-scan +SCAN_FILES = \ + $(DOC_MODULE)-sections.txt \ + $(DOC_MODULE)-overrides.txt \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-decl.txt \ + $(DOC_MODULE)-decl-list.txt + + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +# FC3 seems to need -scan.c to be part of CLEANFILES for distcheck +# no idea why FC4 can do without +CLEANFILES = \ + $(SCANOBJ_FILES_O) \ + $(DOC_MODULE)-scan.c \ + $(REPORT_FILES) \ + $(DOC_STAMPS) \ + inspect-registry.xml + + +if ENABLE_GTK_DOC +all-local: html-build.stamp + +#### scan gobjects; done by documentation maintainer #### +scanobj-update: + -rm scanobj-build.stamp + $(MAKE) scanobj-build.stamp + +# in the case of non-srcdir builds, the built gst directory gets added +# to gtk-doc scanning; but only then, to avoid duplicates +# FIXME: since we don't have the scan step as part of the build anymore, +# we could remove that +# TODO: finish elite script that updates the output files of this step +# instead of rewriting them, so that multiple maintainers can generate +# a collective set of args and signals +scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles) + @echo '*** Scanning GObjects ***' + if test x"$(srcdir)" != x. ; then \ + for f in $(SCANOBJ_FILES); \ + do \ + cp $(srcdir)/$$f . ; \ + done; \ + else \ + $(INSPECT_ENVIRONMENT) \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ + CFLAGS="-g $(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" \ + $(GST_DOC_SCANOBJ) --type-init-func="gst_init(NULL,NULL)" \ + --module=$(DOC_MODULE) --source=$(PACKAGE) && \ + $(PYTHON) \ + $(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE); \ + fi + touch scanobj-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(SCANOBJ_FILES_O): scan-build.stamp + @true + +### inspect GStreamer plug-ins; done by documentation maintainer ### + +# only look at the plugins in this module when building inspect .xml stuff +INSPECT_REGISTRY=$(top_builddir)/docs/plugins/inspect-registry.xml +INSPECT_ENVIRONMENT=\ + GST_PLUGIN_SYSTEM_PATH= \ + GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src \ + GST_REGISTRY=$(INSPECT_REGISTRY) + +# update the element and plugin XML descriptions; store in inspect/ +inspect: + mkdir inspect + +inspect-update: inspect + -rm $(INSPECT_REGISTRY) + -rm inspect-build.stamp + $(MAKE) inspect-build.stamp + +# FIXME: inspect.stamp should be written to by gst-xmlinspect.py +# IF the output changed; see gtkdoc-mktmpl +inspect-build.stamp: + @echo '*** Rebuilding plugin inspection files ***' + if test x"$(srcdir)" != x. ; then \ + cp $(srcdir)/inspect.stamp . ; \ + cp $(srcdir)/inspect-build.stamp . ; \ + else \ + $(INSPECT_ENVIRONMENT) $(PYTHON) \ + $(top_srcdir)/common/gst-xmlinspect.py $(PACKAGE) inspect && \ + echo -n "timestamp" > inspect.stamp && \ + touch inspect-build.stamp; \ + fi + +### scan headers; done on every build ### +scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp inspect-build.stamp + if test "x$(top_srcdir)" != "x$(top_builddir)" && \ + test -d "$(top_builddir)/gst"; \ + then \ + export BUILT_OPTIONS="--source-dir=$(top_builddir)/gst"; \ + fi; \ + gtkdoc-scan \ + $(SCAN_OPTIONS) $(EXTRA_HFILES) \ + --module=$(DOC_MODULE) \ + $$BUILT_OPTIONS \ + --ignore-headers="$(IGNORE_HFILES)"; \ + touch scan-build.stamp + +#### update templates; done on every build #### + +### FIXME: make this error out again when docs are fixed for 0.9 +# in a non-srcdir build, we need to copy files from the previous step +# and the files from previous runs of this step +tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES) + @echo '*** Rebuilding template files ***' + if test x"$(srcdir)" != x. ; then \ + for f in $(SCANOBJ_FILES) $(SCAN_FILES); \ + do \ + if test -e $(srcdir)/$$f; then cp $(srcdir)/$$f . ; fi; \ + done; \ + fi + gtkdoc-mktmpl --module=$(DOC_MODULE) | tee tmpl-build.log + $(PYTHON) \ + $(top_srcdir)/common/mangle-tmpl.py $(srcdir)/inspect tmpl + @cat $(DOC_MODULE)-unused.txt + rm -f tmpl-build.log + touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +#### build xml; done on every build #### + +### FIXME: make this error out again when docs are fixed for 0.9 +sgml-build.stamp: tmpl.stamp inspect.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl + @echo '*** Building XML ***' + @-mkdir -p xml + @for a in $(srcdir)/inspect/*.xml; do \ + xsltproc --stringparam module $(MODULE) \ + $(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done + @for f in $(EXAMPLE_CFILES); do \ + $(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done + gtkdoc-mkdb \ + --module=$(DOC_MODULE) \ + --source-dir=$(DOC_SOURCE_DIR) \ + --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \ + --output-format=xml \ + --ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \ + $(MKDB_OPTIONS) \ + | tee sgml-build.log + @if grep "WARNING:" sgml-build.log > /dev/null; then true; fi # exit 1; fi + cp ../version.entities xml + rm sgml-build.log + touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### build html; done on every step #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo '*** Building HTML ***' + if test -d html; then rm -rf html; fi + mkdir html + cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html + @for f in $(content_files); do cp $(srcdir)/$$f html; done + cp -pr xml html + cp ../version.entities html + cd html && gtkdoc-mkhtml $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) \ + 2>&1 | tee ../html-build.log + @if grep "warning:" html-build.log > /dev/null; then \ + echo "ERROR"; grep "warning:" html-build.log; exit 1; fi + @rm html-build.log + mv html/index.sgml html/index.sgml.bak + $(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml + rm -f html/index.sgml.bak + rm -f html/$(DOC_MAIN_SGML_FILE) + rm -rf html/xml + rm -f html/version.entities + test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \ + if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done + @echo '-- Fixing Crossreferences' + gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + touch html-build.stamp +else +all-local: +endif + +# FIXME: these rules need a little cleaning up +clean-local: + rm -f *~ *.bak + rm -rf .libs +# clean files generated for tmpl build + -rm -rf tmpl +# clean files copied/generated for nonsrcdir tmpl build + if test x"$(srcdir)" != x. ; then \ + rm -rf $(SCANOBJ_FILES) $(SCAN_FILES); \ + fi +# clean files generated for xml build + -rm -rf xml +# clean files generate for html build + -rm -rf html + +distclean-local: clean + rm -rf tmpl/*.sgml.bak + rm -f *.stamp || true + rm -rf *.o + +# thomas: make docs parallel installable; devhelp requires majorminor too +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR) + (installfiles=`echo ./html/*.html`; \ + if test "$$installfiles" = './html/*.html'; \ + then echo '-- Nothing to install' ; \ + else \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + pngfiles=`echo ./html/*.png`; \ + if test "$$pngfiles" != './html/*.png'; then \ + for i in $$pngfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + fi; \ + echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \ + $(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \ + if test -e $(srcdir)/html/$(DOC_MODULE).devhelp2; then \ + $(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp2 \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + echo '-- Installing $(srcdir)/html/index.sgml' ; \ + $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \ + if test -e $(srcdir)/html/style.css; then \ + echo '-- Installing $(srcdir)/html/style.css' ; \ + $(INSTALL_DATA) $(srcdir)/html/style.css $(DESTDIR)$(TARGET_DIR); \ + fi; \ + fi) +uninstall-local: + (installfiles=`echo ./html/*.html`; \ + if test "$$installfiles" = './html/*.html'; \ + then echo '-- Nothing to uninstall' ; \ + else \ + for i in $$installfiles; do \ + rmfile=`basename $$i` ; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \ + done; \ + pngfiles=`echo ./html/*.png`; \ + if test "$$pngfiles" != './html/*.png'; then \ + for i in $$pngfiles; do \ + rmfile=`basename $$i` ; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \ + done; \ + fi; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE).devhelp' ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \ + if test -e $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; then \ + rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \ + if test -e $(DESTDIR)$(TARGET_DIR)/style.css; then \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/style.css' ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/style.css; \ + fi; \ + fi) + if test -d $(DESTDIR)$(TARGET_DIR); then rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR) 2>/dev/null; fi; true + +# +# Checks +# +check-hierarchy: $(DOC_MODULE).hierarchy + @if grep ' ' $(DOC_MODULE).hierarchy; then \ + echo "$(DOC_MODULE).hierarchy contains tabs, please fix"; \ + /bin/false; \ + fi + +check: check-hierarchy + +# wildcard is apparently not portable to other makes, hence the use of find +inspect_files = $(shell find $(top_srcdir)/docs/plugins/inspect -name '*.xml') + +check-inspected-versions: + @echo Checking plugin versions of inspected plugin data ...; \ + fail=0 ; \ + for each in $(inspect_files) ; do \ + if (grep -H '' $$each | grep -v '$(VERSION)'); then \ + echo $$each should be fixed to say version $(VERSION) or be removed ; \ + echo "sed -i -e 's//$(VERSION)<\/version>/'" $$each; \ + echo ; \ + fail=1; \ + fi ; \ + done ; \ + exit $$fail + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +# FIXME: decide whether we want to dist generated html or not +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/tmpl + mkdir $(distdir)/xml + mkdir $(distdir)/html + -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + -cp $(srcdir)/sgml/*.xml $(distdir)/xml + -cp $(srcdir)/html/index.sgml $(distdir)/html + -cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html + -cp $(srcdir)/html/$(DOC_MODULE).devhelp* $(distdir)/html + + images=$(HTML_IMAGES) ; \ + for i in "" $$images ; do \ + if test "$$i" != ""; then cp $(srcdir)/$$i $(distdir)/html ; fi; \ + done + +.PHONY : dist-hook-local + diff --git a/mobile/common/gtk-doc.mak b/mobile/common/gtk-doc.mak new file mode 100755 index 0000000..1c9ece1 --- /dev/null +++ b/mobile/common/gtk-doc.mak @@ -0,0 +1,267 @@ +########################################################################### +# Everything below here is generic and you shouldn't need to change it. +########################################################################### +# thomas: except of course that we did + +# thomas: copied from glib-2 +# We set GPATH here; this gives us semantics for GNU make +# which are more like other make's VPATH, when it comes to +# whether a source that is a target of one rule is then +# searched for in VPATH/GPATH. +# +GPATH = $(srcdir) + +# thomas: make docs parallel installable +TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@ + +EXTRA_DIST = \ + $(content_files) \ + $(extra_files) \ + $(HTML_IMAGES) \ + $(DOC_MAIN_SGML_FILE) \ + $(DOC_MODULE).types \ + $(DOC_OVERRIDES) \ + $(DOC_MODULE)-sections.txt + +DOC_STAMPS = \ + scan-build.stamp \ + tmpl-build.stamp \ + sgml-build.stamp \ + html-build.stamp \ + $(srcdir)/tmpl.stamp \ + $(srcdir)/sgml.stamp \ + $(srcdir)/html.stamp + +SCANOBJ_FILES = \ + $(DOC_MODULE).args \ + $(DOC_MODULE).hierarchy \ + $(DOC_MODULE).interfaces \ + $(DOC_MODULE).prerequisites \ + .libs/$(DOC_MODULE)-scan.o \ + $(DOC_MODULE).signals + +REPORT_FILES = \ + $(DOC_MODULE)-undocumented.txt \ + $(DOC_MODULE)-undeclared.txt \ + $(DOC_MODULE)-unused.txt + +CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) + +if ENABLE_GTK_DOC +all-local: html-build.stamp + +#### scan #### + +# in the case of non-srcdir builds, the built gst directory gets added +# to gtk-doc scanning; but only then, to avoid duplicates +scan-build.stamp: $(HFILE_GLOB) $(SCANOBJ_DEPS) $(basefiles) + @echo '*** Scanning header files ***' + if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null; \ + then \ + if test x"$(srcdir)" != x. ; then \ + cp $(srcdir)/$(DOC_MODULE).types . ; \ + chmod u+w $(DOC_MODULE).types ; \ + fi ; \ + GST_PLUGIN_SYSTEM_PATH=`cd $(top_builddir) && pwd` \ + GST_PLUGIN_PATH= \ + CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \ + CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" \ + gtkdoc-scangobj --type-init-func="gst_init(NULL,NULL)" \ + --module=$(DOC_MODULE) ; \ + else \ + cd $(srcdir) ; \ + for i in $(SCANOBJ_FILES) ; do \ + test -f $$i || touch $$i ; \ + done \ + fi + if test "x$(top_srcdir)" != "x$(top_builddir)"; \ + then \ + export BUILT_OPTIONS="--source-dir=$(DOC_BUILD_DIR)"; \ + fi; \ + gtkdoc-scan \ + $(SCAN_OPTIONS) $(EXTRA_HFILES) \ + --module=$(DOC_MODULE) \ + --source-dir=$(DOC_SOURCE_DIR) \ + $$BUILT_OPTIONS \ + --ignore-headers="$(IGNORE_HFILES)" + touch scan-build.stamp + +$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES): scan-build.stamp + @true + +#### templates #### + +tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES) + @echo '*** Rebuilding template files ***' + if test x"$(srcdir)" != x. ; then \ + cp $(srcdir)/$(DOC_MODULE)-sections.txt . ; \ + touch $(DOC_MODULE)-decl.txt ; \ + fi + gtkdoc-mktmpl --module=$(DOC_MODULE) | tee tmpl-build.log + @if test -s $(DOC_MODULE)-unused.txt; then \ + exit $(if $(DOCS_ARE_INCOMPLETE_PLEASE_FIXME),0,1); fi + rm -f tmpl-build.log + touch tmpl-build.stamp + +tmpl.stamp: tmpl-build.stamp + @true + +#### xml #### + +### FIXME: make this error out again when docs are complete +sgml-build.stamp: tmpl.stamp $(CFILE_GLOB) + @echo '*** Building XML ***' + gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS) | tee sgml-build.log + @if grep "WARNING:" sgml-build.log > /dev/null; then true; fi # exit 1; fi + rm sgml-build.log + touch sgml-build.stamp + +sgml.stamp: sgml-build.stamp + @true + +#### html #### + +html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) + @echo '*** Building HTML ***' + if test -d html; then rm -rf html; fi + mkdir html + cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html + @for f in $(content_files); do cp $(srcdir)/$$f html; done + cp -pr xml html + cp ../version.entities html + cd html && gtkdoc-mkhtml $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) + mv html/index.sgml html/index.sgml.bak + $(SED) "s/ href=\"$(DOC_MODULE)\// href=\"$(DOC_MODULE)-@GST_MAJORMINOR@\//g" html/index.sgml.bak >html/index.sgml + rm -f html/index.sgml.bak + rm -f html/$(DOC_MAIN_SGML_FILE) + rm -rf html/xml + rm -f html/version.entities + test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \ + if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done + @echo '-- Fixing Crossreferences' + gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) + touch html-build.stamp +else +all-local: +endif + +clean-local: + rm -f *~ *.bak + rm -rf xml html + rm -rf .libs + +maintainer-clean-local: clean + cd $(srcdir) && rm -rf xml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt + +# company: don't delete .sgml and -sections.txt as they're in CVS +# FIXME : thomas added all sgml files and some other things to make +# make distcheck work +distclean-local: clean + rm -f $(DOC_MODULE)-decl-list.txt + rm -f $(DOC_MODULE)-decl.txt + rm -f $(REPORT_FILES) + rm -rf tmpl/*.sgml.bak + rm -f $(DOC_MODULE).hierarchy + rm -f *.stamp || true + if test x"$(srcdir)" != x. ; then \ + rm -f $(DOC_MODULE)-docs.sgml ; \ + rm -f $(DOC_MODULE).types ; \ + rm -f $(DOC_MODULE).interfaces ; \ + rm -f $(DOC_MODULE)-overrides.txt ; \ + rm -f $(DOC_MODULE).prerequisites ; \ + rm -f $(DOC_MODULE)-sections.txt ; \ + rm -rf tmpl/*.sgml ; \ + fi + rm -rf *.o + +# thomas: make docs parallel installable; devhelp requires majorminor too +install-data-local: + $(mkinstalldirs) $(DESTDIR)$(TARGET_DIR) + (installfiles=`echo ./html/*.html`; \ + if test "$$installfiles" = './html/*.html'; \ + then echo '-- Nothing to install' ; \ + else \ + for i in $$installfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + pngfiles=`echo ./html/*.png`; \ + if test "$$pngfiles" != './html/*.png'; then \ + for i in $$pngfiles; do \ + echo '-- Installing '$$i ; \ + $(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \ + done; \ + fi; \ + echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \ + $(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \ + if test -e $(srcdir)/html/$(DOC_MODULE).devhelp2; then \ + $(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp2 \ + $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + echo '-- Installing $(srcdir)/html/index.sgml' ; \ + $(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \ + if test -e $(srcdir)/html/style.css; then \ + echo '-- Installing $(srcdir)/html/style.css' ; \ + $(INSTALL_DATA) $(srcdir)/html/style.css $(DESTDIR)$(TARGET_DIR); \ + fi; \ + fi) +uninstall-local: + (installfiles=`echo ./html/*.html`; \ + if test "$$installfiles" = './html/*.html'; \ + then echo '-- Nothing to uninstall' ; \ + else \ + for i in $$installfiles; do \ + rmfile=`basename $$i` ; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \ + done; \ + pngfiles=`echo ./html/*.png`; \ + if test "$$pngfiles" != './html/*.png'; then \ + for i in $$pngfiles; do \ + rmfile=`basename $$i` ; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \ + done; \ + fi; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE).devhelp' ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \ + if test -e $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; then \ + rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \ + fi; \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \ + if test -e $(DESTDIR)$(TARGET_DIR)/style.css; then \ + echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/style.css' ; \ + rm -f $(DESTDIR)$(TARGET_DIR)/style.css; \ + fi; \ + fi) + if test -d $(DESTDIR)$(TARGET_DIR); then rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR) 2>/dev/null; fi; true + +# +# Require gtk-doc when making dist +# +if ENABLE_GTK_DOC +dist-check-gtkdoc: +else +dist-check-gtkdoc: + @echo "*** gtk-doc must be installed and enabled in order to make dist" + @false +endif + +dist-hook: dist-check-gtkdoc dist-hook-local + mkdir $(distdir)/tmpl + mkdir $(distdir)/xml + mkdir $(distdir)/html + -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl + -cp $(srcdir)/sgml/*.xml $(distdir)/xml + -cp $(srcdir)/html/index.sgml $(distdir)/html + -cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html + -cp $(srcdir)/html/$(DOC_MODULE).devhelp* $(distdir)/html + + images=$(HTML_IMAGES) ; \ + for i in "" $$images ; do \ + if test "$$i" != ""; then cp $(srcdir)/$$i $(distdir)/html ; fi; \ + done + +.PHONY : dist-hook-local diff --git a/mobile/common/m4/Makefile.am b/mobile/common/m4/Makefile.am new file mode 100644 index 0000000..99ead5c --- /dev/null +++ b/mobile/common/m4/Makefile.am @@ -0,0 +1,29 @@ +EXTRA_DIST = \ + README \ + as-ac-expand.m4 \ + as-auto-alt.m4 \ + as-compiler-flag.m4 \ + as-compiler.m4 \ + as-docbook.m4 \ + as-gcc-inline-assembly.m4 \ + as-libtool.m4 \ + as-libtool-tags.m4 \ + as-python.m4 \ + as-scrub-include.m4 \ + as-version.m4 \ + ax_create_stdint_h.m4 \ + glib-gettext.m4 \ + gst-arch.m4 \ + gst-args.m4 \ + gst-check.m4 \ + gst-debuginfo.m4 \ + gst-default.m4 \ + gst-doc.m4 \ + gst-feature.m4 \ + gst-function.m4 \ + gst-gettext.m4 \ + gst-glib2.m4 \ + gst-libxml2.m4 \ + gst-plugindir.m4 \ + gst-valgrind.m4 \ + pkg.m4 diff --git a/mobile/common/m4/README b/mobile/common/m4/README new file mode 100755 index 0000000..f044598 --- /dev/null +++ b/mobile/common/m4/README @@ -0,0 +1,3 @@ +All aclocal .m4 files we need are put here and cat'd to acinclude.m4 in +the source root. Official ones (taken from the relevant devel packages) +are named as-is, unofficial ones (or changed ones) get a gst-prefix. diff --git a/mobile/common/m4/as-ac-expand.m4 b/mobile/common/m4/as-ac-expand.m4 new file mode 100755 index 0000000..d6c9e33 --- /dev/null +++ b/mobile/common/m4/as-ac-expand.m4 @@ -0,0 +1,43 @@ +dnl as-ac-expand.m4 0.2.0 +dnl autostars m4 macro for expanding directories using configure's prefix +dnl thomas@apestaart.org + +dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR) +dnl example +dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir) +dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local + +AC_DEFUN([AS_AC_EXPAND], +[ + EXP_VAR=[$1] + FROM_VAR=[$2] + + dnl first expand prefix and exec_prefix if necessary + prefix_save=$prefix + exec_prefix_save=$exec_prefix + + dnl if no prefix given, then use /usr/local, the default prefix + if test "x$prefix" = "xNONE"; then + prefix="$ac_default_prefix" + fi + dnl if no exec_prefix given, then use prefix + if test "x$exec_prefix" = "xNONE"; then + exec_prefix=$prefix + fi + + full_var="$FROM_VAR" + dnl loop until it doesn't change anymore + while true; do + new_full_var="`eval echo $full_var`" + if test "x$new_full_var" = "x$full_var"; then break; fi + full_var=$new_full_var + done + + dnl clean up + full_var=$new_full_var + AC_SUBST([$1], "$full_var") + + dnl restore prefix and exec_prefix + prefix=$prefix_save + exec_prefix=$exec_prefix_save +]) diff --git a/mobile/common/m4/as-auto-alt.m4 b/mobile/common/m4/as-auto-alt.m4 new file mode 100755 index 0000000..3f7920d --- /dev/null +++ b/mobile/common/m4/as-auto-alt.m4 @@ -0,0 +1,50 @@ +dnl as-auto-alt.m4 0.0.2 +dnl autostars m4 macro for supplying alternate autotools versions to configure +dnl thomas@apestaart.org +dnl +dnl AS_AUTOTOOLS_ALTERNATE() +dnl +dnl supplies --with arguments for autoconf, autoheader, automake, aclocal + +AC_DEFUN([AS_AUTOTOOLS_ALTERNATE], +[ + dnl allow for different autoconf version + AC_ARG_WITH(autoconf, + AC_HELP_STRING([--with-autoconf], + [use a different autoconf for regeneration of Makefiles]), + [ + unset AUTOCONF + AM_MISSING_PROG(AUTOCONF, ${withval}) + AC_MSG_NOTICE([Using $AUTOCONF as autoconf]) + ]) + + dnl allow for different autoheader version + AC_ARG_WITH(autoheader, + AC_HELP_STRING([--with-autoheader], + [use a different autoheader for regeneration of Makefiles]), + [ + unset AUTOHEADER + AM_MISSING_PROG(AUTOHEADER, ${withval}) + AC_MSG_NOTICE([Using $AUTOHEADER as autoheader]) + ]) + + dnl allow for different automake version + AC_ARG_WITH(automake, + AC_HELP_STRING([--with-automake], + [use a different automake for regeneration of Makefiles]), + [ + unset AUTOMAKE + AM_MISSING_PROG(AUTOMAKE, ${withval}) + AC_MSG_NOTICE([Using $AUTOMAKE as automake]) + ]) + + dnl allow for different aclocal version + AC_ARG_WITH(aclocal, + AC_HELP_STRING([--with-aclocal], + [use a different aclocal for regeneration of Makefiles]), + [ + unset ACLOCAL + AM_MISSING_PROG(ACLOCAL, ${withval}) + AC_MSG_NOTICE([Using $ACLOCAL as aclocal]) + ]) +]) diff --git a/mobile/common/m4/as-compiler-flag.m4 b/mobile/common/m4/as-compiler-flag.m4 new file mode 100755 index 0000000..882a4c7 --- /dev/null +++ b/mobile/common/m4/as-compiler-flag.m4 @@ -0,0 +1,64 @@ +dnl as-compiler-flag.m4 0.1.0 + +dnl autostars m4 macro for detection of compiler flags + +dnl David Schleef +dnl Tim-Philipp Müller + +dnl AS_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_COMPILER_FLAG], +[ + AC_MSG_CHECKING([to see if compiler understands $1]) + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1" + + AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + $2 + true + else + $3 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + +dnl AS_CXX_COMPILER_FLAG(CPPFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CPPFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_CXX_COMPILER_FLAG], +[ + AC_REQUIRE([AC_PROG_CXX]) + + AC_MSG_CHECKING([to see if c++ compiler understands $1]) + + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $1" + + AC_LANG_PUSH(C++) + + AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) + CPPFLAGS="$save_CPPFLAGS" + + if test "X$flag_ok" = Xyes ; then + $2 + true + else + $3 + true + fi + + AC_LANG_POP(C++) + + AC_MSG_RESULT([$flag_ok]) +]) + diff --git a/mobile/common/m4/as-compiler.m4 b/mobile/common/m4/as-compiler.m4 new file mode 100755 index 0000000..233a719 --- /dev/null +++ b/mobile/common/m4/as-compiler.m4 @@ -0,0 +1,44 @@ +dnl as-compiler.m4 0.1.0 + +dnl autostars m4 macro for detection of compiler flavor + +dnl Thomas Vander Stichele + +dnl $Id: as-compiler.m4,v 1.4 2004/06/01 09:33:45 thomasvs Exp $ + +dnl AS_COMPILER(COMPILER) +dnl will set variable COMPILER to +dnl - gcc +dnl - forte +dnl - (empty) if no guess could be made + +AC_DEFUN([AS_COMPILER], +[ + as_compiler= + AC_MSG_CHECKING(for compiler flavour) + + dnl is it gcc ? + if test "x$GCC" = "xyes"; then + as_compiler="gcc" + fi + + dnl is it forte ? + AC_TRY_RUN([ +int main +(int argc, char *argv[]) +{ +#ifdef __sun + return 0; +#else + return 1; +#endif +} + ], as_compiler="forte", ,) + + if test "x$as_compiler" = "x"; then + AC_MSG_RESULT([unknown !]) + else + AC_MSG_RESULT($as_compiler) + fi + [$1]=$as_compiler +]) diff --git a/mobile/common/m4/as-docbook.m4 b/mobile/common/m4/as-docbook.m4 new file mode 100755 index 0000000..8a1b32a --- /dev/null +++ b/mobile/common/m4/as-docbook.m4 @@ -0,0 +1,66 @@ +dnl AS_DOCBOOK([, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl checks if xsltproc can build docbook documentation +dnl (which is possible if the catalog is set up properly +dnl I also tried checking for a specific version and type of docbook +dnl but xsltproc seemed to happily run anyway, so we can't check for that +dnl and version +dnl this macro takes inspiration from +dnl http://www.movement.uklinux.net/docs/docbook-autotools/configure.html +AC_DEFUN([AS_DOCBOOK], +[ + XSLTPROC_FLAGS=--nonet + DOCBOOK_ROOT= + TYPE_LC=xml + TYPE_UC=XML + DOCBOOK_VERSION=4.1.2 + + if test ! -f /etc/xml/catalog; then + for i in /usr/share/sgml/docbook/stylesheet/xsl/nwalsh /usr/share/sgml/docbook/xsl-stylesheets/ /usr/local/share/xsl/docbook ; + do + if test -d "$i"; then + DOCBOOK_ROOT=$i + fi + done + else + XML_CATALOG=/etc/xml/catalog + CAT_ENTRY_START='' + fi + + dnl We need xsltproc to process the test + AC_CHECK_PROG(XSLTPROC,xsltproc,xsltproc,) + XSLTPROC_WORKS=no + if test -n "$XSLTPROC"; then + AC_MSG_CHECKING([whether xsltproc docbook processing works]) + + if test -n "$XML_CATALOG"; then + DB_FILE="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl" + else + DB_FILE="$DOCBOOK_ROOT/xhtml/docbook.xsl" + fi + $XSLTPROC $XSLTPROC_FLAGS $DB_FILE >/dev/null 2>&1 << END + + + + +END + if test "$?" = 0; then + XSLTPROC_WORKS=yes + fi + AC_MSG_RESULT($XSLTPROC_WORKS) + fi + + if test "x$XSLTPROC_WORKS" = "xyes"; then + dnl execute ACTION-IF-FOUND + ifelse([$1], , :, [$1]) + else + dnl execute ACTION-IF-NOT-FOUND + ifelse([$2], , :, [$2]) + fi + + AC_SUBST(XML_CATALOG) + AC_SUBST(XSLTPROC_FLAGS) + AC_SUBST(DOCBOOK_ROOT) + AC_SUBST(CAT_ENTRY_START) + AC_SUBST(CAT_ENTRY_END) +]) diff --git a/mobile/common/m4/as-gcc-inline-assembly.m4 b/mobile/common/m4/as-gcc-inline-assembly.m4 new file mode 100755 index 0000000..799e80e --- /dev/null +++ b/mobile/common/m4/as-gcc-inline-assembly.m4 @@ -0,0 +1,52 @@ +dnl as-gcc-inline-assembly.m4 0.1.0 + +dnl autostars m4 macro for detection of gcc inline assembly + +dnl David Schleef + +dnl $Id: as-gcc-inline-assembly.m4,v 1.1 2008-02-26 09:38:00 thaytan Exp $ + +dnl AS_COMPILER_FLAG(ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED]) +dnl Tries to compile with the given CFLAGS. +dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags, +dnl and ACTION-IF-NOT-ACCEPTED otherwise. + +AC_DEFUN([AS_GCC_INLINE_ASSEMBLY], +[ + AC_MSG_CHECKING([if compiler supports gcc-style inline assembly]) + + AC_TRY_COMPILE([], [ +#ifdef __GNUC_MINOR__ +#if (__GNUC__ * 1000 + __GNUC_MINOR__) < 3004 +#error GCC before 3.4 has critical bugs compiling inline assembly +#endif +#endif +__asm__ (""::) ], [flag_ok=yes], [flag_ok=no]) + + if test "X$flag_ok" = Xyes ; then + $1 + true + else + $2 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + + +AC_DEFUN([AS_GCC_ASM_POWERPC_FPU], +[ + AC_MSG_CHECKING([if compiler supports FPU instructions on PowerPC]) + + AC_TRY_COMPILE([], [__asm__ ("fadd 0,0,0"::) ], [flag_ok=yes], [flag_ok=no]) + + if test "X$flag_ok" = Xyes ; then + $1 + true + else + $2 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + diff --git a/mobile/common/m4/as-libtool-tags.m4 b/mobile/common/m4/as-libtool-tags.m4 new file mode 100755 index 0000000..c522ff2 --- /dev/null +++ b/mobile/common/m4/as-libtool-tags.m4 @@ -0,0 +1,83 @@ +dnl as-libtool-tags.m4 0.1.4 + +dnl autostars m4 macro for selecting libtool "tags" (languages) + +dnl Andy Wingo does not claim credit for this macro +dnl backported from libtool 1.6 by Paolo Bonzini +dnl see http://lists.gnu.org/archive/html/libtool/2003-12/msg00007.html + +dnl $Id: as-libtool-tags.m4,v 1.3 2006-04-01 15:30:56 thomasvs Exp $ + +dnl AS_LIBTOOL_TAGS([tags...]) + +dnl example +dnl AS_LIBTOOL_TAGS([]) for only C (no fortran, etc) + +dnl When AC_LIBTOOL_TAGS is used, I redefine _LT_AC_TAGCONFIG +dnl to be more similar to the libtool 1.6 implementation, which +dnl uses an m4 loop and m4 case instead of a shell loop. This +dnl way the CXX/GCJ/F77/RC tests are not always expanded. + +dnl AS_LIBTOOL_TAGS +dnl --------------- +dnl tags to enable +AC_DEFUN([AS_LIBTOOL_TAGS], +[m4_define([_LT_TAGS],[$1]) +m4_define([_LT_AC_TAGCONFIG], [ + # redefined LT AC TAGCONFIG + if test -f "$ltmain"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + AC_FOREACH([_LT_TAG], _LT_TAGS, + echo THOMAS: tag _LT_TAG + [m4_case(_LT_TAG, + [CXX], [ + if test -n "$CXX" && test "X$CXX" != "Xno"; then + echo "THOMAS: YAY CXX" + AC_LIBTOOL_LANG_CXX_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [F77], [ + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [GCJ], [ + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [RC], [ + if test -n "$RC" && test "X$RC" != "Xno"; then + AC_LIBTOOL_LANG_RC_CONFIG + available_tags="$available_tags _LT_TAG" + fi], + [m4_errprintn(m4_location[: error: invalid tag name: ]"_LT_TAG") + m4_exit(1)]) + ]) + echo THOMAS: available tags: $available_tags + fi + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + AC_MSG_NOTICE([updated available libtool tags with $available_tags.]) + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + + fi + +])dnl _LT_AC_TAG_CONFIG +]) diff --git a/mobile/common/m4/as-libtool.m4 b/mobile/common/m4/as-libtool.m4 new file mode 100755 index 0000000..73dec1f --- /dev/null +++ b/mobile/common/m4/as-libtool.m4 @@ -0,0 +1,45 @@ +dnl as-libtool.m4 0.1.4 + +dnl autostars m4 macro for libtool versioning + +dnl Thomas Vander Stichele + +dnl $Id: as-libtool.m4,v 1.6 2004/06/01 10:04:44 thomasvs Exp $ + +dnl AS_LIBTOOL(PREFIX, CURRENT, REVISION, AGE, [RELEASE]) + +dnl example +dnl AS_LIBTOOL(GST, 2, 0, 0) + +dnl this macro +dnl - defines [$PREFIX]_CURRENT, REVISION and AGE +dnl - defines [$PREFIX]_LIBVERSION +dnl - defines [$PREFIX]_LT_LDFLAGS to set versioning +dnl - AC_SUBST's them all + +dnl if RELEASE is given, then add a -release option to the LDFLAGS +dnl with the given release version +dnl then use [$PREFIX]_LT_LDFLAGS in the relevant Makefile.am's + +dnl call AM_PROG_LIBTOOL after this call + +AC_DEFUN([AS_LIBTOOL], +[ + [$1]_CURRENT=[$2] + [$1]_REVISION=[$3] + [$1]_AGE=[$4] + [$1]_LIBVERSION=[$2]:[$3]:[$4] + AC_SUBST([$1]_CURRENT) + AC_SUBST([$1]_REVISION) + AC_SUBST([$1]_AGE) + AC_SUBST([$1]_LIBVERSION) + + [$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -version-info $[$1]_LIBVERSION" + if test ! -z "[$5]" + then + [$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -release [$5]" + fi + AC_SUBST([$1]_LT_LDFLAGS) + + AC_LIBTOOL_DLOPEN +]) diff --git a/mobile/common/m4/as-python.m4 b/mobile/common/m4/as-python.m4 new file mode 100755 index 0000000..eb9b175 --- /dev/null +++ b/mobile/common/m4/as-python.m4 @@ -0,0 +1,152 @@ +## ------------------------ +## Python file handling +## From Andrew Dalke +## Updated by James Henstridge +## Updated by Andy Wingo to loop through possible pythons +## ------------------------ + +# AS_PATH_PYTHON([MINIMUM-VERSION]) + +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. + +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. + +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). + +# If the MINIMUM-VERSION argument is passed, AS_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. + +# Updated to loop over all possible python binaries by Andy Wingo +# +# Updated to only warn and unset PYTHON if no good one is found + +AC_DEFUN([AS_PATH_PYTHON], + [ + dnl Find a version of Python. I could check for python versions 1.4 + dnl or earlier, but the default installation locations changed from + dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages + dnl in 1.5, and I don't want to maintain that logic. + + dnl should we do the version check? + PYTHON_CANDIDATES="python python2.2 python2.1 python2.0 python2 \ + python1.6 python1.5" + ifelse([$1],[], + [AC_PATH_PROG(PYTHON, $PYTHON_CANDIDATES)], + [ + AC_MSG_NOTICE(Looking for Python version >= $1) + changequote(<<, >>)dnl + prog=" +import sys, string +minver = '$1' +# split string by '.' and convert to numeric +minver_info = map(string.atoi, string.split(minver, '.')) +# we can now do comparisons on the two lists: +if sys.version_info >= tuple(minver_info): + sys.exit(0) +else: + sys.exit(1)" + changequote([, ])dnl + + python_good=false + for python_candidate in $PYTHON_CANDIDATES; do + unset PYTHON + AC_PATH_PROG(PYTHON, $python_candidate) 1> /dev/null 2> /dev/null + + if test "x$PYTHON" = "x"; then continue; fi + + if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then + AC_MSG_CHECKING(["$PYTHON":]) + AC_MSG_RESULT([okay]) + python_good=true + break; + else + dnl clear the cache val + unset ac_cv_path_PYTHON + fi + done + ]) + + if test "$python_good" != "true"; then + AC_MSG_WARN([No suitable version of python found]) + PYTHON= + else + + AC_MSG_CHECKING([local Python configuration]) + + dnl Query Python for its version number. Getting [:3] seems to be + dnl the best way to do this; it's what "site.py" does in the standard + dnl library. Need to change quote character because of [:3] + + AC_SUBST(PYTHON_VERSION) + changequote(<<, >>)dnl + PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"` + changequote([, ])dnl + + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made + dnl distinct variables so they can be overridden if need be. However, + dnl general consensus is that you shouldn't need this ability. + + AC_SUBST(PYTHON_PREFIX) + PYTHON_PREFIX='${prefix}' + + AC_SUBST(PYTHON_EXEC_PREFIX) + PYTHON_EXEC_PREFIX='${exec_prefix}' + + dnl At times (like when building shared libraries) you may want + dnl to know which OS platform Python thinks this is. + + AC_SUBST(PYTHON_PLATFORM) + PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"` + + + dnl Set up 4 directories: + + dnl pythondir -- where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behaviour + dnl is more consistent with lispdir.m4 for example. + dnl + dnl Also, if the package prefix isn't the same as python's prefix, + dnl then the old $(pythondir) was pretty useless. + + AC_SUBST(pythondir) + pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages + + dnl pkgpythondir -- $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + dnl Maybe this should be put in python.am? + + AC_SUBST(pkgpythondir) + pkgpythondir=\${pythondir}/$PACKAGE + + dnl pyexecdir -- directory for installing python extension modules + dnl (shared libraries) Was PYTHON_SITE_EXEC in previous betas. + + AC_SUBST(pyexecdir) + pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages + + dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE) + dnl Maybe this should be put in python.am? + + AC_SUBST(pkgpyexecdir) + pkgpyexecdir=\${pyexecdir}/$PACKAGE + + AC_MSG_RESULT([looks good]) + + fi +]) diff --git a/mobile/common/m4/as-scrub-include.m4 b/mobile/common/m4/as-scrub-include.m4 new file mode 100755 index 0000000..96dfb8f --- /dev/null +++ b/mobile/common/m4/as-scrub-include.m4 @@ -0,0 +1,36 @@ +dnl as-scrub-include.m4 0.0.4 + +dnl autostars m4 macro for scrubbing CFLAGS of system include dirs +dnl because gcc 3.x complains about including system including dirs + +dnl Thomas Vander Stichele + +dnl $Id: as-scrub-include.m4,v 1.5 2004/06/12 08:19:09 thomasvs Exp $ + +dnl This macro uses output of cpp -v and expects it to contain text that +dnl looks a little bit like this: +dnl #include <...> search starts here: +dnl /usr/local/include +dnl /usr/lib/gcc-lib/i386-redhat-linux/3.2/include +dnl /usr/include +dnl End of search list. + +dnl AS_SCRUB_INCLUDE(VAR) +dnl example +dnl AS_SCRUB_INCLUDE(CFLAGS) +dnl will remove all system include dirs from the given CFLAGS + +AC_DEFUN([AS_SCRUB_INCLUDE], +[ + GIVEN_CFLAGS=$[$1] + INCLUDE_DIRS=`echo | cpp -v 2>&1` + + dnl remove everything from this output between the "starts here" and "End of" + dnl line + INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'` + for dir in $INCLUDE_DIRS; do + dnl use "" as the sed script so $dir gets expanded + GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"` + done + [$1]=$GIVEN_CFLAGS +]) diff --git a/mobile/common/m4/as-version.m4 b/mobile/common/m4/as-version.m4 new file mode 100755 index 0000000..a5b4399 --- /dev/null +++ b/mobile/common/m4/as-version.m4 @@ -0,0 +1,71 @@ +dnl as-version.m4 0.2.0 + +dnl autostars m4 macro for versioning + +dnl Thomas Vander Stichele + +dnl $Id: as-version.m4,v 1.4 2004/06/01 09:40:05 thomasvs Exp $ + +dnl AS_VERSION + +dnl example +dnl AS_VERSION + +dnl this macro +dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO +dnl - AC_SUBST's PACKAGE_VERSION_RELEASE, +dnl which can be used for rpm release fields +dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents +dnl maintainer mode from running correctly +dnl +dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h +dnl if you use acconfig.h + +AC_DEFUN([AS_VERSION], +[ + PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1) + PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2) + PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3) + + AC_SUBST(PACKAGE_VERSION_MAJOR) + AC_SUBST(PACKAGE_VERSION_MINOR) + AC_SUBST(PACKAGE_VERSION_MICRO) +]) + +dnl AS_NANO(ACTION-IF-NO-NANO, [ACTION-IF-NANO]) + +dnl requires AC_INIT to be called before +dnl For projects using a fourth or nano number in your versioning to indicate +dnl development or prerelease snapshots, this macro allows the build to be +dnl set up differently accordingly. + +dnl this macro: +dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number +dnl - sets the variable PACKAGE_VERSION_NANO +dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used +dnl for rpm release fields +dnl - executes ACTION-IF-NO-NANO or ACTION-IF-NANO + +dnl example: +dnl AS_NANO(RELEASE="yes", RELEASE="no") + +AC_DEFUN([AS_NANO], +[ + AC_MSG_CHECKING(nano version) + + NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4) + + if test x"$NANO" = x || test "x$NANO" = "x0" ; then + AC_MSG_RESULT([0 (release)]) + NANO=0 + PACKAGE_VERSION_RELEASE=1 + ifelse([$1], , :, [$1]) + else + AC_MSG_RESULT($NANO) + PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` + ifelse([$2], , :, [$2]) + fi + PACKAGE_VERSION_NANO=$NANO + AC_SUBST(PACKAGE_VERSION_NANO) + AC_SUBST(PACKAGE_VERSION_RELEASE) +]) diff --git a/mobile/common/m4/ax_create_stdint_h.m4 b/mobile/common/m4/ax_create_stdint_h.m4 new file mode 100755 index 0000000..13bf699 --- /dev/null +++ b/mobile/common/m4/ax_create_stdint_h.m4 @@ -0,0 +1,734 @@ +##### http://autoconf-archive.cryp.to/ax_create_stdint_h.html +# +# SYNOPSIS +# +# AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])] +# +# DESCRIPTION +# +# the "ISO C9X: 7.18 Integer types " section requires the +# existence of an include file that defines a set of +# typedefs, especially uint8_t,int32_t,uintptr_t. Many older +# installations will not provide this file, but some will have the +# very same definitions in . In other enviroments we can +# use the inet-types in which would define the typedefs +# int8_t and u_int8_t respectivly. +# +# This macros will create a local "_stdint.h" or the headerfile given +# as an argument. In many cases that file will just "#include +# " or "#include ", while in other environments +# it will provide the set of basic 'stdint's definitions/typedefs: +# +# int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t +# int_least32_t.. int_fast32_t.. intmax_t +# +# which may or may not rely on the definitions of other files, or +# using the AC_CHECK_SIZEOF macro to determine the actual sizeof each +# type. +# +# if your header files require the stdint-types you will want to +# create an installable file mylib-int.h that all your other +# installable header may include. So if you have a library package +# named "mylib", just use +# +# AX_CREATE_STDINT_H(mylib-int.h) +# +# in configure.ac and go to install that very header file in +# Makefile.am along with the other headers (mylib.h) - and the +# mylib-specific headers can simply use "#include " to +# obtain the stdint-types. +# +# Remember, if the system already had a valid , the +# generated file will include it directly. No need for fuzzy +# HAVE_STDINT_H things... (oops, GCC 4.2.x has deliberatly disabled +# its stdint.h for non-c99 compilation and the c99-mode is not the +# default. Therefore this macro will not use the compiler's stdint.h +# - please complain to the GCC developers). +# +# LAST MODIFICATION +# +# 2007-06-27 +# +# COPYLEFT +# +# Copyright (c) 2007 Guido U. Draheim +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of the +# License, or (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the respective Autoconf Macro's copyright +# owner gives unlimited permission to copy, distribute and modify the +# configure scripts that are the output of Autoconf when processing +# the Macro. You need not follow the terms of the GNU General Public +# License when using or distributing such scripts, even though +# portions of the text of the Macro appear in them. The GNU General +# Public License (GPL) does govern all other use of the material that +# constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the +# Autoconf Macro released by the Autoconf Macro Archive. When you +# make and distribute a modified version of the Autoconf Macro, you +# may extend this special exception to the GPL to apply to your +# modified version as well. + +AC_DEFUN([AX_CHECK_DATA_MODEL],[ + AC_CHECK_SIZEOF(char) + AC_CHECK_SIZEOF(short) + AC_CHECK_SIZEOF(int) + AC_CHECK_SIZEOF(long) + AC_CHECK_SIZEOF(void*) + ac_cv_char_data_model="" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" + ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" + ac_cv_long_data_model="" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" + ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" + AC_MSG_CHECKING([data model]) + case "$ac_cv_char_data_model/$ac_cv_long_data_model" in + 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; + 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; + 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; + 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; + 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; + 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; + 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; + 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; + 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; + 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; + 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; + 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; + 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; + 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; + 222/*|333/*|444/*|666/*|888/*) : + ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; + *) ac_cv_data_model="none" ; n="very unusual model" ;; + esac + AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)]) +]) + +dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF]) +AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[ +AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[ + ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) + AC_MSG_RESULT([(..)]) + for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h]) + do + unset ac_cv_type_uintptr_t + unset ac_cv_type_uint64_t + AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>]) + AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) + m4_ifvaln([$2],[$2]) break + done + AC_MSG_CHECKING([for stdint uintptr_t]) + ]) +]) + +AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[ +AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[ + ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) + AC_MSG_RESULT([(..)]) + for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h]) + do + unset ac_cv_type_uint32_t + unset ac_cv_type_uint64_t + AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>]) + AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) + m4_ifvaln([$2],[$2]) break + break; + done + AC_MSG_CHECKING([for stdint uint32_t]) + ]) +]) + +AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[ +AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[ + ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) + AC_MSG_RESULT([(..)]) + for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do + unset ac_cv_type_u_int32_t + unset ac_cv_type_u_int64_t + AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>]) + AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>]) + m4_ifvaln([$2],[$2]) break + break; + done + AC_MSG_CHECKING([for stdint u_int32_t]) + ]) +]) + +AC_DEFUN([AX_CREATE_STDINT_H], +[# ------ AX CREATE STDINT H ------------------------------------- +AC_MSG_CHECKING([for stdint types]) +ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)` +# try to shortcircuit - if the default include path of the compiler +# can find a "stdint.h" header then we assume that all compilers can. +AC_CACHE_VAL([ac_cv_header_stdint_t],[ +old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" +old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" +old_CFLAGS="$CFLAGS" ; CFLAGS="" +AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], +[ac_cv_stdint_result="(assuming C99 compatible system)" + ac_cv_header_stdint_t="stdint.h"; ], +[ac_cv_header_stdint_t=""]) +if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then +CFLAGS="-std=c99" +AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], +[AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)]) +fi +CXXFLAGS="$old_CXXFLAGS" +CPPFLAGS="$old_CPPFLAGS" +CFLAGS="$old_CFLAGS" ]) + +v="... $ac_cv_header_stdint_h" +if test "$ac_stdint_h" = "stdint.h" ; then + AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)]) +elif test "$ac_stdint_h" = "inttypes.h" ; then + AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)]) +elif test "_$ac_cv_header_stdint_t" = "_" ; then + AC_MSG_RESULT([(putting them into $ac_stdint_h)$v]) +else + ac_cv_header_stdint="$ac_cv_header_stdint_t" + AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)]) +fi + +if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. + +dnl .....intro message done, now do a few system checks..... +dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type, +dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW +dnl instead that is triggered with 3 or more arguments (see types.m4) + +inttype_headers=`echo $2 | sed -e 's/,/ /g'` + +ac_cv_stdint_result="(no helpful system typedefs seen)" +AX_CHECK_HEADER_STDINT_X(dnl + stdint.h inttypes.h sys/inttypes.h $inttype_headers, + ac_cv_stdint_result="(seen uintptr_t$and64 in $i)") + +if test "_$ac_cv_header_stdint_x" = "_" ; then +AX_CHECK_HEADER_STDINT_O(dnl, + inttypes.h sys/inttypes.h stdint.h $inttype_headers, + ac_cv_stdint_result="(seen uint32_t$and64 in $i)") +fi + +if test "_$ac_cv_header_stdint_x" = "_" ; then +if test "_$ac_cv_header_stdint_o" = "_" ; then +AX_CHECK_HEADER_STDINT_U(dnl, + sys/types.h inttypes.h sys/inttypes.h $inttype_headers, + ac_cv_stdint_result="(seen u_int32_t$and64 in $i)") +fi fi + +dnl if there was no good C99 header file, do some typedef checks... +if test "_$ac_cv_header_stdint_x" = "_" ; then + AC_MSG_CHECKING([for stdint datatype model]) + AC_MSG_RESULT([(..)]) + AX_CHECK_DATA_MODEL +fi + +if test "_$ac_cv_header_stdint_x" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_x" +elif test "_$ac_cv_header_stdint_o" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_o" +elif test "_$ac_cv_header_stdint_u" != "_" ; then + ac_cv_header_stdint="$ac_cv_header_stdint_u" +else + ac_cv_header_stdint="stddef.h" +fi + +AC_MSG_CHECKING([for extra inttypes in chosen header]) +AC_MSG_RESULT([($ac_cv_header_stdint)]) +dnl see if int_least and int_fast types are present in _this_ header. +unset ac_cv_type_int_least32_t +unset ac_cv_type_int_fast32_t +AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>]) +AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>]) +AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>]) + +fi # shortcircut to system "stdint.h" +# ------------------ PREPARE VARIABLES ------------------------------ +if test "$GCC" = "yes" ; then +ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` +else +ac_cv_stdint_message="using $CC" +fi + +AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl +$ac_cv_stdint_result]) + +dnl ----------------------------------------------------------------- +# ----------------- DONE inttypes.h checks START header ------------- +AC_CONFIG_COMMANDS([$ac_stdint_h],[ +AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h) +ac_stdint=$tmp/_stdint.h + +echo "#ifndef" $_ac_stdint_h >$ac_stdint +echo "#define" $_ac_stdint_h "1" >>$ac_stdint +echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint +echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint +echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint +if test "_$ac_cv_header_stdint_t" != "_" ; then +echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint +echo "#include " >>$ac_stdint +echo "#endif" >>$ac_stdint +echo "#endif" >>$ac_stdint +else + +cat >>$ac_stdint < +#else +#include + +/* .................... configured part ............................ */ + +STDINT_EOF + +echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint +if test "_$ac_cv_header_stdint_x" != "_" ; then + ac_header="$ac_cv_header_stdint_x" + echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint +fi + +echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint +if test "_$ac_cv_header_stdint_o" != "_" ; then + ac_header="$ac_cv_header_stdint_o" + echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint +fi + +echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint +if test "_$ac_cv_header_stdint_u" != "_" ; then + ac_header="$ac_cv_header_stdint_u" + echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint +else + echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint +fi + +echo "" >>$ac_stdint + +if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then + echo "#include <$ac_header>" >>$ac_stdint + echo "" >>$ac_stdint +fi fi + +echo "/* which 64bit typedef has been found */" >>$ac_stdint +if test "$ac_cv_type_uint64_t" = "yes" ; then +echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint +fi +if test "$ac_cv_type_u_int64_t" = "yes" ; then +echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint +fi +echo "" >>$ac_stdint + +echo "/* which type model has been detected */" >>$ac_stdint +if test "_$ac_cv_char_data_model" != "_" ; then +echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint +echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint +else +echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint +echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint +fi +echo "" >>$ac_stdint + +echo "/* whether int_least types were detected */" >>$ac_stdint +if test "$ac_cv_type_int_least32_t" = "yes"; then +echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint +fi +echo "/* whether int_fast types were detected */" >>$ac_stdint +if test "$ac_cv_type_int_fast32_t" = "yes"; then +echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint +fi +echo "/* whether intmax_t type was detected */" >>$ac_stdint +if test "$ac_cv_type_intmax_t" = "yes"; then +echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint +else +echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint +fi +echo "" >>$ac_stdint + + cat >>$ac_stdint <= 199901L +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; + +#elif !defined __STRICT_ANSI__ +#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ +#define _HAVE_UINT64_T +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ +/* note: all ELF-systems seem to have loff-support which needs 64-bit */ +#if !defined _NO_LONGLONG +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; +#endif + +#elif defined __alpha || (defined __mips && defined _ABIN32) +#if !defined _NO_LONGLONG +typedef long int64_t; +typedef unsigned long uint64_t; +#endif + /* compiler/cpu type to define int64_t */ +#endif +#endif +#endif + +#if defined _STDINT_HAVE_U_INT_TYPES +/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int32_t uint32_t; + +/* glibc compatibility */ +#ifndef __int8_t_defined +#define __int8_t_defined +#endif +#endif + +#ifdef _STDINT_NEED_INT_MODEL_T +/* we must guess all the basic types. Apart from byte-adressable system, */ +/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ +/* (btw, those nibble-addressable systems are way off, or so we assume) */ + +dnl /* have a look at "64bit and data size neutrality" at */ +dnl /* http://unix.org/version2/whatsnew/login_64bit.html */ +dnl /* (the shorthand "ILP" types always have a "P" part) */ + +#if defined _STDINT_BYTE_MODEL +#if _STDINT_LONG_MODEL+0 == 242 +/* 2:4:2 = IP16 = a normal 16-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned long uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef long int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 +/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ +/* 4:4:4 = ILP32 = a normal 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 +/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ +/* 4:8:8 = LP64 = a normal 64-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* this system has a "long" of 64bit */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +typedef unsigned long uint64_t; +typedef long int64_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 448 +/* LLP64 a 64-bit system derived from a 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* assuming the system has a "long long" */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +#define _HAVE_LONGLONG_UINT64_T +typedef unsigned long long uint64_t; +typedef long long int64_t; +#endif +#else +#define _STDINT_NO_INT32_T +#endif +#else +#define _STDINT_NO_INT8_T +#define _STDINT_NO_INT32_T +#endif +#endif + +/* + * quote from SunOS-5.8 sys/inttypes.h: + * Use at your own risk. As of February 1996, the committee is squarely + * behind the fixed sized types; the "least" and "fast" types are still being + * discussed. The probability that the "fast" types may be removed before + * the standard is finalized is high enough that they are not currently + * implemented. + */ + +#if defined _STDINT_NEED_INT_LEAST_T +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_least64_t; +#endif + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_least64_t; +#endif + /* least types */ +#endif + +#if defined _STDINT_NEED_INT_FAST_T +typedef int8_t int_fast8_t; +typedef int int_fast16_t; +typedef int32_t int_fast32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_fast64_t; +#endif + +typedef uint8_t uint_fast8_t; +typedef unsigned uint_fast16_t; +typedef uint32_t uint_fast32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_fast64_t; +#endif + /* fast types */ +#endif + +#ifdef _STDINT_NEED_INTMAX_T +#ifdef _HAVE_UINT64_T +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; +#else +typedef long intmax_t; +typedef unsigned long uintmax_t; +#endif +#endif + +#ifdef _STDINT_NEED_INTPTR_T +#ifndef __intptr_t_defined +#define __intptr_t_defined +/* we encourage using "long" to store pointer values, never use "int" ! */ +#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 +typedef unsigned int uintptr_t; +typedef int intptr_t; +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 +typedef unsigned long uintptr_t; +typedef long intptr_t; +#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T +typedef uint64_t uintptr_t; +typedef int64_t intptr_t; +#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ +typedef unsigned long uintptr_t; +typedef long intptr_t; +#endif +#endif +#endif + +/* The ISO C99 standard specifies that in C++ implementations these + should only be defined if explicitly requested. */ +#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS +#ifndef UINT32_C + +/* Signed. */ +# define INT8_C(c) c +# define INT16_C(c) c +# define INT32_C(c) c +# ifdef _HAVE_LONGLONG_UINT64_T +# define INT64_C(c) c ## L +# else +# define INT64_C(c) c ## LL +# endif + +/* Unsigned. */ +# define UINT8_C(c) c ## U +# define UINT16_C(c) c ## U +# define UINT32_C(c) c ## U +# ifdef _HAVE_LONGLONG_UINT64_T +# define UINT64_C(c) c ## UL +# else +# define UINT64_C(c) c ## ULL +# endif + +/* Maximal type. */ +# ifdef _HAVE_LONGLONG_UINT64_T +# define INTMAX_C(c) c ## L +# define UINTMAX_C(c) c ## UL +# else +# define INTMAX_C(c) c ## LL +# define UINTMAX_C(c) c ## ULL +# endif + + /* literalnumbers */ +#endif +#endif + +/* These limits are merily those of a two complement byte-oriented system */ + +/* Minimum of signed integral types. */ +# define INT8_MIN (-128) +# define INT16_MIN (-32767-1) +# define INT32_MIN (-2147483647-1) +# define INT64_MIN (-__INT64_C(9223372036854775807)-1) +/* Maximum of signed integral types. */ +# define INT8_MAX (127) +# define INT16_MAX (32767) +# define INT32_MAX (2147483647) +# define INT64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types. */ +# define UINT8_MAX (255) +# define UINT16_MAX (65535) +# define UINT32_MAX (4294967295U) +# define UINT64_MAX (__UINT64_C(18446744073709551615)) + +/* Minimum of signed integral types having a minimum size. */ +# define INT_LEAST8_MIN INT8_MIN +# define INT_LEAST16_MIN INT16_MIN +# define INT_LEAST32_MIN INT32_MIN +# define INT_LEAST64_MIN INT64_MIN +/* Maximum of signed integral types having a minimum size. */ +# define INT_LEAST8_MAX INT8_MAX +# define INT_LEAST16_MAX INT16_MAX +# define INT_LEAST32_MAX INT32_MAX +# define INT_LEAST64_MAX INT64_MAX + +/* Maximum of unsigned integral types having a minimum size. */ +# define UINT_LEAST8_MAX UINT8_MAX +# define UINT_LEAST16_MAX UINT16_MAX +# define UINT_LEAST32_MAX UINT32_MAX +# define UINT_LEAST64_MAX UINT64_MAX + + /* shortcircuit*/ +#endif + /* once */ +#endif +#endif +STDINT_EOF +fi + if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then + AC_MSG_NOTICE([$ac_stdint_h is unchanged]) + else + ac_dir=`AS_DIRNAME(["$ac_stdint_h"])` + AS_MKDIR_P(["$ac_dir"]) + rm -f $ac_stdint_h + mv $ac_stdint $ac_stdint_h + fi +],[# variables for create stdint.h replacement +PACKAGE="$PACKAGE" +VERSION="$VERSION" +ac_stdint_h="$ac_stdint_h" +_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h) +ac_cv_stdint_message="$ac_cv_stdint_message" +ac_cv_header_stdint_t="$ac_cv_header_stdint_t" +ac_cv_header_stdint_x="$ac_cv_header_stdint_x" +ac_cv_header_stdint_o="$ac_cv_header_stdint_o" +ac_cv_header_stdint_u="$ac_cv_header_stdint_u" +ac_cv_type_uint64_t="$ac_cv_type_uint64_t" +ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" +ac_cv_char_data_model="$ac_cv_char_data_model" +ac_cv_long_data_model="$ac_cv_long_data_model" +ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" +ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" +ac_cv_type_intmax_t="$ac_cv_type_intmax_t" +]) +]) diff --git a/mobile/common/m4/check.m4 b/mobile/common/m4/check.m4 new file mode 100755 index 0000000..19784ae --- /dev/null +++ b/mobile/common/m4/check.m4 @@ -0,0 +1,181 @@ +dnl _AM_TRY_CHECK(MINIMUM-VERSION, EXTRA-CFLAGS, EXTRA-LIBS, CHECK-LIB-NAME +dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS +dnl Done this way because of the brokenness that is +dnl https://launchpad.net/distros/ubuntu/+source/check/+bug/5840 +dnl + +AC_DEFUN([_AM_TRY_CHECK], +[ + min_check_version=$1 + extra_cflags=$2 + extra_libs=$3 + check_lib_name=$4 + + CHECK_CFLAGS="$extra_cflags" + CHECK_LIBS="$extra_libs -l$check_lib_name" + + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + + CFLAGS="$CFLAGS $CHECK_CFLAGS" + LIBS="$CHECK_LIBS $LIBS" + + AC_MSG_CHECKING(for check named $check_lib_name - version >= $min_check_version) + + rm -f conf.check-test + dnl unset no_check, since in our second run it would have been set to yes + dnl before + no_check= + AC_TRY_RUN([ +#include +#include + +#include + +int main () +{ + int major, minor, micro; + char *tmp_version; + + system ("touch conf.check-test"); + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = strdup("$min_check_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_check_version"); + return 1; + } + + if ((CHECK_MAJOR_VERSION != check_major_version) || + (CHECK_MINOR_VERSION != check_minor_version) || + (CHECK_MICRO_VERSION != check_micro_version)) + { + printf("\n*** The check header file (version %d.%d.%d) does not match\n", + CHECK_MAJOR_VERSION, CHECK_MINOR_VERSION, CHECK_MICRO_VERSION); + printf("*** the check library (version %d.%d.%d).\n", + check_major_version, check_minor_version, check_micro_version); + return 1; + } + + if ((check_major_version > major) || + ((check_major_version == major) && (check_minor_version > minor)) || + ((check_major_version == major) && (check_minor_version == minor) && (check_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** An old version of check (%d.%d.%d) was found.\n", + check_major_version, check_minor_version, check_micro_version); + printf("*** You need a version of check being at least %d.%d.%d.\n", major, minor, micro); + printf("***\n"); + printf("*** If you have already installed a sufficiently new version, this error\n"); + printf("*** probably means that the wrong copy of the check library and header\n"); + printf("*** file is being found. Rerun configure with the --with-check=PATH option\n"); + printf("*** to specify the prefix where the correct version was installed.\n"); + } + + return 1; +} +],, no_check=yes, [echo $ac_n "cross compiling; assumed OK... $ac_c"]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + + if test "x$no_check" = x ; then + AC_MSG_RESULT(yes) + ifelse([$5], , :, [$5]) + else + AC_MSG_RESULT(no) + if test -f conf.check-test ; then + : + else + echo "*** Could not run check test program, checking why..." + CFLAGS="$CFLAGS $CHECK_CFLAGS" + LIBS="$CHECK_LIBS $LIBS" + AC_TRY_LINK([ +#include +#include + +#include +], , [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding check. You'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for" + echo "*** the exact error that occured." ]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + + CHECK_CFLAGS="" + CHECK_LIBS="" + + rm -f conf.check-test + ifelse([$6], , AC_MSG_ERROR([check not found]), [$6]) + fi +]) + + +dnl AM_PATH_CHECK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS +dnl + +AC_DEFUN([AM_PATH_CHECK], +[ + AC_ARG_WITH(check, + [ --with-check=PATH prefix where check is installed [default=auto]]) + + AC_ARG_WITH(checklibname, + AC_HELP_STRING([--with-check-lib-name=NAME], + [name of the PIC check library (default=check)])) + + min_check_version=ifelse([$1], ,0.8.2,$1) + + if test x$with_check = xno; then + AC_MSG_RESULT(disabled) + ifelse([$3], , AC_MSG_ERROR([disabling check is not supported]), [$3]) + else + if test "x$with_check" != x; then + CHECK_EXTRA_CFLAGS="-I$with_check/include" + CHECK_EXTRA_LIBS="-L$with_check/lib" + else + CHECK_EXTRA_CFLAGS="" + CHECK_EXTRA_LIBS="" + fi + + if test x$with_checklibname = x; then + _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, + check_pic, [have_check=true], [have_check=false]) + if test x$have_check = xtrue; then + ifelse([$2], , :, [$2]) + else + _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, + check, [have_check=true], [have_check=false]) + if test x$have_check = xtrue; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([check not found]), [$3]) + fi + fi + else + _AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS, + $with_checklibname, [have_check=true], [have_check=false]) + if test x$have_check = xtrue; then + ifelse([$2], , :, [$2]) + else + ifelse([$3], , AC_MSG_ERROR([check not found]), [$3]) + fi + fi + + AC_SUBST(CHECK_CFLAGS) + AC_SUBST(CHECK_LIBS) + rm -f conf.check-test + fi +]) diff --git a/mobile/common/m4/gettext.m4 b/mobile/common/m4/gettext.m4 new file mode 100755 index 0000000..45cad85 --- /dev/null +++ b/mobile/common/m4/gettext.m4 @@ -0,0 +1,587 @@ +# gettext.m4 serial 17 (gettext-0.11.5) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2002. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + INTLOBJS="\$(GETTOBJS)" + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + AC_SUBST(INTLOBJS) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the po subdirectory, +dnl except for USE_NLS. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.11 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + fi + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + GMOFILES= + UPDATEPOFILES= + DUMMYPOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it + # from automake. + eval 'ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. +AC_DEFUN([AM_INTL_SUBDIR], +[ + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_CANONICAL_HOST])dnl + AC_REQUIRE([AC_PROG_RANLIB])dnl + AC_REQUIRE([AC_ISC_POSIX])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + AC_REQUIRE([AC_C_CONST])dnl + AC_REQUIRE([AC_C_INLINE])dnl + AC_REQUIRE([AC_TYPE_OFF_T])dnl + AC_REQUIRE([AC_TYPE_SIZE_T])dnl + AC_REQUIRE([AC_FUNC_ALLOCA])dnl + AC_REQUIRE([AC_FUNC_MMAP])dnl + AC_REQUIRE([jm_GLIBC21])dnl + AC_REQUIRE([gt_INTDIV0])dnl + AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl + AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl + AC_REQUIRE([gt_INTTYPES_PRI])dnl + + AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ +stdlib.h string.h unistd.h sys/param.h]) + AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ +geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ +strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) + + AM_ICONV + AM_LANGINFO_CODESET + if test $ac_cv_header_locale_h = yes; then + AM_LC_MESSAGES + fi + + dnl intl/plural.c is generated from intl/plural.y. It requires bison, + dnl because plural.y uses bison specific features. It requires at least + dnl bison-1.26 because earlier versions generate a plural.c that doesn't + dnl compile. + dnl bison is only needed for the maintainer (who touches plural.y). But in + dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put + dnl the rule in general Makefile. Now, some people carelessly touch the + dnl files or have a broken "make" program, hence the plural.c rule will + dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not + dnl present or too old. + AC_CHECK_PROGS([INTLBISON], [bison]) + if test -z "$INTLBISON"; then + ac_verc_fail=yes + else + dnl Found it, now check the version. + AC_MSG_CHECKING([version of bison]) +changequote(<<,>>)dnl + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) +changequote([,])dnl + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + esac + AC_MSG_RESULT([$ac_prog_version]) + fi + if test $ac_verc_fail = yes; then + INTLBISON=: + fi +]) + + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/mobile/common/m4/glib-gettext.m4 b/mobile/common/m4/glib-gettext.m4 new file mode 100755 index 0000000..5a4ef28 --- /dev/null +++ b/mobile/common/m4/glib-gettext.m4 @@ -0,0 +1,380 @@ +# Copyright (C) 1995-2002 Free Software Foundation, Inc. +# Copyright (C) 2001-2003 Red Hat, Inc. +# +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU Public License +# but which still want to provide support for the GNU gettext functionality. +# +# Macro to add for using GNU gettext. +# Ulrich Drepper , 1995, 1996 +# +# Modified to never use included libintl. +# Owen Taylor , 12/15/1998 +# +# Major rework to remove unused code +# Owen Taylor , 12/11/2002 +# +# Added better handling of ALL_LINGUAS from GNU gettext version +# written by Bruno Haible, Owen Taylor 5/30/3002 + +# +# We need this here as well, since someone might use autoconf-2.5x +# to configure GLib then an older version to configure a package +# using AM_GLIB_GNU_GETTEXT +AC_PREREQ(2.53) + +dnl +dnl We go to great lengths to make sure that aclocal won't +dnl try to pull in the installed version of these macros +dnl when running aclocal in the glib directory. +dnl +m4_copy([AC_DEFUN],[glib_DEFUN]) +m4_copy([AC_REQUIRE],[glib_REQUIRE]) +dnl +dnl At the end, if we're not within glib, we'll define the public +dnl definitions in terms of our private definitions. +dnl + +# GLIB_LC_MESSAGES +#-------------------- +glib_DEFUN([GLIB_LC_MESSAGES], + [AC_CHECK_HEADERS([locale.h]) + if test $ac_cv_header_locale_h = yes; then + AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, + [AC_TRY_LINK([#include ], [return LC_MESSAGES], + am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) + if test $am_cv_val_LC_MESSAGES = yes; then + AC_DEFINE(HAVE_LC_MESSAGES, 1, + [Define if your file defines LC_MESSAGES.]) + fi + fi]) + +# GLIB_PATH_PROG_WITH_TEST +#---------------------------- +dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) + +# GLIB_WITH_NLS +#----------------- +glib_DEFUN([GLIB_WITH_NLS], + dnl NLS is obligatory + [USE_NLS=yes + AC_SUBST(USE_NLS) + + gt_cv_have_gettext=no + + CATOBJEXT=NONE + XGETTEXT=: + INTLLIBS= + + AC_CHECK_HEADER(libintl.h, + [gt_cv_func_dgettext_libintl="no" + libintl_extra_libs="" + + # + # First check in libc + # + AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, + [AC_TRY_LINK([ +#include +], + [return (int) dgettext ("","")], + gt_cv_func_dgettext_libc=yes, + gt_cv_func_dgettext_libc=no) + ]) + + if test "$gt_cv_func_dgettext_libc" = "yes" ; then + AC_CHECK_FUNCS(bind_textdomain_codeset) + fi + + # + # If we don't have everything we want, check in libintl + # + if test "$gt_cv_func_dgettext_libc" != "yes" \ + || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then + + AC_CHECK_LIB(intl, bindtextdomain, + [AC_CHECK_LIB(intl, dgettext, + gt_cv_func_dgettext_libintl=yes)]) + + if test "$gt_cv_func_dgettext_libintl" != "yes" ; then + AC_MSG_CHECKING([if -liconv is needed to use gettext]) + AC_MSG_RESULT([]) + AC_CHECK_LIB(intl, dcgettext, + [gt_cv_func_dgettext_libintl=yes + libintl_extra_libs=-liconv], + :,-liconv) + fi + + # + # If we found libintl, then check in it for bind_textdomain_codeset(); + # we'll prefer libc if neither have bind_textdomain_codeset(), + # and both have dgettext + # + if test "$gt_cv_func_dgettext_libintl" = "yes" ; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS -lintl $libintl_extra_libs" + unset ac_cv_func_bind_textdomain_codeset + AC_CHECK_FUNCS(bind_textdomain_codeset) + LIBS="$glib_save_LIBS" + + if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then + gt_cv_func_dgettext_libc=no + else + if test "$gt_cv_func_dgettext_libc" = "yes"; then + gt_cv_func_dgettext_libintl=no + fi + fi + fi + fi + + if test "$gt_cv_func_dgettext_libc" = "yes" \ + || test "$gt_cv_func_dgettext_libintl" = "yes"; then + gt_cv_have_gettext=yes + fi + + if test "$gt_cv_func_dgettext_libintl" = "yes"; then + INTLLIBS="-lintl $libintl_extra_libs" + fi + + if test "$gt_cv_have_gettext" = "yes"; then + AC_DEFINE(HAVE_GETTEXT,1, + [Define if the GNU gettext() function is already present or preinstalled.]) + GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl + if test "$MSGFMT" != "no"; then + glib_save_LIBS="$LIBS" + LIBS="$LIBS $INTLLIBS" + AC_CHECK_FUNCS(dcgettext) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) + AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; + return _nl_msg_cat_cntr], + [CATOBJEXT=.gmo + DATADIRNAME=share], + [case $host in + *-*-solaris*) + dnl On Solaris, if bind_textdomain_codeset is in libc, + dnl GNU format message catalog is always supported, + dnl since both are added to the libc all together. + dnl Hence, we'd like to go with DATADIRNAME=share and + dnl and CATOBJEXT=.gmo in this case. + AC_CHECK_FUNC(bind_textdomain_codeset, + [CATOBJEXT=.gmo + DATADIRNAME=share], + [CATOBJEXT=.mo + DATADIRNAME=lib]) + ;; + *) + CATOBJEXT=.mo + DATADIRNAME=lib + ;; + esac]) + LIBS="$glib_save_LIBS" + INSTOBJEXT=.mo + else + gt_cv_have_gettext=no + fi + fi + ]) + + if test "$gt_cv_have_gettext" = "yes" ; then + AC_DEFINE(ENABLE_NLS, 1, + [always defined to indicate that i18n is enabled]) + fi + + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is not GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header /dev/null 2> /dev/null; then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + fi + + # We need to process the po/ directory. + POSUB=po + + AC_OUTPUT_COMMANDS( + [case "$CONFIG_FILES" in *po/Makefile.in*) + sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile + esac]) + + dnl These rules are solely for the distribution goal. While doing this + dnl we only have to keep exactly one list of the available catalogs + dnl in configure.in. + for lang in $ALL_LINGUAS; do + GMOFILES="$GMOFILES $lang.gmo" + POFILES="$POFILES $lang.po" + done + + dnl Make all variables we use known to autoconf. + AC_SUBST(CATALOGS) + AC_SUBST(CATOBJEXT) + AC_SUBST(DATADIRNAME) + AC_SUBST(GMOFILES) + AC_SUBST(INSTOBJEXT) + AC_SUBST(INTLLIBS) + AC_SUBST(PO_IN_DATADIR_TRUE) + AC_SUBST(PO_IN_DATADIR_FALSE) + AC_SUBST(POFILES) + AC_SUBST(POSUB) + ]) + +# AM_GLIB_GNU_GETTEXT +# ------------------- +# Do checks necessary for use of gettext. If a suitable implementation +# of gettext is found in either in libintl or in the C library, +# it will set INTLLIBS to the libraries needed for use of gettext +# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable +# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() +# on various variables needed by the Makefile.in.in installed by +# glib-gettextize. +dnl +glib_DEFUN([GLIB_GNU_GETTEXT], + [AC_REQUIRE([AC_PROG_CC])dnl + AC_REQUIRE([AC_HEADER_STDC])dnl + + GLIB_LC_MESSAGES + GLIB_WITH_NLS + + if test "$gt_cv_have_gettext" = "yes"; then + if test "x$ALL_LINGUAS" = "x"; then + LINGUAS= + else + AC_MSG_CHECKING(for catalogs to be installed) + NEW_LINGUAS= + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + NEW_LINGUAS="$NEW_LINGUAS $presentlang" + fi + done + LINGUAS=$NEW_LINGUAS + AC_MSG_RESULT($LINGUAS) + fi + + dnl Construct list of names of catalog files to be constructed. + if test -n "$LINGUAS"; then + for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done + fi + fi + + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but ($top_srcdir). + dnl Try to locate is. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) + + dnl Generate list of files to be processed by xgettext which will + dnl be included in po/Makefile. + test -d po || mkdir po + if test "x$srcdir" != "x."; then + if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then + posrcprefix="$srcdir/" + else + posrcprefix="../$srcdir/" + fi + else + posrcprefix="../" + fi + rm -f po/POTFILES + sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ + < $srcdir/po/POTFILES.in > po/POTFILES + ]) + +# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) +# ------------------------------- +# Define VARIABLE to the location where catalog files will +# be installed by po/Makefile. +glib_DEFUN([GLIB_DEFINE_LOCALEDIR], +[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl +glib_save_prefix="$prefix" +glib_save_exec_prefix="$exec_prefix" +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix=$prefix +if test "x$CATOBJEXT" = "x.mo" ; then + localedir=`eval echo "${libdir}/locale"` +else + localedir=`eval echo "${datadir}/locale"` +fi +prefix="$glib_save_prefix" +exec_prefix="$glib_save_exec_prefix" +AC_DEFINE_UNQUOTED($1, "$localedir", + [Define the location where the catalogs will be installed]) +]) + +dnl +dnl Now the definitions that aclocal will find +dnl +ifdef(glib_configure_in,[],[ +AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) +AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) +])dnl diff --git a/mobile/common/m4/gst-arch.m4 b/mobile/common/m4/gst-arch.m4 new file mode 100755 index 0000000..8a32bd2 --- /dev/null +++ b/mobile/common/m4/gst-arch.m4 @@ -0,0 +1,123 @@ +dnl AG_GST_ARCH +dnl sets up defines and automake conditionals for host architecture +dnl checks endianness +dnl defines HOST_CPU + +AC_DEFUN([AG_GST_ARCH], +[ + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use host_ variables + + dnl Determine CPU + case "x${host_cpu}" in + xi?86 | xk? | xi?86_64) + HAVE_CPU_I386=yes + AC_DEFINE(HAVE_CPU_I386, 1, [Define if the host CPU is an x86]) + + dnl FIXME could use some better detection + dnl (ie CPUID) + case "x${host_cpu}" in + xi386 | xi486) ;; + *) + AC_DEFINE(HAVE_RDTSC, 1, [Define if RDTSC is available]) ;; + esac ;; + xpowerpc) + HAVE_CPU_PPC=yes + AC_DEFINE(HAVE_CPU_PPC, 1, [Define if the host CPU is a PowerPC]) ;; + xpowerpc64) + HAVE_CPU_PPC64=yes + AC_DEFINE(HAVE_CPU_PPC64, 1, [Define if the host CPU is a 64 bit PowerPC]) ;; + xalpha*) + HAVE_CPU_ALPHA=yes + AC_DEFINE(HAVE_CPU_ALPHA, 1, [Define if the host CPU is an Alpha]) ;; + xarm*) + HAVE_CPU_ARM=yes + AC_DEFINE(HAVE_CPU_ARM, 1, [Define if the host CPU is an ARM]) ;; + xsparc*) + HAVE_CPU_SPARC=yes + AC_DEFINE(HAVE_CPU_SPARC, 1, [Define if the host CPU is a SPARC]) ;; + xmips*) + HAVE_CPU_MIPS=yes + AC_DEFINE(HAVE_CPU_MIPS, 1, [Define if the host CPU is a MIPS]) ;; + xhppa*) + HAVE_CPU_HPPA=yes + AC_DEFINE(HAVE_CPU_HPPA, 1, [Define if the host CPU is a HPPA]) ;; + xs390*) + HAVE_CPU_S390=yes + AC_DEFINE(HAVE_CPU_S390, 1, [Define if the host CPU is a S390]) ;; + xia64*) + HAVE_CPU_IA64=yes + AC_DEFINE(HAVE_CPU_IA64, 1, [Define if the host CPU is a IA64]) ;; + xm68k*) + HAVE_CPU_M68K=yes + AC_DEFINE(HAVE_CPU_M68K, 1, [Define if the host CPU is a M68K]) ;; + xx86_64) + HAVE_CPU_X86_64=yes + AC_DEFINE(HAVE_CPU_X86_64, 1, [Define if the host CPU is a x86_64]) ;; + xcris) + HAVE_CPU_CRIS=yes + AC_DEFINE(HAVE_CPU_CRIS, 1, [Define if the host CPU is a CRIS]) ;; + xcrisv32) + HAVE_CPU_CRISV32=yes + AC_DEFINE(HAVE_CPU_CRISV32, 1, [Define if the host CPU is a CRISv32]) ;; + esac + + dnl Determine endianness + AC_C_BIGENDIAN + + AM_CONDITIONAL(HAVE_CPU_I386, test "x$HAVE_CPU_I386" = "xyes") + AM_CONDITIONAL(HAVE_CPU_PPC, test "x$HAVE_CPU_PPC" = "xyes") + AM_CONDITIONAL(HAVE_CPU_PPC64, test "x$HAVE_CPU_PPC64" = "xyes") + AM_CONDITIONAL(HAVE_CPU_ALPHA, test "x$HAVE_CPU_ALPHA" = "xyes") + AM_CONDITIONAL(HAVE_CPU_ARM, test "x$HAVE_CPU_ARM" = "xyes") + AM_CONDITIONAL(HAVE_CPU_SPARC, test "x$HAVE_CPU_SPARC" = "xyes") + AM_CONDITIONAL(HAVE_CPU_HPPA, test "x$HAVE_CPU_HPPA" = "xyes") + AM_CONDITIONAL(HAVE_CPU_MIPS, test "x$HAVE_CPU_MIPS" = "xyes") + AM_CONDITIONAL(HAVE_CPU_S390, test "x$HAVE_CPU_S390" = "xyes") + AM_CONDITIONAL(HAVE_CPU_IA64, test "x$HAVE_CPU_IA64" = "xyes") + AM_CONDITIONAL(HAVE_CPU_M68K, test "x$HAVE_CPU_M68K" = "xyes") + AM_CONDITIONAL(HAVE_CPU_X86_64, test "x$HAVE_CPU_X86_64" = "xyes") + AM_CONDITIONAL(HAVE_CPU_CRIS, test "x$HAVE_CPU_CRIS" = "xyes") + AM_CONDITIONAL(HAVE_CPU_CRISV32, test "x$HAVE_CPU_CRISV32" = "xyes") + + AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu", [the host CPU]) +]) + +dnl check if unaligned memory access works correctly +AC_DEFUN([AG_GST_UNALIGNED_ACCESS], [ + AC_MSG_CHECKING([if unaligned memory access works correctly]) + if test x"$as_cv_unaligned_access" = x ; then + case $host in + alpha*|arm*|hp*|mips*|sh*|sparc*|ia64*) + _AS_ECHO_N([(blacklisted) ]) + as_cv_unaligned_access=no + ;; + i?86*|powerpc*|m68k*|cris*) + _AS_ECHO_N([(whitelisted) ]) + as_cv_unaligned_access=yes + ;; + esac + else + _AS_ECHO_N([(cached) ]) + fi + if test x"$as_cv_unaligned_access" = x ; then + AC_TRY_RUN([ +int main(int argc, char **argv) +{ + char array[] = "ABCDEFGH"; + unsigned int iarray[2]; + memcpy(iarray,array,8); +#define GET(x) (*(unsigned int *)((char *)iarray + (x))) + if(GET(0) != 0x41424344 && GET(0) != 0x44434241) return 1; + if(GET(1) != 0x42434445 && GET(1) != 0x45444342) return 1; + if(GET(2) != 0x43444546 && GET(2) != 0x46454443) return 1; + if(GET(3) != 0x44454647 && GET(3) != 0x47464544) return 1; + return 0; +} + ], as_cv_unaligned_access="yes", as_cv_unaligned_access="no") + fi + AC_MSG_RESULT($as_cv_unaligned_access) + if test "$as_cv_unaligned_access" = "yes"; then + AC_DEFINE_UNQUOTED(HAVE_UNALIGNED_ACCESS, 1, + [defined if unaligned memory access works correctly]) + fi +]) diff --git a/mobile/common/m4/gst-args.m4 b/mobile/common/m4/gst-args.m4 new file mode 100755 index 0000000..1781af4 --- /dev/null +++ b/mobile/common/m4/gst-args.m4 @@ -0,0 +1,302 @@ +dnl configure-time options shared among gstreamer modules + +dnl AG_GST_ARG_DEBUG +dnl AG_GST_ARG_PROFILING +dnl AG_GST_ARG_VALGRIND +dnl AG_GST_ARG_GCOV + +dnl AG_GST_ARG_EXAMPLES + +dnl AG_GST_ARG_WITH_PKG_CONFIG_PATH +dnl AG_GST_ARG_WITH_PACKAGE_NAME +dnl AG_GST_ARG_WITH_PACKAGE_ORIGIN + +dnl AG_GST_ARG_WITH_PLUGINS +dnl AG_GST_CHECK_PLUGIN +dnl AG_GST_DISABLE_PLUGIN + +dnl AG_GST_ARG_ENABLE_EXTERNAL +dnl AG_GST_ARG_ENABLE_EXPERIMENTAL +dnl AG_GST_ARG_ENABLE_BROKEN + +AC_DEFUN([AG_GST_ARG_DEBUG], +[ + dnl debugging stuff + AC_ARG_ENABLE(debug, + AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]), + [ + case "${enableval}" in + yes) USE_DEBUG=yes ;; + no) USE_DEBUG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; + esac + ], + [USE_DEBUG=yes]) dnl Default value +]) + +AC_DEFUN([AG_GST_ARG_PROFILING], +[ + AC_ARG_ENABLE(profiling, + AC_HELP_STRING([--enable-profiling], + [adds -pg to compiler commandline, for profiling]), + [ + case "${enableval}" in + yes) USE_PROFILING=yes ;; + no) USE_PROFILING=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-profiling) ;; + esac + ], + [USE_PROFILING=no]) dnl Default value +]) + +AC_DEFUN([AG_GST_ARG_VALGRIND], +[ + dnl valgrind inclusion + AC_ARG_ENABLE(valgrind, + AC_HELP_STRING([--disable-valgrind],[disable run-time valgrind detection]), + [ + case "${enableval}" in + yes) USE_VALGRIND="$USE_DEBUG" ;; + no) USE_VALGRIND=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;; + esac + ], + [USE_VALGRIND="$USE_DEBUG"]) dnl Default value + VALGRIND_REQ="2.1" + if test "x$USE_VALGRIND" = xyes; then + PKG_CHECK_MODULES(VALGRIND, valgrind > $VALGRIND_REQ, + USE_VALGRIND="yes", + [ + USE_VALGRIND="no" + AC_MSG_RESULT([no]) + ]) + fi + if test "x$USE_VALGRIND" = xyes; then + AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used]) + AC_MSG_NOTICE(Using extra code paths for valgrind) + fi +]) + +AC_DEFUN([AG_GST_ARG_GCOV], +[ + AC_ARG_ENABLE(gcov, + AC_HELP_STRING([--enable-gcov], + [compile with coverage profiling instrumentation (gcc only)]), + enable_gcov=$enableval, + enable_gcov=no) + if test x$enable_gcov = xyes ; then + if test "x$GCC" != "xyes" + then + AC_MSG_ERROR([gcov only works if gcc is used]) + fi + + AS_COMPILER_FLAG(["-fprofile-arcs"], + [GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs"], + true) + AS_COMPILER_FLAG(["-ftest-coverage"], + [GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage"], + true) + dnl remove any -O flags - FIXME: is this needed ? + GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[[0-9]]*//g'` + dnl libtool 1.5.22 and lower strip -fprofile-arcs from the flags + dnl passed to the linker, which is a bug; -fprofile-arcs implicitly + dnl links in -lgcov, so we do it explicitly here for the same effect + GCOV_LIBS=-lgcov + AC_SUBST(GCOV_CFLAGS) + AC_SUBST(GCOV_LIBS) + GCOV=`echo $CC | sed s/gcc/gcov/g` + AC_SUBST(GCOV) + + GST_GCOV_ENABLED=yes + AC_DEFINE_UNQUOTED(GST_GCOV_ENABLED, 1, + [Defined if gcov is enabled to force a rebuild due to config.h changing]) + dnl if gcov is used, we do not want default -O2 CFLAGS + if test "x$GST_GCOV_ENABLED" = "xyes" + then + CFLAGS="-O0" + AC_SUBST(CFLAGS) + CXXFLAGS="-O0" + AC_SUBST(CXXFLAGS) + FFLAGS="-O0" + AC_SUBST(FFLAGS) + CCASFLAGS="-O0" + AC_SUBST(CCASFLAGS) + AC_MSG_NOTICE([gcov enabled, setting CFLAGS and friends to $CFLAGS]) + fi + fi + AM_CONDITIONAL(GST_GCOV_ENABLED, test x$enable_gcov = xyes) +]) + +AC_DEFUN([AG_GST_ARG_EXAMPLES], +[ + AC_ARG_ENABLE(examples, + AC_HELP_STRING([--disable-examples], [disable building examples]), + [ + case "${enableval}" in + yes) BUILD_EXAMPLES=yes ;; + no) BUILD_EXAMPLES=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --disable-examples) ;; + esac + ], + [BUILD_EXAMPLES=yes]) dnl Default value + AM_CONDITIONAL(BUILD_EXAMPLES, test "x$BUILD_EXAMPLES" = "xyes") +]) + +AC_DEFUN([AG_GST_ARG_WITH_PKG_CONFIG_PATH], +[ + dnl possibly modify pkg-config path + AC_ARG_WITH(pkg-config-path, + AC_HELP_STRING([--with-pkg-config-path], + [colon-separated list of pkg-config(1) dirs]), + [ + export PKG_CONFIG_PATH=${withval} + AC_MSG_NOTICE(Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH) + ]) +]) + + +dnl This macro requires that GST_CVS is set to yes or no (release) +AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_NAME], +[ + dnl package name in plugins + AC_ARG_WITH(package-name, + AC_HELP_STRING([--with-package-name], + [specify package name to use in plugins]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; + *) GST_PACKAGE_NAME="${withval}" ;; + esac + ], + [ + P=$1 + if test "x$P" = "x" + then + P=$PACKAGE_NAME + fi + + dnl default value + if test "x$GST_CVS" = "xyes" + then + dnl nano >= 1 + GST_PACKAGE_NAME="$P CVS/prerelease" + else + GST_PACKAGE_NAME="$P source release" + fi + ] + ) + AC_MSG_NOTICE(Using $GST_PACKAGE_NAME as package name) + AC_DEFINE_UNQUOTED(GST_PACKAGE_NAME, "$GST_PACKAGE_NAME", + [package name in plugins]) + AC_SUBST(GST_PACKAGE_NAME) +]) + +AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_ORIGIN], +[ + dnl package origin URL + AC_ARG_WITH(package-origin, + AC_HELP_STRING([--with-package-origin], + [specify package origin URL to use in plugins]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;; + *) GST_PACKAGE_ORIGIN="${withval}" ;; + esac + ], + [GST_PACKAGE_ORIGIN="[Unknown package origin]"] dnl Default value + ) + AC_MSG_NOTICE(Using $GST_PACKAGE_ORIGIN as package origin) + AC_DEFINE_UNQUOTED(GST_PACKAGE_ORIGIN, "$GST_PACKAGE_ORIGIN", + [package origin]) + AC_SUBST(GST_PACKAGE_ORIGIN) +]) + +dnl sets WITH_PLUGINS to the list of plug-ins given as an argument +dnl also clears GST_PLUGINS_ALL and GST_PLUGINS_SELECTED +AC_DEFUN([AG_GST_ARG_WITH_PLUGINS], +[ + AC_ARG_WITH(plugins, + AC_HELP_STRING([--with-plugins], + [comma-separated list of dependencyless plug-ins to compile]), + [WITH_PLUGINS=$withval], + [WITH_PLUGINS=]) + + GST_PLUGINS_ALL="" + GST_PLUGINS_SELECTED="" + + AC_SUBST(GST_PLUGINS_ALL) + AC_SUBST(GST_PLUGINS_SELECTED) +]) + +dnl AG_GST_CHECK_PLUGIN(PLUGIN-NAME) +dnl +dnl This macro adds the plug-in to GST_PLUGINS_ALL. Then it +dnl checks if the plug-in is present in WITH_PLUGINS, and if so adds it to +dnl GST_PLUGINS_SELECTED. +dnl +dnl The macro will call AM_CONDITIONAL(USE_PLUGIN_, ...) to allow +dnl control of what is built in Makefile.ams. +AC_DEFUN([AG_GST_CHECK_PLUGIN], +[ + GST_PLUGINS_ALL="$GST_PLUGINS_ALL [$1]" + if [[ -z "$WITH_PLUGINS" ]] || echo " [$WITH_PLUGINS] " | tr , ' ' | grep -i " [$1] " > /dev/null; then + GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED [$1]" + fi + AM_CONDITIONAL([USE_PLUGIN_]translit([$1], a-z, A-Z), echo " $GST_PLUGINS_SELECTED " | grep -i " [$1] " > /dev/null) +]) + +dnl AG_GST_DISABLE_PLUGIN(PLUGIN-NAME) +dnl +dnl This macro disables the plug-in by removing it from +dnl GST_PLUGINS_SELECTED. +AC_DEFUN([AG_GST_DISABLE_PLUGIN], +[ + GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ [$1] / /'` + AM_CONDITIONAL([USE_PLUGIN_]translit([$1], a-z, A-Z), false) +]) + +AC_DEFUN([AG_GST_ARG_ENABLE_EXTERNAL], +[ + AG_GST_CHECK_FEATURE(EXTERNAL, [building of plug-ins with external deps],, + HAVE_EXTERNAL=yes, enabled, + [ + AC_MSG_NOTICE(building external plug-ins) + BUILD_EXTERNAL="yes" + ],[ + AC_MSG_WARN(all plug-ins with external dependencies will not be built) + BUILD_EXTERNAL="no" + ]) + # make BUILD_EXTERNAL available to Makefile.am + AM_CONDITIONAL(BUILD_EXTERNAL, test "x$BUILD_EXTERNAL" = "xyes") +]) + +dnl experimental plug-ins; stuff that hasn't had the dust settle yet +dnl read 'builds, but might not work' +AC_DEFUN([AG_GST_ARG_ENABLE_EXPERIMENTAL], +[ + AG_GST_CHECK_FEATURE(EXPERIMENTAL, [building of experimental plug-ins],, + HAVE_EXPERIMENTAL=yes, disabled, + [ + AC_MSG_WARN(building experimental plug-ins) + BUILD_EXPERIMENTAL="yes" + ],[ + AC_MSG_NOTICE(not building experimental plug-ins) + BUILD_EXPERIMENTAL="no" + ]) + # make BUILD_EXPERIMENTAL available to Makefile.am + AM_CONDITIONAL(BUILD_EXPERIMENTAL, test "x$BUILD_EXPERIMENTAL" = "xyes") +]) + +dnl broken plug-ins; stuff that doesn't seem to build at the moment +AC_DEFUN([AG_GST_ARG_ENABLE_BROKEN], +[ + AG_GST_CHECK_FEATURE(BROKEN, [building of broken plug-ins],, + HAVE_BROKEN=yes, disabled, + [ + AC_MSG_WARN([building broken plug-ins -- no bug reports on these, only patches ...]) + ],[ + AC_MSG_NOTICE([not building broken plug-ins]) + ]) +]) diff --git a/mobile/common/m4/gst-check.m4 b/mobile/common/m4/gst-check.m4 new file mode 100755 index 0000000..3f6b8ff --- /dev/null +++ b/mobile/common/m4/gst-check.m4 @@ -0,0 +1,138 @@ +dnl pkg-config-based checks for GStreamer modules and dependency modules + +dnl generic: +dnl AG_GST_PKG_CHECK_MODULES([PREFIX], [WHICH], [REQUIRED]) +dnl sets HAVE_[$PREFIX], [$PREFIX]_* +dnl AG_GST_CHECK_MODULES([PREFIX], [MODULE], [MINVER], [NAME], [REQUIRED]) +dnl sets HAVE_[$PREFIX], [$PREFIX]_* + +dnl specific: +dnl AG_GST_CHECK_GST([MAJMIN], [MINVER], [REQUIRED]) +dnl also sets/ACSUBSTs GST_TOOLS_DIR and GST_PLUGINS_DIR +dnl AG_GST_CHECK_GST_BASE([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_GDP([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_CONTROLLER([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_CHECK([MAJMIN], [MINVER], [REQUIRED]) +dnl AG_GST_CHECK_GST_PLUGINS_BASE([MAJMIN], [MINVER], [REQUIRED]) +dnl also sets/ACSUBSTs GSTPB_PLUGINS_DIR + +AC_DEFUN([AG_GST_PKG_CHECK_MODULES], +[ + which="[$2]" + dnl not required by default, since we use this mostly for plugin deps + required=ifelse([$3], , "no", [$3]) + + PKG_CHECK_MODULES([$1], $which, + [ + HAVE_[$1]="yes" + ], + [ + HAVE_[$1]="no" + AC_MSG_RESULT(no) + if test "x$required" = "xyes"; then + AC_MSG_ERROR($[$1]_PKG_ERRORS) + else + AC_MSG_NOTICE($[$1]_PKG_ERRORS) + fi + ]) + + dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7 + dnl It gets done automatically in automake >= 1.7, which we now require +])) + +AC_DEFUN([AG_GST_CHECK_MODULES], +[ + module=[$2] + minver=[$3] + name="[$4]" + required=ifelse([$5], , "yes", [$5]) dnl required by default + + PKG_CHECK_MODULES([$1], $module >= $minver, + [ + HAVE_[$1]="yes" + ], + [ + HAVE_[$1]="no" + AC_MSG_RESULT(no) + AC_MSG_NOTICE($[$1]_PKG_ERRORS) + if test "x$required" = "xyes"; then + AC_MSG_ERROR([no $module >= $minver ($name) found]) + else + AC_MSG_NOTICE([no $module >= $minver ($name) found]) + fi + ]) + + dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7 + dnl It gets done automatically in automake >= 1.7, which we now require +])) + +AC_DEFUN([AG_GST_CHECK_GST], +[ + AG_GST_CHECK_MODULES(GST, gstreamer-[$1], [$2], [GStreamer], [$3]) + dnl allow setting before calling this macro to override + if test -z $GST_TOOLS_DIR; then + GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-[$1]` + if test -z $GST_TOOLS_DIR; then + AC_MSG_ERROR( + [no tools dir set in GStreamer pkg-config file, core upgrade needed.]) + fi + fi + AC_MSG_NOTICE([using GStreamer tools in $GST_TOOLS_DIR]) + AC_SUBST(GST_TOOLS_DIR) + + dnl check for where core plug-ins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GST_PLUGINS_DIR; then + GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-[$1]` + if test -z $GST_PLUGINS_DIR; then + AC_MSG_ERROR( + [no pluginsdir set in GStreamer pkg-config file, core upgrade needed.]) + fi + fi + AC_MSG_NOTICE([using GStreamer plug-ins in $GST_PLUGINS_DIR]) + AC_SUBST(GST_PLUGINS_DIR) +]) + +AC_DEFUN([AG_GST_CHECK_GST_BASE], +[ + AG_GST_CHECK_MODULES(GST_BASE, gstreamer-base-[$1], [$2], + [GStreamer Base Libraries], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_GDP], +[ + AG_GST_CHECK_MODULES(GST_GDP, gstreamer-dataprotocol-[$1], [$2], + [GStreamer Data Protocol Library], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_CONTROLLER], +[ + AG_GST_CHECK_MODULES(GST_CONTROLLER, gstreamer-controller-[$1], [$2], + [GStreamer Controller Library], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_CHECK], +[ + AG_GST_CHECK_MODULES(GST_CHECK, gstreamer-check-[$1], [$2], + [GStreamer Check unittest Library], [$3]) +]) + +AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_BASE], +[ + AG_GST_CHECK_MODULES(GST_PLUGINS_BASE, gstreamer-plugins-base-[$1], [$2], + [GStreamer Base Plug-ins Library], [$3]) + + dnl check for where base plug-ins got installed + dnl this is used for unit tests + dnl allow setting before calling this macro to override + if test -z $GSTPB_PLUGINS_DIR; then + GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-[$1]` + if test -z $GSTPB_PLUGINS_DIR; then + AC_MSG_ERROR( + [no pluginsdir set in GStreamer Base Plug-ins pkg-config file]) + fi + fi + AC_MSG_NOTICE([using GStreamer Base Plug-ins in $GSTPB_PLUGINS_DIR]) + AC_SUBST(GSTPB_PLUGINS_DIR) +]) diff --git a/mobile/common/m4/gst-debuginfo.m4 b/mobile/common/m4/gst-debuginfo.m4 new file mode 100755 index 0000000..b48854d --- /dev/null +++ b/mobile/common/m4/gst-debuginfo.m4 @@ -0,0 +1,46 @@ +AC_DEFUN([AG_GST_DEBUGINFO], [ +AC_ARG_ENABLE(debug, +AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]), +[case "${enableval}" in + yes) USE_DEBUG=yes ;; + no) USE_DEBUG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; +esac], +[USE_DEBUG=yes]) dnl Default value + +AC_ARG_ENABLE(DEBUG, +AC_HELP_STRING([--disable-DEBUG],[disables compilation of debugging messages]), +[case "${enableval}" in + yes) ENABLE_DEBUG=yes ;; + no) ENABLE_DEBUG=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-DEBUG) ;; +esac], +[ENABLE_DEBUG=yes]) dnl Default value +if test x$ENABLE_DEBUG = xyes; then + AC_DEFINE(GST_DEBUG_ENABLED, 1, [Define if DEBUG statements should be compiled in]) +fi + +AC_ARG_ENABLE(INFO, +AC_HELP_STRING([--disable-INFO],[disables compilation of informational messages]), +[case "${enableval}" in + yes) ENABLE_INFO=yes ;; + no) ENABLE_INFO=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-INFO) ;; +esac], +[ENABLE_INFO=yes]) dnl Default value +if test x$ENABLE_INFO = xyes; then + AC_DEFINE(GST_INFO_ENABLED, 1, [Define if INFO statements should be compiled in]) +fi + +AC_ARG_ENABLE(debug-color, +AC_HELP_STRING([--disable-debug-color],[disables color output of DEBUG and INFO output]), +[case "${enableval}" in + yes) ENABLE_DEBUG_COLOR=yes ;; + no) ENABLE_DEBUG_COLOR=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug-color) ;; +esac], +[ENABLE_DEBUG_COLOR=yes]) dnl Default value +if test "x$ENABLE_DEBUG_COLOR" = xyes; then + AC_DEFINE(GST_DEBUG_COLOR, 1, [Define if debugging messages should be colorized]) +fi +]) diff --git a/mobile/common/m4/gst-default.m4 b/mobile/common/m4/gst-default.m4 new file mode 100755 index 0000000..da1a81c --- /dev/null +++ b/mobile/common/m4/gst-default.m4 @@ -0,0 +1,45 @@ +dnl default elements used for tests and such + +dnl AG_GST_DEFAULT_ELEMENTS + +AC_DEFUN([AG_GST_DEFAULT_ELEMENTS], +[ + dnl decide on default elements + dnl FIXME: provide configure-time options for this + dnl FIXME: describe where exactly this gets used + dnl FIXME: decide if it's a problem that this could point to sinks from + dnl depending plugin modules + DEFAULT_AUDIOSINK="autoaudiosink" + DEFAULT_VIDEOSINK="autovideosink" + DEFAULT_AUDIOSRC="alsasrc" + DEFAULT_VIDEOSRC="v4lsrc" + DEFAULT_VISUALIZER="goom" + case "$host" in + *-sun-* | *pc-solaris* ) + DEFAULT_AUDIOSINK="sunaudiosink" + DEFAULT_VIDEOSINK="ximagesink" + DEFAULT_AUDIOSRC="sunaudiosrc" + ;; + *-darwin* ) + DEFAULT_AUDIOSINK="osxaudiosink" + DEFAULT_AUDIOSRC="osxaudiosrc" + DEFAULT_VIDEOSINK="osxvideosink" + ;; + esac + + AC_SUBST(DEFAULT_AUDIOSINK) + AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSINK, "$DEFAULT_AUDIOSINK", + [Default audio sink]) + AC_SUBST(DEFAULT_AUDIOSRC) + AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSRC, "$DEFAULT_AUDIOSRC", + [Default audio source]) + AC_SUBST(DEFAULT_VIDEOSINK) + AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSINK, "$DEFAULT_VIDEOSINK", + [Default video sink]) + AC_SUBST(DEFAULT_VIDEOSRC) + AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSRC, "$DEFAULT_VIDEOSRC", + [Default video source]) + AC_SUBST(DEFAULT_VISUALIZER) + AC_DEFINE_UNQUOTED(DEFAULT_VISUALIZER, "$DEFAULT_VISUALIZER", + [Default visualizer]) +]) diff --git a/mobile/common/m4/gst-doc.m4 b/mobile/common/m4/gst-doc.m4 new file mode 100755 index 0000000..7000c17 --- /dev/null +++ b/mobile/common/m4/gst-doc.m4 @@ -0,0 +1,148 @@ +AC_DEFUN([AG_GST_DOCBOOK_CHECK], +[ + dnl choose a location to install docbook docs in + if test "x$PACKAGE_TARNAME" = "x" + then + AC_MSG_ERROR([Internal error - PACKAGE_TARNAME not set]) + fi + docdir="\$(datadir)/doc/$PACKAGE_TARNAME-$GST_MAJORMINOR" + + dnl enable/disable docbook documentation building + AC_ARG_ENABLE(docbook, + AC_HELP_STRING([--enable-docbook], + [use docbook to build documentation [default=no]]),, + enable_docbook=no) + + have_docbook=no + + if test x$enable_docbook = xyes; then + dnl check if we actually have everything we need + + dnl check for docbook tools + AC_CHECK_PROG(HAVE_DOCBOOK2PS, docbook2ps, yes, no) + AC_CHECK_PROG(HAVE_DOCBOOK2HTML, docbook2html, yes, no) + AC_CHECK_PROG(HAVE_JADETEX, jadetex, yes, no) + AC_CHECK_PROG(HAVE_PS2PDF, ps2pdf, yes, no) + + # -V option appeared in 0.6.10 + docbook2html_min_version=0.6.10 + if test "x$HAVE_DOCBOOK2HTML" != "xno"; then + docbook2html_version=`docbook2html --version` + AC_MSG_CHECKING([docbook2html version ($docbook2html_version) >= $docbook2html_min_version]) + if perl -w < \$min_version_major) || + ((\$docbook2html_version_major == \$min_version_major) && + (\$docbook2html_version_minor >= \$min_version_minor)) || + ((\$docbook2html_version_major == \$min_version_major) && + (\$docbook2html_version_minor >= \$min_version_minor) && + (\$docbook2html_version_micro >= \$min_version_micro))) + ? 0 : 1); +EOF + then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + HAVE_DOCBOOK2HTML=no + fi + fi + + dnl check if we can process docbook stuff + AS_DOCBOOK(have_docbook=yes, have_docbook=no) + + dnl check for extra tools + AC_CHECK_PROG(HAVE_DVIPS, dvips, yes, no) + AC_CHECK_PROG(HAVE_XMLLINT, xmllint, yes, no) + + dnl check for image conversion tools + AC_CHECK_PROG(HAVE_FIG2DEV, fig2dev, yes, no) + if test "x$HAVE_FIG2DEV" = "xno" ; then + AC_MSG_WARN([Did not find fig2dev (from xfig), images will not be generated.]) + fi + + dnl The following is a hack: if fig2dev doesn't display an error message + dnl for the desired type, we assume it supports it. + HAVE_FIG2DEV_EPS=no + if test "x$HAVE_FIG2DEV" = "xyes" ; then + fig2dev_quiet=`fig2dev -L eps &1 >/dev/null` + if test "x$fig2dev_quiet" = "x" ; then + HAVE_FIG2DEV_EPS=yes + fi + fi + HAVE_FIG2DEV_PNG=no + if test "x$HAVE_FIG2DEV" = "xyes" ; then + fig2dev_quiet=`fig2dev -L png &1 >/dev/null` + if test "x$fig2dev_quiet" = "x" ; then + HAVE_FIG2DEV_PNG=yes + fi + fi + HAVE_FIG2DEV_PDF=no + if test "x$HAVE_FIG2DEV" = "xyes" ; then + fig2dev_quiet=`fig2dev -L pdf &1 >/dev/null` + if test "x$fig2dev_quiet" = "x" ; then + HAVE_FIG2DEV_PDF=yes + fi + fi + + AC_CHECK_PROG(HAVE_PNGTOPNM, pngtopnm, yes, no) + AC_CHECK_PROG(HAVE_PNMTOPS, pnmtops, yes, no) + AC_CHECK_PROG(HAVE_EPSTOPDF, epstopdf, yes, no) + + dnl check if we can generate HTML + if test "x$HAVE_DOCBOOK2HTML" = "xyes" && \ + test "x$enable_docbook" = "xyes" && \ + test "x$HAVE_XMLLINT" = "xyes" && \ + test "x$HAVE_FIG2DEV_PNG" = "xyes"; then + DOC_HTML=yes + AC_MSG_NOTICE(Will output HTML documentation) + else + DOC_HTML=no + AC_MSG_NOTICE(Will not output HTML documentation) + fi + + dnl check if we can generate PS + if test "x$HAVE_DOCBOOK2PS" = "xyes" && \ + test "x$enable_docbook" = "xyes" && \ + test "x$HAVE_XMLLINT" = "xyes" && \ + test "x$HAVE_JADETEX" = "xyes" && \ + test "x$HAVE_FIG2DEV_EPS" = "xyes" && \ + test "x$HAVE_DVIPS" = "xyes" && \ + test "x$HAVE_PNGTOPNM" = "xyes" && \ + test "x$HAVE_PNMTOPS" = "xyes"; then + DOC_PS=yes + AC_MSG_NOTICE(Will output PS documentation) + else + DOC_PS=no + AC_MSG_NOTICE(Will not output PS documentation) + fi + + dnl check if we can generate PDF - using only ps2pdf + if test "x$DOC_PS" = "xyes" && \ + test "x$enable_docbook" = "xyes" && \ + test "x$HAVE_XMLLINT" = "xyes" && \ + test "x$HAVE_PS2PDF" = "xyes"; then + DOC_PDF=yes + AC_MSG_NOTICE(Will output PDF documentation) + else + DOC_PDF=no + AC_MSG_NOTICE(Will not output PDF documentation) + fi + + dnl if we don't have everything, we should disable + if test "x$have_docbook" != "xyes"; then + enable_docbook=no + fi + fi + + dnl if we're going to install documentation, tell us where + if test "x$have_docbook" = "xyes"; then + AC_MSG_NOTICE(Installing documentation in $docdir) + AC_SUBST(docdir) + fi + + AM_CONDITIONAL(ENABLE_DOCBOOK, test x$enable_docbook = xyes) + AM_CONDITIONAL(DOC_HTML, test x$DOC_HTML = xyes) + AM_CONDITIONAL(DOC_PDF, test x$DOC_PDF = xyes) + AM_CONDITIONAL(DOC_PS, test x$DOC_PS = xyes) +]) diff --git a/mobile/common/m4/gst-error.m4 b/mobile/common/m4/gst-error.m4 new file mode 100755 index 0000000..f97f9a6 --- /dev/null +++ b/mobile/common/m4/gst-error.m4 @@ -0,0 +1,145 @@ +Dnl handle various error-related things + +dnl Thomas Vander Stichele +dnl Tim-Philipp Müller + +dnl Last modification: 2008-02-18 + +dnl AG_GST_SET_ERROR_CFLAGS([ADD-WERROR]) +dnl AG_GST_SET_ERROR_CXXFLAGS([ADD-WERROR]) +dnl AG_GST_SET_LEVEL_DEFAULT([IS-CVS-VERSION]) + + +dnl Sets ERROR_CFLAGS to something the compiler will accept. +dnl AC_SUBST them so they are available in Makefile + +dnl -Wall is added if it is supported +dnl -Werror is added if ADD-WERROR is not "no" + +dnl These flags can be overridden at make time: +dnl make ERROR_CFLAGS= +AC_DEFUN([AG_GST_SET_ERROR_CFLAGS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AS_COMPILER_FLAG]) + + + dnl if we support -Wall, set it unconditionally + AS_COMPILER_FLAG(-Wall, + ERROR_CFLAGS="-Wall", + ERROR_CFLAGS="") + + dnl if asked for, add -Werror if supported + if test "x$1" != "xno" + then + AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror") + + dnl if -Werror isn't suported, try -errwarn=%all (Sun Forte case) + if test "x$ERROR_CFLAGS" == "x" + then + AS_COMPILER_FLAG([-errwarn=%all], [ + ERROR_CFLAGS="-errwarn=%all" + dnl try -errwarn=%all,no%E_EMPTY_DECLARATION, + dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH, + dnl no%E_MACRO_REDEFINED (Sun Forte case) + dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon + dnl "statement not reached" disabled because there is g_assert_not_reached () in some places + dnl "macro redefined" because of gst/gettext.h + dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'? + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' + do + AS_COMPILER_FLAG([-errwarn=%all,$f], [ + ERROR_CFLAGS="$ERROR_CFLAGS,$f" + ]) + done + ]) + fi + fi + + AC_SUBST(ERROR_CFLAGS) + AC_MSG_NOTICE([set ERROR_CFLAGS to $ERROR_CFLAGS]) +]) + +dnl Sets ERROR_CXXFLAGS to something the compiler will accept. +dnl AC_SUBST them so they are available in Makefile + +dnl -Wall is added if it is supported +dnl -Werror is added if ADD-WERROR is not "no" + +dnl These flags can be overridden at make time: +dnl make ERROR_CXXFLAGS= +AC_DEFUN([AG_GST_SET_ERROR_CXXFLAGS], +[ + AC_REQUIRE([AC_PROG_CXX]) + AC_REQUIRE([AS_CXX_COMPILER_FLAG]) + + + dnl if we support -Wall, set it unconditionally + AS_CXX_COMPILER_FLAG(-Wall, [ + ERROR_CXXFLAGS="-Wall" + ], [ + ERROR_CXXFLAGS="" + ]) + + dnl if asked for, add -Werror if supported + if test "x$1" != "xno" + then + AS_CXX_COMPILER_FLAG(-Werror, werror_supported=yes, werror_supported=no) + + if test "x$werror_supported" = "xyes"; then + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror" + + dnl add exceptions + for f in '-Wno-non-virtual-dtor' + do + AS_CXX_COMPILER_FLAG([$f], ERROR_CXXFLAGS="$ERROR_CXXFLAGS $f") + done + else + dnl if -Werror isn't suported, try -errwarn=%all + AS_CXX_COMPILER_FLAG([-errwarn=%all], errwarnall=yes, errwarnall=no) + if test "x$errwarnall" = "xyes"; then + ERROR_CXXFLAGS="-errwarn=%all" + dnl try -errwarn=%all,no%E_EMPTY_DECLARATION, + dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH, + dnl no%E_MACRO_REDEFINED (Sun Forte case) + dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon + dnl "statement not reached" disabled because there is g_assert_not_reached () in some places + dnl "macro redefined" because of gst/gettext.h + dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'? + dnl FIXME: do any of these work with the c++ compiler? if not, why + dnl do we check at all? + for f in 'no%E_EMPTY_DECLARATION' \ + 'no%E_STATEMENT_NOT_REACHED' \ + 'no%E_ARGUEMENT_MISMATCH' \ + 'no%E_MACRO_REDEFINED' + do + AS_CXX_COMPILER_FLAG([-errwarn=%all,$f], [ + ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f" + ]) + done + fi + fi + fi + + AC_SUBST(ERROR_CXXFLAGS) + AC_MSG_NOTICE([set ERROR_CXXFLAGS to $ERROR_CXXFLAGS]) +]) + +dnl Sets the default error level for debugging messages +AC_DEFUN([AG_GST_SET_LEVEL_DEFAULT], +[ + dnl define correct errorlevel for debugging messages. We want to have + dnl GST_ERROR messages printed when running cvs builds + if test "x[$1]" = "xyes"; then + GST_LEVEL_DEFAULT=GST_LEVEL_ERROR + else + GST_LEVEL_DEFAULT=GST_LEVEL_NONE + fi + AC_DEFINE_UNQUOTED(GST_LEVEL_DEFAULT, $GST_LEVEL_DEFAULT, + [Default errorlevel to use]) + dnl AC_SUBST so we can use it for win32/common/config.h + AC_SUBST(GST_LEVEL_DEFAULT) +]) diff --git a/mobile/common/m4/gst-feature.m4 b/mobile/common/m4/gst-feature.m4 new file mode 100755 index 0000000..6777029 --- /dev/null +++ b/mobile/common/m4/gst-feature.m4 @@ -0,0 +1,286 @@ +dnl Perform a check for a feature for GStreamer +dnl Richard Boulton +dnl Thomas Vander Stichele added useful stuff +dnl Last modification: 25/06/2001 +dnl +dnl AG_GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION, +dnl DEPENDENT-PLUGINS, TEST-FOR-FEATURE, +dnl DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE) +dnl +dnl This macro adds a command line argument to allow the user to enable +dnl or disable a feature, and if the feature is enabled, performs a supplied +dnl test to check if the feature is available. +dnl +dnl The test should define HAVE_ to "yes" or "no" depending +dnl on whether the feature is available. +dnl +dnl The macro will set USE_ to "yes" or "no" depending on +dnl whether the feature is to be used. +dnl Thomas changed this, so that when USE_ was already set +dnl to no, then it stays that way. +dnl +dnl The macro will call AM_CONDITIONAL(USE_, ...) to allow +dnl the feature to control what is built in Makefile.ams. If you want +dnl additional actions resulting from the test, you can add them with the +dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters. +dnl +dnl FEATURE-NAME is the name of the feature, and should be in +dnl purely upper case characters. +dnl FEATURE-DESCRIPTION is used to describe the feature in help text for +dnl the command line argument. +dnl DEPENDENT-PLUGINS lists any plug-ins which depend on this feature. +dnl TEST-FOR-FEATURE is a test which sets HAVE_ to "yes" +dnl or "no" depending on whether the feature is +dnl available. +dnl DISABLE-BY-DEFAULT if "disabled", the feature is disabled by default, +dnl if any other value, the feature is enabled by default. +dnl ACTION-IF-USE any extra actions to perform if the feature is to be +dnl used. +dnl ACTION-IF-NOTUSE any extra actions to perform if the feature is not to +dnl be used. +dnl +dnl +dnl thomas : +dnl we also added a history. +dnl GST_PLUGINS_YES will contain all plugins to be built +dnl that were checked through AG_GST_CHECK_FEATURE +dnl GST_PLUGINS_NO will contain those that won't be built + +AC_DEFUN([AG_GST_CHECK_FEATURE], +[echo +AC_MSG_NOTICE(*** checking feature: [$2] ***) +if test "x[$3]" != "x" +then + AC_MSG_NOTICE(*** for plug-ins: [$3] ***) +fi +dnl +builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl +dnl if it is set to NO, then don't even consider it for building +NOUSE= +if test "x$USE_[$1]" = "xno"; then + NOUSE="yes" +fi +AC_ARG_ENABLE(translit([$1], A-Z, a-z), + [ ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])), + [ case "${enableval}" in + yes) USE_[$1]=yes;; + no) USE_[$1]=no;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;; + esac], + [ USE_$1=]ifelse($5, [disabled], [no], [yes])) dnl DEFAULT + +dnl *** set it back to no if it was preset to no +if test "x$NOUSE" = "xyes"; then + USE_[$1]="no" + AC_MSG_WARN(*** $3 pre-configured not to be built) +fi +NOUSE= + +dnl *** If it's enabled + +if test x$USE_[$1] = xyes; then + dnl save compile variables before the test + + gst_check_save_LIBS=$LIBS + gst_check_save_LDFLAGS=$LDFLAGS + gst_check_save_CFLAGS=$CFLAGS + gst_check_save_CPPFLAGS=$CPPFLAGS + gst_check_save_CXXFLAGS=$CXXFLAGS + + HAVE_[$1]=no + dnl TEST_FOR_FEATURE + $4 + + LIBS=$gst_check_save_LIBS + LDFLAGS=$gst_check_save_LDFLAGS + CFLAGS=$gst_check_save_CFLAGS + CPPFLAGS=$gst_check_save_CPPFLAGS + CXXFLAGS=$gst_check_save_CXXFLAGS + + dnl If it isn't found, unset USE_[$1] + if test x$HAVE_[$1] = xno; then + USE_[$1]=no + else + ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will be built: [$3])]) + fi +fi +dnl *** Warn if it's disabled or not found +if test x$USE_[$1] = xyes; then + ifelse([$6], , :, [$6]) + if test "x$3" != "x"; then + GST_PLUGINS_YES="\t[$3]\n$GST_PLUGINS_YES" + fi + AC_DEFINE(HAVE_[$1], , [Define to enable $2]ifelse($3,,, [ (used by $3)]).) +else + ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will not be built: [$3])]) + if test "x$3" != "x"; then + GST_PLUGINS_NO="\t[$3]\n$GST_PLUGINS_NO" + fi + ifelse([$7], , :, [$7]) +fi +dnl *** Define the conditional as appropriate +AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes) +]) + +dnl Use a -config program which accepts --cflags and --libs parameters +dnl to set *_CFLAGS and *_LIBS and check existence of a feature. +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl AG_GST_CHECK_CONFIGPROG(FEATURE-NAME, CONFIG-PROG-FILENAME, MODULES) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN([AG_GST_CHECK_CONFIGPROG], +[ + AC_PATH_PROG([$1]_CONFIG, [$2], no) + if test x$[$1]_CONFIG = xno; then + [$1]_LIBS= + [$1]_CFLAGS= + HAVE_[$1]=no + else + if [$2] --plugin-libs [$3] &> /dev/null; then + [$1]_LIBS=`[$2] --plugin-libs [$3]` + else + [$1]_LIBS=`[$2] --libs [$3]` + fi + [$1]_CFLAGS=`[$2] --cflags [$3]` + HAVE_[$1]=yes + fi + AC_SUBST([$1]_LIBS) + AC_SUBST([$1]_CFLAGS) +]) + +dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once +dnl sets HAVE_module if we have it +dnl Richard Boulton +dnl Last modification: 26/06/2001 +dnl AG_GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, +dnl HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND) +dnl +dnl This check was written for GStreamer: it should be renamed and checked +dnl for portability if you decide to use it elsewhere. +dnl +AC_DEFUN([AG_GST_CHECK_LIBHEADER], +[ + AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4]) + if test "x$HAVE_[$1]" = "xyes"; then + AC_CHECK_HEADER([$5], :, HAVE_[$1]=no) + if test "x$HAVE_[$1]" = "xyes"; then + dnl execute what needs to be + ifelse([$6], , :, [$6]) + else + ifelse([$7], , :, [$7]) + fi + else + ifelse([$7], , :, [$7]) + fi + AC_SUBST(HAVE_[$1]) +] +) + +dnl 2004-02-14 Thomas - changed to get set properly and use proper output +dnl 2003-06-27 Benjamin Otte - changed to make this work with gstconfig.h +dnl +dnl Add a subsystem --disable flag and all the necessary symbols and substitions +dnl +dnl AG_GST_CHECK_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name]) +dnl +AC_DEFUN([AG_GST_CHECK_SUBSYSTEM_DISABLE], +[ + dnl this define will replace each literal subsys_def occurrence with + dnl the lowercase hyphen-separated subsystem + dnl e.g. if $1 is GST_DEBUG then subsys_def will be a macro with gst-debug + define([subsys_def],translit([$1], _A-Z, -a-z)) + + AC_ARG_ENABLE(subsys_def, + AC_HELP_STRING(--disable-subsys_def, [disable $2]), + [ + case "${enableval}" in + yes) GST_DISABLE_[$1]=no ;; + no) GST_DISABLE_[$1]=yes ;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-subsys_def]) ;; + esac + ], + [GST_DISABLE_[$1]=no]) dnl Default value + + if test x$GST_DISABLE_[$1] = xyes; then + AC_MSG_NOTICE([disabled subsystem [$2]]) + GST_DISABLE_[$1]_DEFINE="#define GST_DISABLE_$1 1" + else + GST_DISABLE_[$1]_DEFINE="/* #undef GST_DISABLE_$1 */" + fi + AC_SUBST(GST_DISABLE_[$1]_DEFINE) + undefine([subsys_def]) +]) + + +dnl Parse gstconfig.h for feature and defines add the symbols and substitions +dnl +dnl AG_GST_PARSE_SUBSYSTEM_DISABLE(GST_CONFIGPATH, FEATURE) +dnl +AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLE], +[ + grep >/dev/null "#undef GST_DISABLE_$2" $1 + if test $? = 0; then + GST_DISABLE_[$2]=0 + else + GST_DISABLE_[$2]=1 + fi + AC_SUBST(GST_DISABLE_[$2]) +]) + +dnl Parse gstconfig.h and defines add the symbols and substitions +dnl +dnl GST_CONFIGPATH=`$PKG_CONFIG --variable=includedir gstreamer-0.10`"/gst/gstconfig.h" +dnl AG_GST_PARSE_SUBSYSTEM_DISABLES(GST_CONFIGPATH) +dnl +AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLES], +[ + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,GST_DEBUG) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,LOADSAVE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PARSE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,TRACE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,ALLOC_TRACE) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,REGISTRY) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,ENUMTYPES) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,INDEX) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PLUGIN) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,URI) + AG_GST_PARSE_SUBSYSTEM_DISABLE($1,XML) +]) + + + +dnl relies on GST_PLUGINS_ALL, GST_PLUGINS_SELECTED, GST_PLUGINS_YES, +dnl GST_PLUGINS_NO, and BUILD_EXTERNAL +AC_DEFUN([AG_GST_OUTPUT_PLUGINS], [ + +printf "configure: *** Plug-ins without external dependencies that will be built:\n" +( for i in $GST_PLUGINS_SELECTED; do printf '\t'$i'\n'; done ) | sort +printf "\n" + +printf "configure: *** Plug-ins without external dependencies that will NOT be built:\n" +( for i in $GST_PLUGINS_ALL; do + case $GST_PLUGINS_SELECTED in + *$i*) + ;; + *) + printf '\t'$i'\n' + ;; + esac + done ) | sort +printf "\n" + +if test "x$BUILD_EXTERNAL" = "xno"; then + printf "configure: *** No plug-ins with external dependencies will be built\n" +else + printf "configure: *** Plug-ins with dependencies that will be built:" + printf "$GST_PLUGINS_YES\n" | sort + printf "\n" + printf "configure: *** Plug-ins with dependencies that will NOT be built:" + printf "$GST_PLUGINS_NO\n" | sort + printf "\n" +fi +]) + diff --git a/mobile/common/m4/gst-function.m4 b/mobile/common/m4/gst-function.m4 new file mode 100755 index 0000000..1216621 --- /dev/null +++ b/mobile/common/m4/gst-function.m4 @@ -0,0 +1,63 @@ +dnl +dnl Check for compiler mechanism to show functions in debugging +dnl copied from an Ali patch floating on the internet +dnl +AC_DEFUN([AG_GST_CHECK_FUNCTION],[ + dnl #1: __PRETTY_FUNCTION__ + AC_MSG_CHECKING(whether $CC implements __PRETTY_FUNCTION__) + AC_CACHE_VAL(have_pretty_function,[ + AC_TRY_LINK([#include ], + [printf("%s", __PRETTY_FUNCTION__);], + have_pretty_function=yes, + have_pretty_function=no) + ]) + AC_MSG_RESULT($have_pretty_function) + if test "$have_pretty_function" = yes; then + AC_DEFINE(HAVE_PRETTY_FUNCTION, 1, + [defined if the compiler implements __PRETTY_FUNCTION__]) + fi + +dnl #2: __FUNCTION__ + AC_MSG_CHECKING(whether $CC implements __FUNCTION__) + AC_CACHE_VAL(have_function,[ + AC_TRY_LINK([#include ], + [printf("%s", __FUNCTION__);], + have_function=yes, + have_function=no) + ]) + AC_MSG_RESULT($have_function) + if test "$have_function" = yes; then + AC_DEFINE(HAVE_FUNCTION, 1, + [defined if the compiler implements __FUNCTION__]) + fi + +dnl #3: __func__ + AC_MSG_CHECKING(whether $CC implements __func__) + AC_CACHE_VAL(have_func,[ + AC_TRY_LINK([#include ], + [printf("%s", __func__);], + have_func=yes, + have_func=no) + ]) + AC_MSG_RESULT($have_func) + if test "$have_func" = yes; then + AC_DEFINE(HAVE_FUNC, 1, + [defined if the compiler implements __func__]) + fi + +dnl now define FUNCTION to whatever works, and fallback to "" + if test "$have_pretty_function" = yes; then + function=__PRETTY_FUNCTION__ + else + if test "$have_function" = yes; then + function=__FUNCTION__ + else + if test "$have_func" = yes; then + function=__func__ + else + function=\"\" + fi + fi + fi + AC_DEFINE_UNQUOTED(GST_FUNCTION, $function, [macro to use to show function name]) +]) diff --git a/mobile/common/m4/gst-gettext.m4 b/mobile/common/m4/gst-gettext.m4 new file mode 100755 index 0000000..a63651b --- /dev/null +++ b/mobile/common/m4/gst-gettext.m4 @@ -0,0 +1,21 @@ +dnl gettext setup + +dnl AG_GST_GETTEXT([gettext-package]) +dnl defines GETTEXT_PACKAGE and LOCALEDIR + +AC_DEFUN([AG_GST_GETTEXT], +[ + if test "$USE_NLS" = "yes"; then + GETTEXT_PACKAGE=[$1] + else + GETTEXT_PACKAGE=[NULL] + fi + AC_SUBST(GETTEXT_PACKAGE) + AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], "$GETTEXT_PACKAGE", + [gettext package name]) + + dnl define LOCALEDIR in config.h + AS_AC_EXPAND(LOCALEDIR, $datadir/locale) + AC_DEFINE_UNQUOTED([LOCALEDIR], "$LOCALEDIR", + [gettext locale dir]) +]) diff --git a/mobile/common/m4/gst-glib2.m4 b/mobile/common/m4/gst-glib2.m4 new file mode 100755 index 0000000..3060e5e --- /dev/null +++ b/mobile/common/m4/gst-glib2.m4 @@ -0,0 +1,25 @@ +dnl check for a minimum version of GLib + +dnl AG_GST_GLIB_CHECK([minimum-version-required]) + +AC_DEFUN([AG_GST_GLIB_CHECK], +[ + dnl Minimum required version of GLib + GLIB_REQ=[$1] + if test "x$GLIB_REQ" = "x" + then + AC_MSG_ERROR([Please specify a required version for GLib 2.0]) + fi + AC_SUBST(GLIB_REQ) + + dnl Check for glib with everything + AG_GST_PKG_CHECK_MODULES(GLIB, + glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0) + + if test "x$HAVE_GLIB" = "xno"; then + AC_MSG_ERROR([This package requires GLib >= $GLIB_REQ to compile.]) + fi + + dnl for the poor souls who for example have glib in /usr/local + AS_SCRUB_INCLUDE(GLIB_CFLAGS) +]) diff --git a/mobile/common/m4/gst-libxml2.m4 b/mobile/common/m4/gst-libxml2.m4 new file mode 100755 index 0000000..7d978d3 --- /dev/null +++ b/mobile/common/m4/gst-libxml2.m4 @@ -0,0 +1,46 @@ +dnl call this macro with the minimum required version as an argument +dnl this macro sets and AC_SUBSTs XML_CFLAGS and XML_LIBS +dnl it also sets LIBXML_PKG, used for the pkg-config file + +AC_DEFUN([AG_GST_LIBXML2_CHECK], +[ + dnl Minimum required version of libxml2 + dnl default to 2.4.9 if not specified + LIBXML2_REQ=ifelse([$1],,2.4.9,[$1]) + AC_SUBST(LIBXML2_REQ) + + dnl check for libxml2 + PKG_CHECK_MODULES(XML, libxml-2.0 >= $LIBXML2_REQ, + HAVE_LIBXML2=yes, [ + AC_MSG_RESULT(no) + HAVE_LIBXML2=no + ]) + if test "x$HAVE_LIBXML2" = "xyes"; then + AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 is available]) + else + AC_MSG_ERROR([Need libxml2 for glib2 builds -- you should be able to do without it -- this needs fixing]) + fi + dnl this is for the .pc file + LIBXML_PKG=', libxml-2.0' + AC_SUBST(LIBXML_PKG) + AC_SUBST(XML_LIBS) + AC_SUBST(XML_CFLAGS) + + dnl XML_LIBS might pull in -lz without zlib actually being on the system, so + dnl try linking with these LIBS and CFLAGS + ac_save_CFLAGS=$CFLAGS + ac_save_LIBS=$LIBS + CFLAGS="$CFLAGS $XML_CFLAGS" + LIBS="$LIBS $XML_LIBS" + AC_TRY_LINK([ +#include +#include +],[ +/* function body */ +], + AC_MSG_NOTICE([Test xml2 program linked]), + AC_MSG_ERROR([Could not link libxml2 test program. Check if you have the necessary dependencies.]) + ) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" +]) diff --git a/mobile/common/m4/gst-parser.m4 b/mobile/common/m4/gst-parser.m4 new file mode 100755 index 0000000..9cc0981 --- /dev/null +++ b/mobile/common/m4/gst-parser.m4 @@ -0,0 +1,63 @@ +AC_DEFUN([AG_GST_BISON_CHECK], +[ + dnl FIXME: check if AC_PROG_YACC is suitable here + dnl FIXME: make precious + AC_PATH_PROG(BISON_PATH, bison, no) + if test x$BISON_PATH = xno; then + AC_MSG_ERROR(Could not find bison) + fi + + dnl check bison version + dnl FIXME 0.11: we need version >= 1.875 for the reentrancy support + dnl in the parser. If an older version is installed pre-generated + dnl sources are used. This should become a hard dependency for 0.11! + bison_min_version=1.875 + bison_version=`$BISON_PATH --version | head -n 1 | sed 's/^.*) //' | sed 's/[[a-zA-Z]]*$//' | cut -d' ' -f1` + AC_MSG_CHECKING([bison version $bison_version >= $bison_min_version]) + + if perl -w <= 2.5.31 for the reentrancy support + dnl in the parser. If an older version is installed pre-generated + dnl sources are used. This should become a hard dependency for 0.11! + flex_min_version=2.5.31 + flex_version=`$FLEX_PATH --version | head -n 1 | sed 's/^.* //' | sed 's/[[a-zA-Z]]*$//' | cut -d' ' -f1` + AC_MSG_CHECKING([flex version $flex_version >= $flex_min_version]) + if perl -w < \$min_version_major) || + ((\$flex_version_major == \$min_version_major) && + (\$flex_version_minor > \$min_version_minor)) || + ((\$flex_version_major == \$min_version_major) && + (\$flex_version_minor == \$min_version_minor) && + (\$flex_version_micro >= \$min_version_micro))) + ? 0 : 1); +EOF + then + AC_MSG_RESULT(yes) + AM_CONDITIONAL(GENERATE_PARSER, test -z $GENERATE_PARSER_TRUE) + else + AC_MSG_RESULT([no, using pre-generated parser sources]) + AM_CONDITIONAL(GENERATE_PARSER, false) + fi +]) diff --git a/mobile/common/m4/gst-plugin-docs.m4 b/mobile/common/m4/gst-plugin-docs.m4 new file mode 100755 index 0000000..29ebbd6 --- /dev/null +++ b/mobile/common/m4/gst-plugin-docs.m4 @@ -0,0 +1,47 @@ +dnl AG_GST_PYXML_CHECK([MINIMUM-PYTHON-VERSION]) + +AC_DEFUN([AG_GST_PYXML_CHECK], +[ + AC_BEFORE([AS_PATH_PYTHON],[$0])dnl find python first + + have_pyxml=no + if test "x$PYTHON" != x; then + AC_MSG_CHECKING([pyxml]) + if $PYTHON -c "from xml.dom.ext.reader import Sax2" 2>/dev/null \ + && $PYTHON -c "from xml.dom.NodeFilter import NodeFilter" 2>/dev/null; then + AC_MSG_RESULT(yes) + have_pyxml=yes + else + AC_MSG_RESULT(no) + fi + fi +]) + +dnl AG_GST_PLUGIN_DOCS([MINIMUM-GTK-DOC-VERSION],[MINIMUM-PYTHON-VERSION]) +dnl +dnl checks for prerequisites for the common/mangle-tmpl.py script +dnl used when building the plugin documentation + +AC_DEFUN([AG_GST_PLUGIN_DOCS], +[ + AC_BEFORE([GTK_DOC_CHECK],[$0])dnl check for gtk-doc first + + if test x$enable_gtk_doc = xyes -a x$have_gtk_doc = xyes; then + AG_GST_PYXML_CHECK([$1]) + fi + + build_plugin_docs=no + AC_MSG_CHECKING([whether to build plugin documentation]) + if test x$enable_gtk_doc = xyes -a x$have_gtk_doc = xyes; then + if test "x$have_pyxml" != xyes; then + AC_MSG_RESULT([no (pyxml not installed)]) + else + build_plugin_docs=yes + AC_MSG_RESULT([yes]) + fi + else + AC_MSG_RESULT([no (gtk-doc disabled or not available)]) + fi + + AM_CONDITIONAL(ENABLE_PLUGIN_DOCS, test x$build_plugin_docs = xyes) +]) diff --git a/mobile/common/m4/gst-plugindir.m4 b/mobile/common/m4/gst-plugindir.m4 new file mode 100755 index 0000000..09989d0 --- /dev/null +++ b/mobile/common/m4/gst-plugindir.m4 @@ -0,0 +1,17 @@ +dnl AG_GST_SET_PLUGINDIR + +dnl AC_DEFINE PLUGINDIR to the full location where plug-ins will be installed +dnl AC_SUBST plugindir, to be used in Makefile.am's + +AC_DEFUN([AG_GST_SET_PLUGINDIR], +[ + dnl define location of plugin directory + AS_AC_EXPAND(PLUGINDIR, ${libdir}/gstreamer-$GST_MAJORMINOR) + AC_DEFINE_UNQUOTED(PLUGINDIR, "$PLUGINDIR", + [directory where plugins are located]) + AC_MSG_NOTICE([Using $PLUGINDIR as the plugin install location]) + + dnl plugin directory configure-time variable for use in Makefile.am + plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" + AC_SUBST(plugindir) +]) diff --git a/mobile/common/m4/gst-valgrind.m4 b/mobile/common/m4/gst-valgrind.m4 new file mode 100755 index 0000000..93c2635 --- /dev/null +++ b/mobile/common/m4/gst-valgrind.m4 @@ -0,0 +1,35 @@ +AC_DEFUN([AG_GST_VALGRIND_CHECK], +[ + dnl valgrind inclusion + AC_ARG_ENABLE(valgrind, + AC_HELP_STRING([--disable-valgrind], [disable run-time valgrind detection]), + [ + case "${enableval}" in + yes) USE_VALGRIND="$USE_DEBUG" ;; + no) USE_VALGRIND=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;; + esac], + [ + USE_VALGRIND="$USE_DEBUG" + ]) dnl Default value + + VALGRIND_REQ="2.1" + if test "x$USE_VALGRIND" = xyes; then + PKG_CHECK_MODULES(VALGRIND, valgrind > $VALGRIND_REQ, + USE_VALGRIND="yes", + [ + USE_VALGRIND="no" + AC_MSG_RESULT([no]) + ]) + fi + + if test "x$USE_VALGRIND" = xyes; then + AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used]) + AC_MSG_NOTICE(Using extra code paths for valgrind) + fi + AC_SUBST(VALGRIND_CFLAGS) + AC_SUBST(VALGRIND_LIBS) + + AC_PATH_PROG(VALGRIND_PATH, valgrind, no) + AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") +]) diff --git a/mobile/common/m4/gst-x11.m4 b/mobile/common/m4/gst-x11.m4 new file mode 100644 index 0000000..d3baf2d --- /dev/null +++ b/mobile/common/m4/gst-x11.m4 @@ -0,0 +1,70 @@ +dnl macros for X-related detections +dnl AC_SUBST's HAVE_X, X_CFLAGS, X_LIBS +AC_DEFUN([AG_GST_CHECK_X], +[ + AC_PATH_XTRA + ac_cflags_save="$CFLAGS" + ac_cppflags_save="$CPPFLAGS" + CFLAGS="$CFLAGS $X_CFLAGS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + dnl now try to find the HEADER + AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no") + + if test "x$HAVE_X" = "xno" + then + AC_MSG_NOTICE([cannot find X11 development files]) + else + dnl this is much more than we want + X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" + dnl AC_PATH_XTRA only defines the path needed to find the X libs, + dnl it does not add the libs; therefore we add them here + X_LIBS="$X_LIBS -lX11" + AC_SUBST(X_CFLAGS) + AC_SUBST(X_LIBS) + fi + AC_SUBST(HAVE_X) + + CFLAGS="$ac_cflags_save" + CPPFLAGS="$ac_cppflags_save" +]) + +dnl *** XVideo *** +dnl Look for the PIC library first, Debian requires it. +dnl Check debian-devel archives for gory details. +dnl 20020110: +dnl At the moment XFree86 doesn't distribute shared libXv due +dnl to unstable API. On many platforms you CAN NOT link a shared +dnl lib to a static non-PIC lib. This is what the xvideo GStreamer +dnl plug-in wants to do. So Debian distributes a PIC compiled +dnl version of the static lib for plug-ins to link to when it is +dnl inappropriate to link the main application to libXv directly. +dnl FIXME: add check if this platform can support linking to a +dnl non-PIC libXv, if not then don not use Xv. +dnl FIXME: perhaps warn user if they have a shared libXv since +dnl this is an error until XFree86 starts shipping one +AC_DEFUN([AG_GST_CHECK_XV], +[ + if test x$HAVE_X = xyes; then + AC_CHECK_LIB(Xv_pic, XvQueryExtension, + HAVE_XVIDEO="yes", HAVE_XVIDEO="no", + $X_LIBS -lXext) + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv_pic -lXext" + AC_SUBST(XVIDEO_LIBS) + else + dnl try again using something else if we didn't find it first + if test x$HAVE_XVIDEO = xno; then + AC_CHECK_LIB(Xv, XvQueryExtension, + HAVE_XVIDEO="yes", HAVE_XVIDEO="no", + $X_LIBS -lXext) + + if test x$HAVE_XVIDEO = xyes; then + XVIDEO_LIBS="-lXv -lXext" + AC_SUBST(XVIDEO_LIBS) + fi + fi + fi + fi +]) diff --git a/mobile/common/m4/gst.m4 b/mobile/common/m4/gst.m4 new file mode 100755 index 0000000..04b466f --- /dev/null +++ b/mobile/common/m4/gst.m4 @@ -0,0 +1,10 @@ +dnl AG_GST_INIT +dnl sets up use of GStreamer configure.ac macros +dnl all GStreamer autoconf macros are prefixed +dnl with AG_GST_ for public macros +dnl with _AG_GST_ for private macros + +AC_DEFUN([AG_GST_INIT], +[ + m4_pattern_forbid(^_?AG_GST_) +]) diff --git a/mobile/common/m4/gtk-doc.m4 b/mobile/common/m4/gtk-doc.m4 new file mode 100755 index 0000000..57040aa --- /dev/null +++ b/mobile/common/m4/gtk-doc.m4 @@ -0,0 +1,56 @@ +dnl -*- mode: autoconf -*- + +# serial 1 + +dnl Usage: +dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) +AC_DEFUN([GTK_DOC_CHECK], +[ + AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first + AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first + dnl for overriding the documentation installation directory + AC_ARG_WITH(html-dir, + AC_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, + [with_html_dir='${datadir}/gtk-doc/html']) + HTML_DIR="$with_html_dir" + AC_SUBST(HTML_DIR) + + dnl enable/disable documentation building + AC_ARG_ENABLE(gtk-doc, + AC_HELP_STRING([--enable-gtk-doc], + [use gtk-doc to build documentation [default=no]]),, + enable_gtk_doc=no) + + have_gtk_doc=no + if test x$enable_gtk_doc = xyes; then + if test -z "$PKG_CONFIG"; then + AC_PATH_PROG(PKG_CONFIG, pkg-config, no) + fi + if test "$PKG_CONFIG" != "no" && $PKG_CONFIG --exists gtk-doc; then + have_gtk_doc=yes + fi + if test -z "$SED"; then + AC_PROG_SED + fi + +dnl do we want to do a version check? +ifelse([$1],[],, + [gtk_doc_min_version=$1 + if test "$have_gtk_doc" = yes; then + AC_MSG_CHECKING([gtk-doc version >= $gtk_doc_min_version]) + if $PKG_CONFIG --atleast-version $gtk_doc_min_version gtk-doc; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + have_gtk_doc=no + fi + fi +]) + if test "$have_gtk_doc" != yes; then + enable_gtk_doc=no + fi + fi + + AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes) + AM_CONDITIONAL(GTK_DOC_USE_LIBTOOL, test -n "$LIBTOOL") +]) diff --git a/mobile/common/m4/iconv.m4 b/mobile/common/m4/iconv.m4 new file mode 100755 index 0000000..c5f3579 --- /dev/null +++ b/mobile/common/m4/iconv.m4 @@ -0,0 +1,103 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/mobile/common/m4/isc-posix.m4 b/mobile/common/m4/isc-posix.m4 new file mode 100755 index 0000000..1319dd1 --- /dev/null +++ b/mobile/common/m4/isc-posix.m4 @@ -0,0 +1,26 @@ +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) diff --git a/mobile/common/m4/lib-ld.m4 b/mobile/common/m4/lib-ld.m4 new file mode 100755 index 0000000..ddb5732 --- /dev/null +++ b/mobile/common/m4/lib-ld.m4 @@ -0,0 +1,97 @@ +# lib-ld.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$acl_cv_prog_gnu_ld +]) + +dnl From libtool-1.4. Sets the variable LD. +AC_DEFUN([AC_LIB_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/mobile/common/m4/lib-link.m4 b/mobile/common/m4/lib-link.m4 new file mode 100755 index 0000000..6b94251 --- /dev/null +++ b/mobile/common/m4/lib-link.m4 @@ -0,0 +1,554 @@ +# lib-link.m4 serial 3 (gettext-0.11.3) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L, +dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/mobile/common/m4/lib-prefix.m4 b/mobile/common/m4/lib-prefix.m4 new file mode 100755 index 0000000..b8b79ab --- /dev/null +++ b/mobile/common/m4/lib-prefix.m4 @@ -0,0 +1,148 @@ +# lib-prefix.m4 serial 1 (gettext-0.11) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/mobile/common/m4/libtool.m4 b/mobile/common/m4/libtool.m4 new file mode 100644 index 0000000..a3fee53 --- /dev/null +++ b/mobile/common/m4/libtool.m4 @@ -0,0 +1,7377 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file 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. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX +# ----------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) diff --git a/mobile/common/m4/ltoptions.m4 b/mobile/common/m4/ltoptions.m4 new file mode 100644 index 0000000..34151a3 --- /dev/null +++ b/mobile/common/m4/ltoptions.m4 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file 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. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/mobile/common/m4/ltsugar.m4 b/mobile/common/m4/ltsugar.m4 new file mode 100644 index 0000000..9000a05 --- /dev/null +++ b/mobile/common/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file 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. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/mobile/common/m4/ltversion.m4 b/mobile/common/m4/ltversion.m4 new file mode 100644 index 0000000..f3c5309 --- /dev/null +++ b/mobile/common/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file 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. + +# Generated from ltversion.in. + +# serial 3017 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3017]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3017' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/mobile/common/m4/lt~obsolete.m4 b/mobile/common/m4/lt~obsolete.m4 new file mode 100644 index 0000000..637bb20 --- /dev/null +++ b/mobile/common/m4/lt~obsolete.m4 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file 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. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) diff --git a/mobile/common/m4/pkg.m4 b/mobile/common/m4/pkg.m4 new file mode 100755 index 0000000..3c20213 --- /dev/null +++ b/mobile/common/m4/pkg.m4 @@ -0,0 +1,135 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# +# Copyright © 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_ifval([$1], [$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi + +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# +# Similar to PKG_CHECK_MODULES, make sure that the first instance of +# this or PKG_CHECK_MODULES is called, or make sure to call +# PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_ifval([$2], [$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$PKG_CONFIG"; then + if test -n "$$1"; then + pkg_cv_[]$1="$$1" + else + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + fi +else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +if test $pkg_failed = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" 1>&AS_MESSAGE_LOG_FD + + ifelse([$4], , [AC_MSG_ERROR(dnl +[Package requirements ($2) were not met. +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively you may set the $1_CFLAGS and $1_LIBS environment variables +to avoid the need to call pkg-config. See the pkg-config man page for +more details.])], + [$4]) +elif test $pkg_failed = untried; then + ifelse([$4], , [AC_MSG_FAILURE(dnl +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively you may set the $1_CFLAGS and $1_LIBS environment variables +to avoid the need to call pkg-config. See the pkg-config man page for +more details. + +To get pkg-config, see .])], + [$4]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + ifelse([$3], , :, [$3]) +fi[]dnl +])# PKG_CHECK_MODULES diff --git a/mobile/common/m4/progtest.m4 b/mobile/common/m4/progtest.m4 new file mode 100755 index 0000000..443c8e3 --- /dev/null +++ b/mobile/common/m4/progtest.m4 @@ -0,0 +1,59 @@ +# progtest.m4 serial 2 (gettext-0.10.40) +dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1996. + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + /*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in ifelse([$5], , $PATH, [$5]); do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word" + break + fi + fi + done + IFS="$ac_save_ifs" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/mobile/common/mangle-tmpl.py b/mobile/common/mangle-tmpl.py new file mode 100755 index 0000000..d319040 --- /dev/null +++ b/mobile/common/mangle-tmpl.py @@ -0,0 +1,155 @@ +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +use the output from gst-xmlinspect.py to mangle tmpl/*.sgml and +insert/overwrite Short Description and Long Description +""" + +# FIXME: right now it uses pygst and scans on its own; +# we really should use inspect/*.xml instead since the result of +# gst-xmlinspect.py is commited by the docs maintainer, who can be +# expected to have pygst, but this step should be done for every docs build, +# so no pygst allowed + +# read in inspect/*.xml +# for every tmpl/element-(name).xml: mangle with details from element + +import glob +import re +import sys +import os + +class Tmpl: + def __init__(self, filename): + self.filename = filename + self._sectionids = [] + self._sections = {} + + def read(self): + """ + Read and parse the sections from the given file. + """ + lines = open(self.filename).readlines() + matcher = re.compile("\n") + id = None + + for line in lines: + match = matcher.search(line) + if match: + id = match.expand("\\1") + self._sectionids.append(id) + self._sections[id] = [] + else: + if not id: + sys.stderr.write( + "WARNING: line before a SECTION header: %s" % line) + else: + self._sections[id].append(line) + + def get_section(self, id): + """ + Get the content from the given section. + """ + return self._sections[id] + + def set_section(self, id, content): + """ + Replace the given section id with the given content. + """ + self._sections[id] = content + + def output(self): + """ + Return the output of the current template in the tmpl/*.sgml format. + """ + lines = [] + for id in self._sectionids: + lines.append("\n" % id) + for line in self._sections[id]: + lines.append(line) + + return "".join(lines) + + def write(self, backup=False): + """ + Write out the template file again, backing up the previous one. + """ + if backup: + target = self.filename + ".mangle.bak" + os.rename(self.filename, target) + + handle = open(self.filename, "w") + handle.write(self.output()) + handle.close() + +from xml.dom.ext.reader import Sax2 +from xml.dom.NodeFilter import NodeFilter + +def get_elements(file): + elements = {} + handle = open(file) + reader = Sax2.Reader() + doc = reader.fromStream(handle) + handle.close() + + walker = doc.createTreeWalker(doc.documentElement, + NodeFilter.SHOW_ELEMENT, None, 0) + while walker.currentNode and walker.currentNode.tagName != 'elements': + walker.nextNode() + + # we're at elements now + el = walker.firstChild() + while walker.currentNode: + element = walker.firstChild() + # loop over children of + name = None + description = None + while walker.currentNode: + if walker.currentNode.tagName == 'name': + name = walker.currentNode.firstChild.data.encode('UTF-8') + if walker.currentNode.tagName == 'description': + description = walker.currentNode.firstChild.data.encode('UTF-8') + if not walker.nextSibling(): break + # back up to + walker.parentNode() + elements[name] = {'description': description} + + if not walker.nextSibling(): break + + return elements + + +def main(): + if not len(sys.argv) == 3: + sys.stderr.write('Please specify the inspect/ dir and the tmpl/ dir') + sys.exit(1) + + inspectdir = sys.argv[1] + tmpldir = sys.argv[2] + + # parse all .xml files; build map of element name -> short desc + #for file in glob.glob("inspect/plugin-*.xml"): + elements = {} + for file in glob.glob("%s/plugin-*.xml" % inspectdir): + elements.update(get_elements(file)) + + for file in glob.glob("%s/element-*.sgml" % tmpldir): + base = os.path.basename(file) + element = base[len("element-"):-len(".sgml")] + tmpl = Tmpl(file) + tmpl.read() + if element in elements.keys(): + description = elements[element]['description'] + tmpl.set_section("Short_Description", "%s\n\n" % description) + + # put in an include if not yet there + line = '\n' + section = tmpl.get_section("Long_Description") + if not section[0] == line: + section.insert(0, line) + tmpl.set_section("Long_Description", section) + tmpl.write() + +main() diff --git a/mobile/common/plugins.xsl b/mobile/common/plugins.xsl new file mode 100755 index 0000000..150087f --- /dev/null +++ b/mobile/common/plugins.xsl @@ -0,0 +1,200 @@ + + + + + + + + + + + + -plugins- + + + + + + + + + + + + + Element Information + + + + + plugin + + + + plugin- + + + + + + + + author + + + + + + + class + + + + + + + + Element Pads + + + + + name + + + + + + + direction + + + + + + + presence + + + + + + + details + + + + + + + + + + + + + + + + + + -plugins-plugin- + + + + + + 3 + FIXME Library + + + + + + plugin- + + + + + + + + + + + Plugin Information + + + + filename + + + + + + + version + + + + + + + run-time license + + + + + + + package + + + + + + + origin + + + + + + + + + + + + + + + + + + + + + + + Elements + + + + + + + + + + + + + + diff --git a/mobile/common/po.mak b/mobile/common/po.mak new file mode 100755 index 0000000..e019fac --- /dev/null +++ b/mobile/common/po.mak @@ -0,0 +1,4 @@ +# rule to download the latest .po files +download-po: $(top_srcdir)/common/download-translations + $(top_srcdir)/common/download-translations $(PACKAGE) + diff --git a/mobile/common/release.mak b/mobile/common/release.mak new file mode 100755 index 0000000..afb0c8c --- /dev/null +++ b/mobile/common/release.mak @@ -0,0 +1,25 @@ +# include this snippet to add a common release: target by using +# include $(top_srcdir)/common/release.mak + +# make bz2 as well +AUTOMAKE_OPTIONS = dist-bzip2 + +release: dist + $(MAKE) $(PACKAGE)-$(VERSION).tar.gz.md5 + $(MAKE) $(PACKAGE)-$(VERSION).tar.bz2.md5 + +# generate md5 sum files +%.md5: % + md5sum $< > $@ + +# check that no marshal or enumtypes files are included +# this in turn ensures that distcheck fails for missing .list files which is currently +# shadowed when the corresponding .c and .h files are included. +distcheck-hook: + @test "x" = "x`find $(distdir) -name \*-enumtypes.[ch] | grep -v win32`" && \ + test "x" = "x`find $(distdir) -name \*-marshal.[ch]`" || \ + ( $(ECHO) "*** Leftover enumtypes or marshal files in the tarball." && \ + $(ECHO) "*** Make sure the following files are not disted:" && \ + find $(distdir) -name \*-enumtypes.[ch] | grep -v win32 && \ + find $(distdir) -name \*-marshal.[ch] && \ + false ) diff --git a/mobile/common/scangobj-merge.py b/mobile/common/scangobj-merge.py new file mode 100755 index 0000000..4917255 --- /dev/null +++ b/mobile/common/scangobj-merge.py @@ -0,0 +1,226 @@ +#!/usr/bin/python +# -*- Mode: Python -*- +# vi:si:et:sw=4:sts=4:ts=4 + +""" +parse, update and write .signals and .args files +""" + +from twisted.python import util + +import sys +import os + +def debug(*args): + pass + +class Object: + def __init__(self, name): + self._signals = util.OrderedDict() + self._args = util.OrderedDict() + self.name = name + + def __repr__(self): + return "" % self.name + + def add_signal(self, signal, overwrite=True): + if not overwrite and self._signals.has_key(signal.name): + raise IndexError, "signal %s already in %r" % (signal.name, self) + self._signals[signal.name] = signal + + def add_arg(self, arg, overwrite=True): + if not overwrite and self._args.has_key(arg.name): + raise IndexError, "arg %s already in %r" % (arg.name, self) + self._args[arg.name] = arg + +class Docable: + def __init__(self, **kwargs): + for key in self.attrs: + setattr(self, key, kwargs[key]) + self.dict = kwargs + + def __repr__(self): + return "<%r %s>" % (str(self.__class__), self.name) + +class Signal(Docable): + attrs = ['name', 'returns', 'args'] + +class Arg(Docable): + attrs = ['name', 'type', 'range', 'flags', 'nick', 'blurb', 'default'] + +class GDoc: + def load_file(self, filename): + try: + lines = open(filename).readlines() + self.load_data("".join(lines)) + except IOError: + print "WARNING - could not read from %s" % filename + + def save_file(self, filename, backup=False): + """ + Save the signals information to the given .signals file if the + file content changed. + """ + olddata = None + try: + lines = open(filename).readlines() + olddata = "".join(lines) + except IOError: + print "WARNING - could not read from %s" % filename + newdata = self.get_data() + if olddata and olddata == newdata: + return + + if olddata: + if backup: + os.rename(filename, filename + '.bak') + + handle = open(filename, "w") + handle.write(newdata) + handle.close() + +class Signals(GDoc): + def __init__(self): + self._objects = util.OrderedDict() + + def load_data(self, data): + """ + Load the .signals lines, creating our list of objects and signals. + """ + import re + smatcher = re.compile( + '(?s)' # make . match \n + '\n(.*?)\n' + ) + nmatcher = re.compile( + '' + '(?P\S*)' # store object + '::' + '(?P\S*)' # store signal + '' + ) + rmatcher = re.compile( + '(?s)' # make . match \n + '(?P\S*)\n' # store returns + '(?P.*)' # store args + ) + for block in smatcher.findall(data): + nmatch = nmatcher.search(block) + if nmatch: + o = nmatch.group('object') + debug("Found object", o) + debug("Found signal", nmatch.group('signal')) + if not self._objects.has_key(o): + object = Object(o) + self._objects[o] = object + + rmatch = rmatcher.search(block) + if rmatch: + dict = rmatch.groupdict().copy() + dict['name'] = nmatch.group('signal') + signal = Signal(**dict) + self._objects[o].add_signal(signal) + + def get_data(self): + lines = [] + for o in self._objects.values(): + for s in o._signals.values(): + block = """ +%(object)s::%(name)s +%(returns)s +%(args)s +""" + d = s.dict.copy() + d['object'] = o.name + lines.append(block % d) + + return "\n".join(lines) + '\n' + +class Args(GDoc): + def __init__(self): + self._objects = util.OrderedDict() + + def load_data(self, data): + """ + Load the .args lines, creating our list of objects and args. + """ + import re + amatcher = re.compile( + '(?s)' # make . match \n + '\n(.*?)\n' + ) + nmatcher = re.compile( + '' + '(?P\S*)' # store object + '::' + '(?P\S*)' # store arg + '' + ) + rmatcher = re.compile( + '(?s)' # make . match \n + '(?P\S*)\n' # store type + '(?P.*?)\n' # store range + '(?P\S*)\n' # store flags + '(?P.*?)\n' # store nick + '(?P.*?)\n' # store blurb + '(?P.*?)\n' # store default + ) + for block in amatcher.findall(data): + nmatch = nmatcher.search(block) + if nmatch: + o = nmatch.group('object') + debug("Found object", o) + debug("Found arg", nmatch.group('arg')) + if not self._objects.has_key(o): + object = Object(o) + self._objects[o] = object + + rmatch = rmatcher.search(block) + if rmatch: + dict = rmatch.groupdict().copy() + dict['name'] = nmatch.group('arg') + arg = Arg(**dict) + self._objects[o].add_arg(arg) + else: + print "ERROR: could not match arg from block %s" % block + + def get_data(self): + lines = [] + for o in self._objects.values(): + for a in o._args.values(): + block = """ +%(object)s::%(name)s +%(type)s +%(range)s +%(flags)s +%(nick)s +%(blurb)s +%(default)s + +""" + d = a.dict.copy() + d['object'] = o.name + lines.append(block % d) + + return "\n".join(lines) + '\n' + +def main(argv): + modulename = None + try: + modulename = argv[1] + except IndexError: + sys.stderr.write('Pleae provide a documentation module name\n') + sys.exit(1) + + print "Merging scangobj output for %s" % modulename + signals = Signals() + signals.load_file(modulename + '.signals') + signals.load_file(modulename + '.signals.new') + signals.save_file(modulename + '.signals', backup=True) + + args = Args() + args.load_file(modulename + '.args') + args.load_file(modulename + '.args.new') + args.save_file(modulename + '.args', backup=True) + +main(sys.argv) diff --git a/mobile/common/upload.mak b/mobile/common/upload.mak new file mode 100755 index 0000000..60731e5 --- /dev/null +++ b/mobile/common/upload.mak @@ -0,0 +1,33 @@ +# this snippet is to be included by both our docbook manuals +# and gtk-doc API references + +# it adds an upload target to each of these dir's Makefiles + +# each Makefile.am should define the following variables: +# - DOC: the base name of the documentation +# (faq, manual, pwg, gstreamer, gstreamer-libs) +# - FORMATS: the formats in which DOC is output +# (html ps pdf) + +# if you want to use it, make sure your $HOME/.ssh/config file contains the +# correct User entry for the Host entry for the DOC_SERVER + +# these variables define the location of the online docs +DOC_SERVER = gstreamer.freedesktop.org +DOC_BASE = /srv/gstreamer.freedesktop.org/www/data/doc +DOC_URL = $(DOC_SERVER):$(DOC_BASE) + +upload: $(FORMATS) + @if test "x$(PACKAGE_VERSION_NANO)" = x0; then \ + export DOCVERSION=$(VERSION); \ + else export DOCVERSION=head; \ + fi; \ + export DIR=$(DOC_BASE)/gstreamer/$$DOCVERSION/$(DOC); \ + ssh $(DOC_SERVER) mkdir -p $$DIR; \ + if echo $(FORMATS) | grep html > /dev/null; then export SRC="$$SRC html"; fi; \ + if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \ + if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \ + echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \ + rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \ + ssh $(DOC_SERVER) chmod -R g+w $$DIR; \ + echo Done diff --git a/mobile/common/win32.mak b/mobile/common/win32.mak new file mode 100755 index 0000000..63b1310 --- /dev/null +++ b/mobile/common/win32.mak @@ -0,0 +1,54 @@ +# various tests to make sure we dist the win32 stuff (for MSVC builds) right + +# the MANIFEST contains all win32 related files that should be disted +win32 = $(shell cat $(top_srcdir)/win32/MANIFEST) + +# wildcard is apparently not portable to other makes, hence the use of find +# these are library .def files with the symbols to export +win32defs = $(shell find $(top_srcdir)/win32/common -name '*.def') + +# wildcard is apparently not portable to other makes, hence the use of find +# these are files that need to be disted with CRLF line endings: +win32crlf = $(shell find $(top_srcdir)/win32 -name '*.dsw' -o -name '*.dsp') + +win32-debug: + @echo; \ + echo win32 = $(win32); \ + echo; \ + echo win32defs = $(win32defs); \ + echo; \ + echo win32crlf = $(win32crlf); \ + echo + +win32-check-crlf: + @echo Checking win32 files for CR LF line endings ...; \ + fail=0 ; \ + for each in $(win32crlf) ; do \ + if ! (file $$each | grep CRLF >/dev/null) ; then \ + echo $$each must be fixed to have CRLF line endings ; \ + fail=1; \ + fi ; \ + done ; \ + exit $$fail + +# make sure all symbols we export on linux are defined in the win32 .def too +# (don't care about other unixes for now, it's enough if it works on one of +# the linux build bots; we assume .so ) +check-exports: + fail=0 ; \ + for l in $(win32defs); do \ + libbase=`basename "$$l" ".def"`; \ + libso=`find "$(top_builddir)" -name "$$libbase-@GST_MAJORMINOR@.so"`; \ + libdef="$(top_srcdir)/win32/common/$$libbase.def"; \ + if test "x$$libso" != "x"; then \ + echo Checking symbols in $$libso; \ + if ! ($(top_srcdir)/common/check-exports $$libdef $$libso) ; then \ + fail=1; \ + fi; \ + fi; \ + done + + +dist-hook: check-exports win32-check-crlf + + diff --git a/mobile/configure.ac b/mobile/configure.ac new file mode 100644 index 0000000..60d51b0 --- /dev/null +++ b/mobile/configure.ac @@ -0,0 +1,479 @@ + +AC_INIT(extension, 1.0) + +dnl versions of gstreamer and plugins-base +GST_MAJORMINOR=0.10 +GST_REQUIRED=0.10.0 +GSTPB_REQUIRED=0.10.0 +EFL_REQUIRED=1.0.0 + +dnl fill in your package name and version here +dnl the fourth (nano) number should be 0 for a release, 1 for CVS, +dnl and 2... for a prerelease + +dnl when going to/from release please set the nano correctly ! +dnl releases only do Wall, cvs and prerelease does Werror too +AS_VERSION(gst-plugin, GST_PLUGIN_VERSION, 0, 10, 0, 1, + GST_PLUGIN_CVS="no", GST_PLUGIN_CVS="yes") + +dnl AM_MAINTAINER_MODE provides the option to enable maintainer mode +AM_MAINTAINER_MODE + +#AM_INIT_AUTOMAKE($PACKAGE, $VERSION) +AM_INIT_AUTOMAKE + +#AC_CONFIG_MACRO_DIR([m4]) + +dnl make aclocal work in maintainer mode +dnl AC_SUBST(ACLOCAL_AMFLAGS, "-I m4") + +dnl Add parameters for aclocal +AC_SUBST(ACLOCAL_AMFLAGS, "-I m4 -I common/m4") + +AM_CONFIG_HEADER(config.h) + +dnl check for tools +AC_PROG_CC +AC_PROG_CXX +AC_PROG_LIBTOOL + +dnl decide on error flags +AS_COMPILER_FLAG(-Wall, GST_WALL="yes", GST_WALL="no") + +if test "x$GST_WALL" = "xyes"; then + GST_ERROR="$GST_ERROR -Wall" + +# if test "x$GST_PLUGIN_CVS" = "xyes"; then +# AS_COMPILER_FLAG(-Werror,GST_ERROR="$GST_ERROR -Werror",GST_ERROR="$GST_ERROR") +# fi +fi + +dnl Check for pkgconfig first +AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, yes, no) + +dnl Give error and exit if we don't have pkgconfig +if test "x$HAVE_PKGCONFIG" = "xno"; then + AC_MSG_ERROR(you need to have pkgconfig installed !) +fi + +dnl Now we're ready to ask for gstreamer libs and cflags +dnl And we can also ask for the right version of gstreamer +AM_CONDITIONAL([IS_VODA_SDK], [test "x$DISTRO" = "xvodafone-sdk"]) +AM_CONDITIONAL([ISPROTECTOR_VODA_SDK], [test "x$DISTRO" = "xvodafone-sdk" && test "x$MACHINE" = "xprotector"]) +AM_CONDITIONAL([ISVOLANS_VODA_SDK], [test "x$DISTRO" = "xvodafone-sdk" && test "x$MACHINE" = "xvolans"]) +AM_CONDITIONAL([ISPROTECTOR_TARGET], [test "x$ARCH" = "xarm" && test "x$MACHINE" = "xprotector"]) +AM_CONDITIONAL([ISVOLANS_TARGET], [test "x$ARCH" = "xarm" && test "x$MACHINE" = "xvolans"]) + +PKG_CHECK_MODULES(GST, \ + gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED, + HAVE_GST=yes,HAVE_GST=no) + +dnl Give error and exit if we don't have gstreamer +if test "x$HAVE_GST" = "xno"; then + AC_MSG_ERROR(you need gstreamer development packages installed !) +fi + +dnl append GST_ERROR cflags to GST_CFLAGS +GST_CFLAGS="$GST_CFLAGS $GST_ERROR" + +dnl make GST_CFLAGS and GST_LIBS available +PKG_CHECK_MODULES(GST, gstreamer-0.10 >= 0.10) +AC_SUBST(GST_CFLAGS) +AC_SUBST(GST_LIBS) + +dnl make GST_MAJORMINOR available in Makefile.am +AC_SUBST(GST_MAJORMINOR) + +dnl If we need them, we can also use the base class libraries +PKG_CHECK_MODULES(GST_BASE, gstreamer-base-$GST_MAJORMINOR >= $GST_REQUIRED, + HAVE_GST_BASE=yes, HAVE_GST_BASE=no) + +dnl Give a warning if we don't have gstreamer libs +dnl you can turn this into an error if you need them +if test "x$HAVE_GST_BASE" = "xno"; then + AC_MSG_NOTICE(no GStreamer base class libraries found (gstreamer-base-$GST_MAJORMINOR)) +fi + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GST_BASE_CFLAGS) +AC_SUBST(GST_BASE_LIBS) + +dnl If we need them, we can also use the gstreamer-plugins-base libraries +PKG_CHECK_MODULES(GSTPB_BASE, + gstreamer-plugins-base-$GST_MAJORMINOR >= $GSTPB_REQUIRED, + HAVE_GSTPB_BASE=yes, HAVE_GSTPB_BASE=no) + +dnl Give a warning if we don't have gstreamer libs +dnl you can turn this into an error if you need them +if test "x$HAVE_GSTPB_BASE" = "xno"; then + AC_MSG_NOTICE(no GStreamer Plugins Base libraries found (gstreamer-plugins-base-$GST_MAJORMINOR)) +fi + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GSTPB_BASE_CFLAGS) +AC_SUBST(GSTPB_BASE_LIBS) + +dnl If we need them, we can also use the gstreamer-controller libraries +PKG_CHECK_MODULES(GSTCTRL, + gstreamer-controller-$GST_MAJORMINOR >= $GSTPB_REQUIRED, + HAVE_GSTCTRL=yes, HAVE_GSTCTRL=no) + +dnl Give a warning if we don't have gstreamer-controller +dnl you can turn this into an error if you need them +if test "x$HAVE_GSTCTRL" = "xno"; then + AC_MSG_NOTICE(no GStreamer Controller libraries found (gstreamer-controller-$GST_MAJORMINOR)) +fi + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GSTCTRL_CFLAGS) +AC_SUBST(GSTCTRL_LIBS) + +dnl set the plugindir where plugins should be installed +if test "x${prefix}" = "x$HOME"; then + plugindir="$HOME/.gstreamer-$GST_MAJORMINOR/plugins" +else + plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" +fi +AC_SUBST(plugindir) + +dnl set proper LDFLAGS for plugins +#GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' +GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\|FIR_\|arkamys_malloc\|arkamys_free\).*' +#GST_PLUGIN_LDFLAGS='-module -avoid-version' +AC_SUBST(GST_PLUGIN_LDFLAGS) + + +PKG_CHECK_MODULES(GST_AUDIO, gstreamer-audio-$GST_MAJORMINOR >= $GST_REQUIRED ) + + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GST_AUDIO_CFLAGS) +AC_SUBST(GST_AUDIO_LIBS) + +PKG_CHECK_MODULES(GST_VIDEO, gstreamer-video-$GST_MAJORMINOR >= $GST_REQUIRED) + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GST_VIDEO_CFLAGS) +AC_SUBST(GST_VIDEO_LIBS) + +PKG_CHECK_MODULES(GST_INTERFACES, gstreamer-interfaces-$GST_MAJORMINOR >= $GST_REQUIRED) +AC_SUBST(GST_INTERFACES_CFLAGS) +AC_SUBST(GST_INTERFACES_LIBS) + +dnl xvimagesrc _CFLAGS and _LIB available + +PKG_CHECK_MODULES(DRI2, libdri2) +AC_SUBST(DRI2_CFLAGS) +AC_SUBST(DRI2_LIBS) + +PKG_CHECK_MODULES(X11, x11) +AC_SUBST(X11_CFLAGS) +AC_SUBST(X11_LIBS) + +PKG_CHECK_MODULES(XEXT, xext) +AC_SUBST(XEXT_CFLAGS) +AC_SUBST(XEXT_LIBS) + +PKG_CHECK_MODULES(XV, xv) +AC_SUBST(XV_CFLAGS) +AC_SUBST(XV_LIBS) + +PKG_CHECK_MODULES(XDAMAGE, xdamage) +AC_SUBST(XDAMAGE_CFLAGS) +AC_SUBST(XDAMAGE_LIBS) + +PKG_CHECK_MODULES(DRM, libdrm) +AC_SUBST(DRM_CFLAGS) +AC_SUBST(DRM_LIBS) + +PKG_CHECK_MODULES(DRM, libdrm-devel) +AC_SUBST(DRM_DEVEL_CFLAGS) +AC_SUBST(DRM_DEVEL_LIBS) + +PKG_CHECK_MODULES(TBM, libtbm) +AC_SUBST(TBM_CFLAGS) +AC_SUBST(TBM_LIBS) + +dnl use time analysis module +PKG_CHECK_MODULES(MMTA, mm-ta) +AC_SUBST(MMTA_CFLAGS) +AC_SUBST(MMTA_LIBS) + +dnl required package for evasimagesink/evaspixmapsink +PKG_CHECK_MODULES(EFL, [ + evas >= $EFL_REQUIRED + ecore >= $EFL_REQUIRED + ecore-x >= $EFL_REQUIRED +], [ + AC_SUBST(EFL_CFLAGS) + AC_SUBST(EFL_LIBS) +], [ + AC_MSG_ERROR([ + You need to install or upgrade the EFL development + packages on your system. On debian-based systems these are + libevas-dev and libecore-dev. + The minimum version required is $EFL_REQUIRED. + ]) +]) + +dnl *** belows are related to evaspixmapsink plug-ins *** +AG_GST_ARG_WITH_PACKAGE_NAME +AG_GST_ARG_WITH_PACKAGE_ORIGIN + +dnl set license and copyright notice +GST_LICENSE="LGPL" +AC_DEFINE_UNQUOTED(GST_LICENSE, "$GST_LICENSE", [GStreamer license]) +AC_SUBST(GST_LICENSE) + +echo +AC_MSG_NOTICE([Checking libraries for evaspixmapsink plugin]) +echo +dnl *** X11 *** +translit(dnm, m, l) AM_CONDITIONAL(USE_X, true) +AG_GST_CHECK_FEATURE(X, [X libraries and plugins], + [evaspixmapsink], [ + AC_PATH_XTRA + ac_cflags_save="$CFLAGS" + ac_cppflags_save="$CPPFLAGS" + CFLAGS="$CFLAGS $X_CFLAGS" + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + dnl now try to find the HEADER + AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no") + + if test "x$HAVE_X" = "xno" + then + AC_MSG_NOTICE([cannot find X11 development files]) + else + dnl this is much more than we want + X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS" + dnl AC_PATH_XTRA only defines the path needed to find the X libs, + dnl it does not add the libs; therefore we add them here + X_LIBS="$X_LIBS -lX11" + AC_SUBST(X_CFLAGS) + AC_SUBST(X_LIBS) + fi + AC_SUBST(HAVE_X) + CFLAGS="$ac_cflags_save" + CPPFLAGS="$ac_cppflags_save" +]) + +dnl Check for Xv extension +translit(dnm, m, l) AM_CONDITIONAL(USE_XVIDEO, true) +AG_GST_CHECK_FEATURE(XVIDEO, [X11 XVideo extensions], + [evaspixmapsink], [ +AG_GST_CHECK_XV +]) + +dnl check for X Shm +translit(dnm, m, l) AM_CONDITIONAL(USE_XSHM, true) +AG_GST_CHECK_FEATURE(XSHM, [X Shared Memory extension], , [ + if test x$HAVE_X = xyes; then + AC_CHECK_LIB(Xext, XShmAttach, + HAVE_XSHM="yes", HAVE_XSHM="no", + $X_LIBS) + if test "x$HAVE_XSHM" = "xyes"; then + XSHM_LIBS="-lXext" + else + dnl On AIX, it is in XextSam instead, but we still need -lXext + AC_CHECK_LIB(XextSam, XShmAttach, + HAVE_XSHM="yes", HAVE_XSHM="no", + $X_LIBS) + if test "x$HAVE_XSHM" = "xyes"; then + XSHM_LIBS="-lXext -lXextSam" + fi + fi + fi +], , [ + AC_SUBST(HAVE_XSHM) + AC_SUBST(XSHM_LIBS) +]) + +dnl use tbm +PKG_CHECK_MODULES(TBM, libtbm) +AC_SUBST(TBM_CFLAGS) +AC_SUBST(TBM_LIBS) + +dnl PKG_CHECK_MODULES(UDEVMGR, unified-dev-mgr) +dnl AC_SUBST(UDEVMGR_CFLAGS) +dnl AC_SUBST(UDEVMGR_LIBS) + +dnl use ext-encodebin -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-encodebin, AC_HELP_STRING([--enable-ext-encodebin], [using encodebin]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_ENCODEBIN=yes ;; + no) GST_EXT_USE_EXT_ENCODEBIN=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-encodebin) ;; + esac + ], + [GST_EXT_USE_EXT_ENCODEBIN=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_ENCODEBIN, test "x$GST_EXT_USE_EXT_ENCODEBIN" = "xyes") + +dnl use ext-avsystem -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-avsystem, AC_HELP_STRING([--enable-ext-avsystem], [using avsystem]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_AVSYSTEM=yes ;; + no) GST_EXT_USE_EXT_AVSYSTEM=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-avsystem) ;; + esac + ], + [GST_EXT_USE_EXT_AVSYSTEM=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_AVSYSTEM, test "x$GST_EXT_USE_EXT_AVSYSTEM" = "xyes") + +dnl use ext-evasimagesink -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-evasimagesink, AC_HELP_STRING([--enable-ext-evasimagesink], [using evasimagesink]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_EVASIMAGESINK=yes ;; + no) GST_EXT_USE_EXT_EVASIMAGESINK=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-evasimagesink) ;; + esac + ], + [GST_EXT_USE_EXT_EVASIMAGESINK=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_EVASIMAGESINK, test "x$GST_EXT_USE_EXT_EVASIMAGESINK" = "xyes") + +dnl use evaspixmapsink --------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-evaspixmapsink, AC_HELP_STRING([--enable-ext-evaspixmapsink], [using evaspixmapsink]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_EVASPIXMAPSINK=yes ;; + no) GST_EXT_USE_EXT_EVASPIXMAPSINK=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-evaspixmapsink) ;; + esac + ], + [GST_EXT_USE_EXT_EVASPIXMAPSINK=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_EVASPIXMAPSINK, test "x$GST_EXT_USE_EXT_EVASPIXMAPSINK" = "xyes") + +dnl use ext-xvimagesrc-------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-xvimagesrc, AC_HELP_STRING([--enable-ext-xvimagesrc], [using xvimagesrc]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_XVIMAGESRC=yes ;; + no) GST_EXT_USE_EXT_XVIMAGESRC=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-xvimagesrc) ;; + esac + ], + [GST_EXT_USE_EXT_XVIMAGESRC=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_XVIMAGESRC, test "x$GST_EXT_USE_EXT_XVIMAGESRC" = "xyes") + +dnl use ext-gstreamer-audio ------------------------------------------------------------------- +AC_ARG_ENABLE(ext-gstreamer-audio, AC_HELP_STRING([--enable-ext-gstreamer-audio], [using gstreamer-audio]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_AVSYSAUDIO=yes ;; + no) GST_EXT_USE_EXT_AVSYSAUDIO=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-gstreamer-audio) ;; + esac + ], + [GST_EXT_USE_EXT_AVSYSAUDIO=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_AVSYSAUDIO, test "x$GST_EXT_USE_EXT_AVSYSAUDIO" = "xyes") + +if test "x$GST_EXT_USE_EXT_AVSYSAUDIO" = "xyes"; then + HAVE_AVSYSAUDIO=NO + PKG_CHECK_MODULES(AVSYSAUDIO, avsysaudio, HAVE_AVSYSAUDIO="yes", [ + HAVE_AVSYSAUDIO="no" + AC_MSG_RESULT(no) + ]) + if test "x$HAVE_AVSYSAUDIO" = "xno"; then + AC_MSG_ERROR(no avsysaudio package found) + fi + AC_SUBST(AVSYSAUDIO_CFLAGS) + AC_SUBST(AVSYSAUDIO_LIBS) +fi + +dnl use ext-drmsrc -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-drmsrc, AC_HELP_STRING([--enable-ext-drmsrc], [using drmsrc]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_DRMSRC=yes ;; + no) GST_EXT_USE_EXT_DRMSRC=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-drmsrc) ;; + esac + ], + [GST_EXT_USE_EXT_DRMSRC=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_DRMSRC, test "x$GST_EXT_USE_EXT_DRMSRC" = "xyes") +dnl use ext-toggle -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-toggle, AC_HELP_STRING([--enable-ext-toggle], [using toggle]), + [ + case "${enableval}" in + yes) GST_EXT_USE_EXT_TOGGLE=yes ;; + no) GST_EXT_USE_EXT_TOGGLE=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-toggle) ;; + esac + ], + [GST_EXT_USE_EXT_TOGGLE=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_TOGGLE, test "x$GST_EXT_USE_EXT_TOGGLE" = "xyes") + +dnl for i386 -------------------------------------------------------------------------- +AC_ARG_ENABLE(i386, AC_HELP_STRING([--enable-i386], [i386 build]), + [ + case "${enableval}" in + yes) IS_I386=yes ;; + no) IS_I386=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-i386) ;; + esac + ], + [IS_I386=no]) +AM_CONDITIONAL([IS_I386], [test "x$IS_I386" = "xyes"]) + +dnl use ext-pdpushsrc -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-pdpushsrc, AC_HELP_STRING([--enable-ext-pdpushsrc], [using pdpushsrc]), +[ + case "${enableval}" in + yes) GST_EXT_USE_EXT_PD_PUSHSRC=yes ;; + no) GST_EXT_USE_EXT_PD_PUSHSRC=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-pdpushsrc) ;; + esac + ], + [GST_EXT_USE_EXT_PD_PUSHSRC=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_PD_PUSHSRC, test "x$GST_EXT_USE_EXT_PD_PUSHSRC" = "xyes") +dnl use ext-audiotp -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-audiotp, AC_HELP_STRING([--enable-ext-audiotp], [using audiotp]), +[ + case "${enableval}" in + yes) GST_EXT_USE_EXT_AUDIOTP=yes ;; + no) GST_EXT_USE_EXT_AUDIOTP=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-audiotp) ;; + esac + ], + [GST_EXT_USE_EXT_AUDIOTP=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_AUDIOTP, test "x$GST_EXT_USE_EXT_AUDIOTP" = "xyes") + +dnl use ext-audioeq -------------------------------------------------------------------------- +AC_ARG_ENABLE(ext-audioeq, AC_HELP_STRING([--enable-ext-audioeq], [using audioeq]), +[ + case "${enableval}" in + yes) GST_EXT_USE_EXT_AUDIOEQ=yes ;; + no) GST_EXT_USE_EXT_AUDIOEQ=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-ext-audioeq) ;; + esac + ], + [GST_EXT_USE_EXT_AUDIOEQ=yes]) +AM_CONDITIONAL(GST_EXT_USE_EXT_AUDIOEQ, test "x$GST_EXT_USE_EXT_AUDIOEQ" = "xyes") + +AC_OUTPUT( +Makefile +common/Makefile +common/m4/Makefile +avsystem/Makefile +pdpushsrc/Makefile +pdpushsrc/src/Makefile +avsystem/src/Makefile +encodebin/Makefile +encodebin/src/Makefile +evasimagesink/Makefile +evasimagesink/src/Makefile +evaspixmapsink/Makefile +xvimagesrc/Makefile +xvimagesrc/src/Makefile +toggle/Makefile +toggle/src/Makefile +drmsrc/Makefile +drmsrc/src/Makefile +audiotp/Makefile +audiotp/src/Makefile +audioeq/Makefile +audioeq/src/Makefile +) diff --git a/mobile/drmsrc/Makefile.am b/mobile/drmsrc/Makefile.am new file mode 100755 index 0000000..308a09c --- /dev/null +++ b/mobile/drmsrc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/drmsrc/src/Makefile.am b/mobile/drmsrc/src/Makefile.am new file mode 100755 index 0000000..37eb3bb --- /dev/null +++ b/mobile/drmsrc/src/Makefile.am @@ -0,0 +1,27 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstdrmsrc.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstdrmsrc_la_SOURCES = gstdrmsrc.c + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgstdrmsrc_la_CFLAGS = $(GST_CFLAGS) $(MMTA_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 +libgstdrmsrc_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(MMTA_LIBS) +libgstdrmsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +# headers we need but don't want installed +noinst_HEADERS = gstdrmsrc.h + diff --git a/mobile/drmsrc/src/gstdrmsrc.c b/mobile/drmsrc/src/gstdrmsrc.c new file mode 100644 index 0000000..92916f2 --- /dev/null +++ b/mobile/drmsrc/src/gstdrmsrc.c @@ -0,0 +1,625 @@ +/* + * drmsrc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "gstdrmsrc.h" + +#define LOG_TRACE(message) //g_print("DRM_SRC: %s: %d: %s - %s \n", __FILE__, __LINE__, __FUNCTION__, message); + +#define GST_TAG_PLAYREADY "playready_file_path" + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS,GST_STATIC_CAPS_ANY); + + +GST_DEBUG_CATEGORY_STATIC (gst_drm_src_debug); +#define GST_CAT_DEFAULT gst_drm_src_debug + +enum +{ + ARG_0, + ARG_LOCATION, + ARG_FD +}; +static void gst_drm_src_finalize (GObject * object); +static void gst_drm_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_drm_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static gboolean gst_drm_src_start (GstBaseSrc * basesrc); +static gboolean gst_drm_src_stop (GstBaseSrc * basesrc); +static gboolean gst_drm_src_is_seekable (GstBaseSrc * src); +static gboolean gst_drm_src_get_size (GstBaseSrc * src, guint64 * size); +static GstFlowReturn gst_drm_src_create (GstBaseSrc * src, guint64 offset, guint length, GstBuffer ** buffer); +static void gst_drm_src_uri_handler_init (gpointer g_iface, gpointer iface_data); + +/** + * This function does the following: + * 1. Initializes GstDrmSrc ( defines gst_drm_get_type) + * + * @param drmsrc_type [out] GType + * + * @return void + */ +static void _do_init (GType drmsrc_type) +{ + // 1. Initializes GstDrmSrc ( defines gst_drm_get_type) + static const GInterfaceInfo urihandler_info = { + gst_drm_src_uri_handler_init, + NULL, + NULL + }; + + g_type_add_interface_static (drmsrc_type, GST_TYPE_URI_HANDLER, &urihandler_info); + GST_DEBUG_CATEGORY_INIT (gst_drm_src_debug, "drmsrc", 0, "drmsrc element"); +} +GST_BOILERPLATE_FULL (GstDrmSrc, gst_drm_src, GstBaseSrc, GST_TYPE_BASE_SRC, _do_init); +/** + * This function does the following: + * 1. Sets the class details + * 2. Adds the source pad template + * + * @param g_class [out] gpointer + * + * @return void + */ +static void gst_drm_src_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + // 1. Sets the class details + gst_element_class_set_details_simple (gstelement_class, + "DRM Source", + "Source/File", + "Read from arbitrary point in a standard/DRM file", + "Kishore Arepalli and Sadanand Dodawadakar "); + // 2. Adds the source pad template + gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&srctemplate)); +} +/** + * This function does the following: + * 1. Installs the properties + * 2. Assigns the function pointers GObject class attributes + * + * @param klass [out] GstDrmSrcClass Structure + * + * @return void + */ +static void gst_drm_src_class_init (GstDrmSrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + gobject_class = G_OBJECT_CLASS (klass); + gstbasesrc_class = GST_BASE_SRC_CLASS (klass); + // Assigns the function pointers GObject class attributes + gobject_class->set_property = gst_drm_src_set_property; + gobject_class->get_property = gst_drm_src_get_property; + // 1. Installs the properties + g_object_class_install_property (gobject_class, ARG_FD, + g_param_spec_int ("fd", "File-descriptor", + "File-descriptor for the file being mmap()d", 0, G_MAXINT, 0, + G_PARAM_READABLE)); + g_object_class_install_property (gobject_class, ARG_LOCATION, + g_param_spec_string ("location", "File Location", + "Location of the file to read", NULL, G_PARAM_READWRITE)); + + // 2. Assigns the function pointers GObject class attributes + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_drm_src_finalize); + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_drm_src_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_drm_src_stop); + gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_drm_src_is_seekable); + gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_drm_src_get_size); + gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_drm_src_create); + + + gst_tag_register (GST_TAG_PLAYREADY, GST_TAG_FLAG_META, + G_TYPE_STRING, + "PlayReady File Path", + "a tag that is specific to PlayReady File", + NULL); +} +/** + * This function does the following: + * 1. Initilizes the parameters of GstDrmSrc + * + * @param src [out] GstDrmSrc structure + * @param g_class [in] GstDrmSrcClass structure + * + * @return gboolean Returns TRUE on success and FALSE on ERROR + */ +static void gst_drm_src_init (GstDrmSrc * src, GstDrmSrcClass * g_class) +{ + // 1. Initilizes the parameters of GstDrmSrc + src->filename = NULL; + src->fd = 0; + src->uri = NULL; + src->is_regular = FALSE; + src->seekable = FALSE; + PROFILE_INIT; +} +/** + * This function does the following: + * 1. deallocates the filename and uri + * 2. calls the parent class->finalize + * + * @param object [in] GObject Structure + * + * @return void + */ +static void gst_drm_src_finalize (GObject * object) +{ + GstDrmSrc *src; + + src = GST_DRM_SRC (object); + // 1. deallocates the filename and uri + g_free (src->filename); + g_free (src->uri); + // 2. calls the parent class->finalize + G_OBJECT_CLASS (parent_class)->finalize (object); +} +/** + * This function does the following: + * 1. Checks the state + * 2. Checks the filename + * 3. Sets the filename + * + * @param src [in] GstDrmSrc Structure + * @param location [in] location of the file + * + * @return gboolean Returns TRUE on success and FALSE on ERROR + */ +static gboolean gst_drm_src_set_location (GstDrmSrc * src, const gchar * location) +{ + GstState state; + + GST_OBJECT_LOCK (src); + // 1. Checks the state + state = GST_STATE (src); + if (state != GST_STATE_READY && state != GST_STATE_NULL) + { + GST_DEBUG_OBJECT (src, "setting location in wrong state"); + GST_OBJECT_UNLOCK (src); + return FALSE; + } + GST_OBJECT_UNLOCK (src); + g_free (src->filename); + g_free (src->uri); + // 2. Checks the filename + if (location == NULL) + { + src->filename = NULL; + src->uri = NULL; + } + else + { + // 3. Sets the filename + src->filename = g_strdup (location); + src->uri = gst_uri_construct ("file", src->filename); + } + g_object_notify (G_OBJECT (src), "location"); + gst_uri_handler_new_uri (GST_URI_HANDLER (src), src->uri); + return TRUE; +} +/** + * This function does the following: + * 1. Sets the location of the file. + * + * @param object [in] GObject Structure + * @param prop_id [in] id of the property + * @param value [in] property value + * @param pspec [in] GParamSpec Structure + * + * @return void + */ +static void gst_drm_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstDrmSrc *src; + + g_return_if_fail (GST_IS_DRM_SRC (object)); + src = GST_DRM_SRC (object); + switch (prop_id) + { + // 1. Sets the location of the file. + case ARG_LOCATION: + gst_drm_src_set_location (src, g_value_get_string (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} +/** + * This function does the following: + * 1. Provides the location of the file. + * 2. Provides the file descriptor. + * + * @param object [in] GObject Structure + * @param prop_id [in] id of the property + * @param value [out] property value + * @param pspec [in] GParamSpec Structure + * + * @return void + */ +static void gst_drm_src_get_property (GObject * object, guint prop_id, GValue * value,GParamSpec * pspec) +{ + GstDrmSrc *src; + + g_return_if_fail (GST_IS_DRM_SRC (object)); + src = GST_DRM_SRC (object); + switch (prop_id) + { + // 1. Provides the location of the file. + case ARG_LOCATION: + g_value_set_string (value, src->filename); + break; + // 2. Provides the file descriptor. + case ARG_FD: + g_value_set_int (value, src->fd); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/** + * This function does the following: + * 1. Seeks to the specified position. + * 2. Allocates a buffer to push the data + * 3. Reads from the file and sets the related params + * + * @param src [in] GstDrmSrc Structure + * @param offset [in] offset of the file to seek + * @param length [in] size of the data in bytes + * @param buffer [out] GstBuffer to hold the contents + * + * @return GstFlowReturn Returns GST_FLOW_OK on success and ERROR on failure + */ +static GstFlowReturn gst_drm_src_create_read (GstDrmSrc * src, guint64 offset, guint length, GstBuffer ** buffer) +{ + int ret; + GstBuffer *buf; + // 1. Seeks to the specified position. + if (G_UNLIKELY (src->read_position != offset)) + { + off_t res; + res = lseek (src->fd, offset, SEEK_SET); + if (G_UNLIKELY (res < 0 || res != offset)) + { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + return GST_FLOW_ERROR; + } + src->read_position = offset; + } + // 2. Allocates a buffer to push the data + buf = gst_buffer_new_and_alloc (length); + GST_LOG_OBJECT (src, "Reading %d bytes", length); + // 3. Reads from the file and sets the related params + ret = read (src->fd, GST_BUFFER_DATA (buf), length); + if (G_UNLIKELY (ret < 0)) + { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + if (G_UNLIKELY ((guint) ret < length && src->seekable)) + { + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),("unexpected end of file.")); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } + if (G_UNLIKELY (ret == 0 && length > 0)) + { + GST_DEBUG ("non-regular file hits EOS"); + gst_buffer_unref (buf); + return GST_FLOW_UNEXPECTED; + } + length = ret; + GST_BUFFER_SIZE (buf) = length; + GST_BUFFER_OFFSET (buf) = offset; + GST_BUFFER_OFFSET_END (buf) = offset + length; + *buffer = buf; + src->read_position += length; + return GST_FLOW_OK; +} +/** + * This function does the following: + * 1. Calls DRM file read chain method for drm files. + * 2. Calls normal file read chain method for standard files. + * + * @param basesrc [in] BaseSrc Structure + * @param size [out] Size of the file + * + * @return gboolean Returns TRUE on success and FALSE on ERROR + */ +static GstFlowReturn gst_drm_src_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer) +{ + GstDrmSrc *src = GST_DRM_SRC (basesrc); + + // 1. Calls DRM file read chain method for drm files. + + // 2. Calls normal file read chain method for standard files. + return gst_drm_src_create_read (src, offset, length, buffer); +} +/** + * + * @param basesrc [in] BaseSrc Structure + * + * @return gboolean Returns TRUE if the file is seekable and FALSE if the file is not seekable + */ +static gboolean gst_drm_src_is_seekable (GstBaseSrc * basesrc) +{ + GstDrmSrc *src = GST_DRM_SRC (basesrc); + return src->seekable; +} +/** + * This function does the following: + * 1. Gets the filesize for drm file by using seek oprations + * 2. Gets the file size for standard file by using statistics + * + * @param basesrc [in] BaseSrc Structure + * @param size [in] Size of the file + * + * @return gboolean Returns TRUE on success and FALSE on ERROR + */ +static gboolean gst_drm_src_get_size (GstBaseSrc * basesrc, guint64 * size) +{ + struct stat stat_results; + GstDrmSrc *src = GST_DRM_SRC (basesrc); + unsigned int offset; + + // 1. Gets the filesize for drm file by using seek oprations + + // 2. Gets the file size for standard file by using statistics + if (fstat (src->fd, &stat_results) < 0) + return FALSE; + *size = stat_results.st_size; + return TRUE; +} +/** + * This function does the following: + * 1. Checks the filename + * 2. Opens the file and check statistics of the file + * 7. Checks the seeking for standard files + * + * @param basesrc [in] BaseSrc Structure + * + * @return gboolean Returns TRUE on success and FALSE on ERROR + */ +static gboolean gst_drm_src_start (GstBaseSrc * basesrc) +{ + GstDrmSrc *src = GST_DRM_SRC (basesrc); + struct stat stat_results; + off_t ret; +PROFILE_FUNC_BEGIN; + // 1. Checks the filename + if (src->filename == NULL || src->filename[0] == '\0') + { + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,("No file name specified for reading."), (NULL)); + return FALSE; + } + // 2. Opens the file and check statistics of the file + GST_INFO_OBJECT (src, "opening file %s", src->filename); + src->fd = open (src->filename, O_RDONLY | O_BINARY); + if (src->fd < 0) + { + if(errno == ENOENT) + { + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL),("No such file \"%s\"", src->filename)); + return FALSE; + } + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("Could not open file \"%s\" for reading.", src->filename), GST_ERROR_SYSTEM); + return FALSE; + } + if (fstat (src->fd, &stat_results) < 0) + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("Could not get info on \"%s\".", src->filename), (NULL)); + close (src->fd); + return FALSE; + } + if (S_ISDIR (stat_results.st_mode)) + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("\"%s\" is a directory.", src->filename), (NULL)); + close (src->fd); + return FALSE; + } + if (S_ISSOCK (stat_results.st_mode)) + { + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, ("File \"%s\" is a socket.", src->filename), (NULL)); + close (src->fd); + return FALSE; + } + src->read_position = 0; + + // 7. Checks the seeking for standard files + if (S_ISREG (stat_results.st_mode)) + src->is_regular = TRUE; + ret = lseek (src->fd, 0, SEEK_END); + if (ret < 0) + { + GST_LOG_OBJECT (src, "disabling seeking, not in mmap mode and lseek " + "failed: %s", g_strerror (errno)); + src->seekable = FALSE; + } + else + { + src->seekable = TRUE; + } + lseek (src->fd, 0, SEEK_SET); + src->seekable = src->seekable && src->is_regular; + PROFILE_FUNC_END; + return TRUE; +} +/** + * This function does the following: + * 1. Closes the file desciptor and resets the flags + * + * @param basesrc [in] BaseSrc Structure + * + * @return gboolean Returns TRUE on success and FALSE on ERROR + */ +static gboolean gst_drm_src_stop (GstBaseSrc * basesrc) +{ + GstDrmSrc *src = GST_DRM_SRC (basesrc); + + // 1. Closes the file desciptor and resets the flags + if(src->fd > 0) + close (src->fd); + src->fd = 0; + src->is_regular = FALSE; +// PROFILE_SHOW_RESULT; + return TRUE; +} +/** + * + * @param void + * + * @return GstURIType Returns GST_URI_SRC + */ + +static GstURIType gst_drm_src_uri_get_type (void) +{ + return GST_URI_SRC; +} + +/** + * This function does the following: + * 1. Defines the list of protocols + * + * @param void + * + * @return gchar ** Returns the protocol list + */ + +static gchar ** gst_drm_src_uri_get_protocols (void) +{ + static gchar *protocols[] = { "file", NULL }; + return protocols; +} +/** + * + * @param handler [in] GstURIHandler structure + * + * @return gchar* Returns the uri + */ +static const gchar * gst_drm_src_uri_get_uri (GstURIHandler *handler) +{ + GstDrmSrc *src = GST_DRM_SRC (handler); + return src->uri; +} +/** + * This function does the following: + * 1. Checks the protocol + * 2. Checks the whether it is absolute or not + * 3 sets the location + * + * @param handler [in] GstURIHandler structure + * @param uri [in] uri string + * + * @return gboolean Returns TRUE on success and FALSE on Error + */ +static gboolean gst_drm_src_uri_set_uri (GstURIHandler *handler, const gchar * uri) +{ + gchar *protocol, *location; + gboolean ret; + GstDrmSrc *src = GST_DRM_SRC (handler); + // 1. Checks the protocol + protocol = gst_uri_get_protocol (uri); + if (strcmp (protocol, "file") != 0) + { + g_free (protocol); + return FALSE; + } + g_free (protocol); + if (g_str_has_prefix (uri, "file://localhost/")) + { + char *tmp; + tmp = g_strconcat ("file://", uri + 16, NULL); + location = gst_uri_get_location (tmp); + g_free (tmp); + } + else if (strcmp (uri, "file://") == 0) + { + gst_drm_src_set_location (src, NULL); + return TRUE; + } + else + { + location = gst_uri_get_location (uri); + } + if (!location) + return FALSE; + // 2. Checks the whether it is absolute or not + if (!g_path_is_absolute (location)) + { + g_free (location); + return FALSE; + } + // 3 sets the location + ret = gst_drm_src_set_location (src, location); + g_free (location); + return ret; +} +/** + * This function does the following: + * 1. Assignes the function pointer for URI related stuff + * + * @param g_iface [in] an interface to URI handler + * @param iface_data [in] a gpointer + * + * @return void + */ +static void gst_drm_src_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + // 1. Assigning the function pointer for URI related stuff + iface->get_type = gst_drm_src_uri_get_type; + iface->get_protocols = gst_drm_src_uri_get_protocols; + iface->get_uri = gst_drm_src_uri_get_uri; + iface->set_uri = gst_drm_src_uri_set_uri; +} +/** + * This function does the following: + * 1. Registers an element as drmsrc + * + * @param i_pPlugin [in] a plug-in structure + * + * @return gboolean TRUE on SUCCESS and FALSE on Error + */ +static gboolean plugin_init(GstPlugin* i_pPlugin) +{ + return gst_element_register(i_pPlugin, "drmsrc", GST_RANK_NONE, GST_TYPE_DRM_SRC);; +} +/** + * This function does the following: + * 1. plugin defination + * + */ +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "drmsrc", + "Plugin to read data from standad/DRM File", + plugin_init, + VERSION, + "LGPL", + "Samsung Electronics Co", + "http://www.samsung.com/") + diff --git a/mobile/drmsrc/src/gstdrmsrc.h b/mobile/drmsrc/src/gstdrmsrc.h new file mode 100755 index 0000000..e47802e --- /dev/null +++ b/mobile/drmsrc/src/gstdrmsrc.h @@ -0,0 +1,106 @@ +/* + * drmsrc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifndef __GST_DRM_SRC_H__ +#define __GST_DRM_SRC_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef S_ISREG +#define S_ISREG(mode) ((mode)&_S_IFREG) +#endif +#ifndef S_ISDIR +#define S_ISDIR(mode) ((mode)&_S_IFDIR) +#endif +#ifndef S_ISSOCK +#define S_ISSOCK(x) (0) +#endif +#ifndef O_BINARY +#define O_BINARY (0) +#endif + +#define ENABLE_PROFILING_INFO +#ifdef ENABLE_PROFILING_INFO +#define PROFILE_FUNC_BEGIN\ + char *newname; \ + newname=__FUNCTION__; \ + gst_ta_accum_item_begin(newname,FALSE,__FILE__,__LINE__); + +#define PROFILE_FUNC_END \ + gst_ta_accum_item_end(newname,FALSE,__FILE__,__LINE__); + +#define PROFILE_BLOCK_BEGIN(name) gst_ta_accum_item_begin(name,FALSE,__FILE__,__LINE__); +#define PROFILE_BLOCK_END(name) gst_ta_accum_item_end(name,FALSE,__FILE__,__LINE__); +#define PROFILE_INIT gst_ta_init(); +#define PROFILE_SHOW_RESULT gst_ta_accum_show_result(0);//MMTA_SHOW_FILE); +#define PROFILE_CLEAR_DATA gst_ta_release(); +#else +#define PROFILE_FUNC_BEGIN +#define PROFILE_FUNC_END +#define PROFILE_BLOCK_BEGIN(name) +#define PROFILE_BLOCK_END(name) +#define PROFILE_INIT +#define PROFILE_SHOW_RESULT +#define PROFILE_CLEAR_DATA +#endif +G_BEGIN_DECLS + +#define GST_TYPE_DRM_SRC (gst_drm_src_get_type()) +#define GST_DRM_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DRM_SRC,GstDrmSrc)) +#define GST_DRM_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DRM_SRC,GstDrmSrcClass)) +#define GST_IS_DRM_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DRM_SRC)) +#define GST_IS_DRM_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DRM_SRC)) + +typedef struct _GstDrmSrc GstDrmSrc; +typedef struct _GstDrmSrcClass GstDrmSrcClass; + +struct _GstDrmSrc +{ + GstBaseSrc element; + gchar *filename; + gchar *uri; + gint fd; + guint64 read_position; + gboolean seekable; + gboolean is_regular; +}; + +struct _GstDrmSrcClass +{ + GstBaseSrcClass parent_class; +}; + +GType gst_drm_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_DRM_SRC_H__ */ diff --git a/mobile/encodebin/Makefile.am b/mobile/encodebin/Makefile.am new file mode 100644 index 0000000..308a09c --- /dev/null +++ b/mobile/encodebin/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/encodebin/src/Makefile.am b/mobile/encodebin/src/Makefile.am new file mode 100644 index 0000000..c855890 --- /dev/null +++ b/mobile/encodebin/src/Makefile.am @@ -0,0 +1,30 @@ +glib_enum_define=GST_RECORD +glib_enum_prefix=gst_record + +plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@ + +plugin_LTLIBRARIES = libgstencodebin.la +libgstencodebin_la_SOURCES = gstencodebin.c +nodist_libgstencodebin_la_SOURCES = $(built_sources) +libgstencodebin_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) +libgstencodebin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstencodebin_la_LIBADD = \ + $(GST_LIBS)\ + $(GST_BASE_LIBS) \ + $(GST_LIBS) +if ISPROTECTOR_TARGET +libgstencodebin_la_CFLAGS += -DUSE_ENCODER_QUEUE_SET +libgstencodebin_la_CFLAGS += -DVIDEO_ENC_QUE_TIME=4 -DAUDIO_ENC_QUE_TIME=4 +endif + +if ISVOLANS_TARGET +libgstencodebin_la_CFLAGS += -DUSE_ENCODER_QUEUE_SET +libgstencodebin_la_CFLAGS += -DVIDEO_ENC_QUE_TIME=4 -DAUDIO_ENC_QUE_TIME=4 +endif + +BUILT_SOURCES = $(built_headers) $(built_sources) + +CLEANFILES = $(BUILT_SOURCES) + +include $(top_srcdir)/common/glib-gen.mak + diff --git a/mobile/encodebin/src/gstencodebin.c b/mobile/encodebin/src/gstencodebin.c new file mode 100644 index 0000000..5ee9617 --- /dev/null +++ b/mobile/encodebin/src/gstencodebin.c @@ -0,0 +1,3352 @@ +/* + * GStreamer encodebin + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gstencodebin.h" + +#ifdef GST_EXT_PAD_LINK_UNCHECKED +#define _GST_ELEMENT_LINK_MANY gst_element_link_many_unchecked +#define _GST_ELEMENT_LINK gst_element_link_unchecked +#define _GST_PAD_LINK gst_pad_link_unchecked +#else +#define _GST_ELEMENT_LINK_MANY gst_element_link_many +#define _GST_ELEMENT_LINK gst_element_link +#define _GST_PAD_LINK gst_pad_link +#endif + +#ifndef VIDEO_ENC_QUE_TIME +#define VIDEO_ENC_QUE_TIME 1 +#endif +#ifndef AUDIO_ENC_QUE_TIME +#define AUDIO_ENC_QUE_TIME 1 +#endif + +//define USE_ENCODER_QUEUE_SET +#ifdef USE_ENCODER_QUEUE_SET +#define ENCODER_QUEUE_SET(x_queue, x_byte, x_buffer, x_time /*sec*/) \ +{\ +g_object_set(G_OBJECT(x_queue), \ + "max-size-bytes", (guint)x_byte, \ + "max-size-buffers", (guint)x_buffer, \ + "max-size-time", (guint64)(x_time*GST_SECOND), \ + NULL); \ + GST_INFO("Set to [%s], max [%d] byte, max [%d] buffer, max [%d] time(sec) ", GST_OBJECT_NAME(x_queue), x_byte, x_buffer, x_time);\ +} +#else +#define ENCODER_QUEUE_SET(x_queue, x_byte, x_buffer, x_time) +#endif + +#define _GST_PAD_LINK_UNREF( srcpad, sinkpad, if_fail_goto )\ +{\ + GstPadLinkReturn ret = _GST_PAD_LINK( srcpad, sinkpad );\ + gst_object_unref( srcpad ); srcpad = NULL;\ + gst_object_unref( sinkpad ); sinkpad = NULL;\ + if( ret != GST_PAD_LINK_OK) goto if_fail_goto;\ +} + +#define _GST_PAD_UNLINK_UNREF( srcpad, sinkpad)\ +{\ + gst_pad_unlink( srcpad, sinkpad );\ + gst_object_unref( srcpad ); srcpad = NULL;\ + gst_object_unref( sinkpad ); sinkpad = NULL;\ +} + +#define DEFAULT_PROP_PROFILE 0 +#define DEFAULT_PROP_HIGH_SPEED 0 +#define DEFAULT_PROP_VENC_NAME "ffenc_h263" +#define DEFAULT_PROP_AENC_NAME "secenc_amr" +#define DEFAULT_PROP_IENC_NAME "jpegenc" +#define DEFAULT_PROP_MUX_NAME "ffmux_3gp" +#define DEFAULT_PROP_VCONV_NAME "ffmpegcolorspace" + +/* props */ +enum +{ + PROP_0, + // encodebin mode : a/v, audio only, stillshot + PROP_PROFILE, + //support slow motion capture + PROP_HIGH_SPEED, + //elements name + PROP_VENC_NAME, + PROP_AENC_NAME, + PROP_IENC_NAME, + PROP_MUX_NAME, + PROP_VCONV_NAME, + //caps + PROP_VCAPS, + PROP_ACAPS, + PROP_ICAPS, + //functions + PROP_AUTO_AUDIO_CONVERT, + PROP_AUTO_AUDIO_RESAMPLE, + PROP_AUTO_COLORSPACE, + PROP_BLOCK, + PROP_PAUSE, + PROP_VENC_QUEUE, + PROP_AENC_QUEUE, + //elements pointer + PROP_VIDEO_ENC, + PROP_AUDIO_ENC, + PROP_IMAGE_ENC, + PROP_MUX, + PROP_VIDEO_CONV, + //options + PROP_USE_VIDEO_TOGGLE, +}; + +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE +/* signals */ +enum +{ + SIGNAL_STREAM_BLOCK, + SIGNAL_STREAM_UNBLOCK, + SIGNAL_STREAM_PAUSE, + SIGNAL_STREAM_RESUME, + LAST_SIGNAL +}; +#endif + +typedef enum { + ENCODEBIN_ELEMENT_VENC, + ENCODEBIN_ELEMENT_AENC, + ENCODEBIN_ELEMENT_IENC, + ENCODEBIN_ELEMENT_MUX, + ENCODEBIN_ELEMENT_VIDEO_CONV +}GstEncodeBinElement; + +typedef enum { + ENCODEBIN_MUX_AUDIO_SINK, + ENCODEBIN_MUX_VIDEO_SINK, +}GstEncodeBinMuxSinkPad; + + +/* FIX ME */ + +#if (G_BYTE_ORDER == G_LITTLE_ENDIAN) +# define ENDIANNESS "LITTLE_ENDIAN, BIG_ENDIAN" +#else +# define ENDIANNESS "BIG_ENDIAN, LITTLE_ENDIAN" +#endif + +/* generic templates */ +#define STATIC_AUDIO_CAPS \ +GST_STATIC_CAPS ( \ + "audio/x-raw-float, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 64;" \ + "audio/x-raw-float, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 32;" \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 32, " \ + "depth = (int) [ 1, 32 ], " \ + "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 24, " \ + "depth = (int) [ 1, 24 ], " "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 16, " \ + "depth = (int) [ 1, 16 ], " \ + "signed = (boolean) { true, false }; " \ + "audio/x-raw-int, " \ + "rate = (int) [ 1, MAX ], " \ + "channels = (int) [ 1, 8 ], " \ + "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \ + "width = (int) 8, " \ + "depth = (int) [ 1, 8 ], " \ + "signed = (boolean) { true, false } " \ +) + +#define STATIC_VIDEO_CAPS \ +GST_STATIC_CAPS ( \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) I420;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) YV12;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) YUY2;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 24," \ + "depth = (int) 24," \ + "red_mask = (int) 16711680," \ + "green_mask = (int) 65280," \ + "blue_mask = (int) 255," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 24," \ + "depth = (int) 24," \ + "red_mask = (int) 255," \ + "green_mask = (int) 65280," \ + "blue_mask = (int) 16711680," \ + "endianness = (int) 4321;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) Y42B;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) Y444;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 32," \ + "red_mask = (int) 65280," \ + "green_mask = (int) 16711680," \ + "blue_mask = (int) -16777216," \ + "alpha_mask = (int) 255," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 32," \ + "red_mask = (int) 16711680," \ + "green_mask = (int) 65280," \ + "blue_mask = (int) 255," \ + "alpha_mask = (int) -16777216," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 32," \ + "red_mask = (int) 255," \ + "green_mask = (int) 65280," \ + "blue_mask = (int) 16711680," \ + "alpha_mask = (int) -16777216," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 32," \ + "red_mask = (int) -16777216," \ + "green_mask = (int) 16711680," \ + "blue_mask = (int) 65280," \ + "alpha_mask = (int) 255," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 24," \ + "red_mask = (int) 65280," \ + "green_mask = (int) 16711680," \ + "blue_mask = (int) -16777216," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 24," \ + "red_mask = (int) 255," \ + "green_mask = (int) 65280," \ + "blue_mask = (int) 16711680," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 24," \ + "red_mask = (int) 16711680," \ + "green_mask = (int) 65280," \ + "blue_mask = (int) 255," \ + "endianness = (int) 4321;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 32," \ + "depth = (int) 24," \ + "red_mask = (int) -16777216," \ + "green_mask = (int) 16711680," \ + "blue_mask = (int) 65280," \ + "endianness = (int) 4321;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) YUV9;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) YVU9;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) Y41B;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 16," \ + "depth = (int) 16," \ + "red_mask = (int) 63488," \ + "green_mask = (int) 2016," \ + "blue_mask = (int) 31," \ + "endianness = (int) 1234;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 16," \ + "depth = (int) 15," \ + "red_mask = (int) 31744," \ + "green_mask = (int) 992," \ + "blue_mask = (int) 31," \ + "endianness = (int) 1234;" \ + "video/x-raw-gray," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 8," \ + "depth = (int) 8;" \ + "video/x-raw-rgb," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "bpp = (int) 8," \ + "depth = (int) 8," \ + "endianness = (int) 1234;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) UYVY;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) IYU1;" \ + "video/x-raw-yuv," \ + "width = (int) [ 1, 2147483647 ]," \ + "height = (int) [ 1, 2147483647 ]," \ + "framerate = (fraction) [ 0/1, 2147483647/1 ]," \ + "format = (fourcc) AYUV " \ +) + + +static GstStaticPadTemplate encoder_bin_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate encoder_bin_video_sink_template = +GST_STATIC_PAD_TEMPLATE ("video", + GST_PAD_SINK, + GST_PAD_REQUEST, + STATIC_VIDEO_CAPS + ); + +static GstStaticPadTemplate encoder_bin_audio_sink_template = +GST_STATIC_PAD_TEMPLATE ("audio", + GST_PAD_SINK, + GST_PAD_REQUEST, + STATIC_AUDIO_CAPS + ); + +static GstStaticPadTemplate encoder_bin_image_sink_template = +GST_STATIC_PAD_TEMPLATE ("image", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420")) + ); + +GST_DEBUG_CATEGORY_STATIC (gst_encode_bin_debug); +#define GST_CAT_DEFAULT gst_encode_bin_debug + +static void gst_encode_bin_class_init (GstEncodeBinClass *klass); +static void gst_encode_bin_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_encode_bin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_encode_bin_init (GstEncodeBin * encodebin); +static void gst_encode_bin_dispose (GObject * object); +static void gst_encode_bin_finalize (GObject * object); +static GstPad *gst_encode_bin_request_new_pad (GstElement * element, GstPadTemplate * templ, const gchar * name); + +static GstStateChangeReturn gst_encode_bin_change_state (GstElement * element, GstStateChange transition); +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static void gst_encode_bin_release_pad (GstElement * element, GstPad * pad); +static gint pad_compare_name (GstPad * pad1, const gchar * name); +static gboolean gst_encode_bin_add_element_by_name (GstEncodeBin *encodebin, GstEncodeBinElement type, const gchar *name); +#if 0 //disable unused function +static gboolean gst_encode_bin_change_profile(GstEncodeBin *encodebin, gboolean profile); +static void gst_encode_bin_replace_element (GstEncodeBin *encodebin, gint type, GstElement * newelement); +static gboolean gst_encode_bin_replace_element_by_name(GstEncodeBin *encodebin, GstEncodeBinElement type, const gchar *name); +static gboolean gst_encode_bin_replace_element_by_object(GstEncodeBin *encodebin, GstEncodeBinElement type, GstElement * element); +#endif //disable unused function +static gboolean gst_encode_bin_remove_element (GstEncodeBin *encodebin, GstElement * element); +static gboolean gst_encode_bin_link_elements (GstEncodeBin *encodebin); +static gboolean gst_encode_bin_unlink_elements (GstEncodeBin *encodebin); +static gboolean gst_encode_bin_init_video_elements (GstElement *element, gpointer user_data); +static gboolean gst_encode_bin_init_audio_elements (GstElement *element, gpointer user_data); +static gboolean gst_encode_bin_init_image_elements (GstElement *element, gpointer user_data); +static gboolean gst_encode_bin_block(GstEncodeBin *encodebin, gboolean value); +static gboolean gst_encode_bin_pause(GstEncodeBin *encodebin, gboolean value); +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static gboolean gst_encode_bin_release_pipeline (GstElement *element, gpointer user_data); +static gboolean gst_encode_bin_audsink_set_caps (GstPad * pad, GstCaps * vscaps); +static gboolean gst_encode_bin_vidsink_set_caps (GstPad * pad, GstCaps * vscaps); +static gboolean gst_encode_bin_imgsink_set_caps (GstPad * pad, GstCaps * vscaps); +static GstPad* gst_encode_bin_get_mux_sink_pad(GstElement *mux, GstEncodeBinMuxSinkPad type); + +//Data probe +static gboolean gst_encode_bin_video_probe(GstPad *pad, GstBuffer *buffer, GstEncodeBin *encodebin); +static gboolean gst_encode_bin_audio_probe(GstPad *pad, GstBuffer *buffer, GstEncodeBin *encodebin); +static gboolean gst_encode_bin_video_probe_hs(GstPad *pad, GstBuffer *buffer, GstEncodeBin *encodebin); + +static GstElementClass *parent_class; + +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE +static guint gst_encode_bin_signals[LAST_SIGNAL] = { 0 }; +#endif + +static const GstElementDetails gst_encode_bin_details = +GST_ELEMENT_DETAILS ("Samsung Electronics Co. Encoder Bin", + "Generic/Bin/Encoder", + "Autoplug and encode to muxed media", + "Jeonghoon Park , Wonhyung Cho , Sangho Park "); + +typedef enum { + GST_ENCODE_BIN_PROFILE_AV, + GST_ENCODE_BIN_PROFILE_AUDIO, + GST_ENCODE_BIN_PROFILE_IMAGE, +} GstEncodeBinProfile; + +GType +gst_encode_bin_profile_get_type (void) +{ + static GType encode_bin_profile_type = 0; + static const GEnumValue profile_types[] = { + {GST_ENCODE_BIN_PROFILE_AV, "Audio and Video Recording", "A/V"}, + {GST_ENCODE_BIN_PROFILE_AUDIO, "Audio Only Recording", "Audio"}, + {GST_ENCODE_BIN_PROFILE_IMAGE, "Image Stillshot", "Image"}, + {0, NULL, NULL} + }; + + if (!encode_bin_profile_type) { + encode_bin_profile_type = + g_enum_register_static ("GstEncodeBinProfile",profile_types); + } + return encode_bin_profile_type; +} + +GType +gst_encode_bin_get_type (void) +{ + static GType gst_encode_bin_type = 0; + + if (!gst_encode_bin_type) { + static const GTypeInfo gst_encode_bin_info = { + sizeof (GstEncodeBinClass), + NULL, + NULL, + (GClassInitFunc) gst_encode_bin_class_init, + NULL, + NULL, + sizeof (GstEncodeBin), + 0, + (GInstanceInitFunc) gst_encode_bin_init, + NULL + }; + + gst_encode_bin_type = + g_type_register_static (GST_TYPE_BIN, "GstEncodeBin", + &gst_encode_bin_info, 0); + } + + return gst_encode_bin_type; +} + +static void +queue_overun_cb (GstElement * queue, GstEncodeBin *encodebin) +{ +#if 0 + guint queue_size = 0; + guint queue_bufnum = 0; +// guint64 queue_time= (guint64)0; + + GstClockTime now = gst_util_get_timestamp (); + + g_object_get(G_OBJECT(queue), "current-level-bytes", &queue_size, + "current-level-buffers", &queue_bufnum, + // "current-level-time", &queue_time, + NULL); + GST_ELEMENT_WARNING (encodebin, STREAM, TOO_LAZY, + ("[%" GST_TIME_FORMAT "][%s], [%u b], [%u]", + GST_TIME_ARGS(now), GST_OBJECT_NAME(queue), queue_size, queue_bufnum), (NULL)); +#else + GST_ELEMENT_WARNING (encodebin, STREAM, TOO_LAZY, + ("%s overrun", GST_OBJECT_NAME(queue)), (NULL)); +#endif +} + +static void +gst_encode_bin_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstEncodeBin *encodebin; + + encodebin = GST_ENCODE_BIN (object); + + switch (prop_id) { + case PROP_PROFILE: + g_value_set_enum (value, encodebin->profile); + break; + case PROP_HIGH_SPEED: + g_value_set_int (value, encodebin->high_speed_fps); + break; + //elements name + case PROP_VENC_NAME: + g_value_set_string (value, encodebin->venc_name); + break; + case PROP_AENC_NAME: + g_value_set_string (value, encodebin->aenc_name); + break; + case PROP_IENC_NAME: + g_value_set_string (value, encodebin->ienc_name); + break; + case PROP_MUX_NAME: + g_value_set_string (value, encodebin->mux_name); + break; + case PROP_VCONV_NAME: + g_value_set_string (value, encodebin->vconv_name); + break; + //caps + case PROP_VCAPS: + gst_value_set_caps (value, encodebin->vcaps); + break; + case PROP_ACAPS: + gst_value_set_caps (value, encodebin->acaps); + break; + case PROP_ICAPS: + gst_value_set_caps (value, encodebin->icaps); + break; + //functions + case PROP_AUTO_AUDIO_CONVERT: + g_value_set_boolean (value, encodebin->auto_audio_convert); + break; + case PROP_AUTO_AUDIO_RESAMPLE: + g_value_set_boolean (value, encodebin->auto_audio_resample); + break; + case PROP_AUTO_COLORSPACE: + g_value_set_boolean (value, encodebin->auto_color_space); + break; + case PROP_BLOCK: + g_value_set_boolean (value, encodebin->block); + break; + case PROP_PAUSE: + g_value_set_boolean (value, encodebin->pause); + break; + case PROP_VENC_QUEUE: +// g_value_set_boolean (value, encodebin->use_venc_queue); + if((encodebin->video_encode_queue == NULL) && (encodebin->profile == GST_ENCODE_BIN_PROFILE_AV)) { + encodebin->video_encode_queue = gst_element_factory_make ("queue", "video_encode_queue"); + if(encodebin->video_encode_queue != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode_queue); + } + g_value_set_object (value, encodebin->video_encode_queue); + break; + case PROP_AENC_QUEUE: +// g_value_set_boolean (value, encodebin->use_aenc_queue); + if((encodebin->audio_encode_queue == NULL) && (encodebin->profile <= GST_ENCODE_BIN_PROFILE_AUDIO)) { + encodebin->audio_encode_queue = gst_element_factory_make ("queue", "audio_encode_queue"); + if(encodebin->audio_encode_queue != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->audio_encode_queue); + } + g_value_set_object (value, encodebin->audio_encode_queue); + break; + //elements pointer + case PROP_VIDEO_ENC: + if((encodebin->video_encode == NULL) && (encodebin->profile == GST_ENCODE_BIN_PROFILE_AV)) { + encodebin->video_encode = gst_element_factory_make (encodebin->venc_name, "video_encode"); + if(encodebin->video_encode != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode); + } + g_value_set_object (value, encodebin->video_encode); + break; + case PROP_AUDIO_ENC: + if(encodebin->audio_encode == NULL && (encodebin->profile <= GST_ENCODE_BIN_PROFILE_AUDIO)) { + encodebin->audio_encode = gst_element_factory_make (encodebin->aenc_name, "audio_encode"); + if(encodebin->audio_encode != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->audio_encode); + } + g_value_set_object (value, encodebin->audio_encode); + break; + case PROP_IMAGE_ENC: + if(encodebin->image_encode == NULL && (encodebin->profile == GST_ENCODE_BIN_PROFILE_IMAGE)) { + encodebin->image_encode = gst_element_factory_make (encodebin->ienc_name, "image_encode"); + if(encodebin->image_encode != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->image_encode); + } + g_value_set_object (value, encodebin->image_encode); + break; + case PROP_MUX: + if(encodebin->mux == NULL && (encodebin->profile <= GST_ENCODE_BIN_PROFILE_AUDIO)) { + encodebin->mux = gst_element_factory_make (encodebin->mux_name, "mux"); + if(encodebin->mux != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->mux); + } + g_value_set_object (value, encodebin->mux); + break; + case PROP_VIDEO_CONV: + if(encodebin->color_space == NULL && (encodebin->profile != GST_ENCODE_BIN_PROFILE_AUDIO)) { + encodebin->color_space = gst_element_factory_make (encodebin->vconv_name, "video_convert"); + if(encodebin->color_space != NULL) + gst_bin_add(GST_BIN(encodebin), encodebin->color_space); + } + g_value_set_object (value, encodebin->color_space); + break; + case PROP_USE_VIDEO_TOGGLE: + g_value_set_boolean( value, encodebin->use_video_toggle ); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_encode_bin_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstEncodeBin *encodebin; + + encodebin = GST_ENCODE_BIN (object); + + switch (prop_id) { + case PROP_PROFILE: + encodebin->profile = g_value_get_enum (value); + /* + gboolean newprofile = g_value_get_enum (value); + if(encodebin->profile != newprofile) { + gst_encode_bin_change_profile(encodebin, newprofile); + encodebin->profile = newprofile; + } + */ + break; + case PROP_HIGH_SPEED: + encodebin->high_speed_fps = g_value_get_int (value); + break; + case PROP_VENC_NAME: { + const gchar *new_name; + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AV) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + new_name = g_value_get_string (value); + + if(encodebin->video_encode == NULL) { + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_VENC, new_name)) + encodebin->venc_name = g_strdup (new_name); + } else { + if(strcmp (encodebin->venc_name, new_name)) { + gst_encode_bin_remove_element(encodebin, encodebin->video_encode); + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_VENC, new_name)) + encodebin->venc_name = g_strdup (new_name); + } + } + break; + } + case PROP_AENC_NAME: { + const gchar *new_name; + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + new_name = g_value_get_string (value); + + if(encodebin->audio_encode == NULL) { + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_AENC, new_name)) + encodebin->aenc_name = g_strdup (new_name); + } else { + if(strcmp (encodebin->aenc_name, new_name)) { + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode); + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_AENC, new_name)) + encodebin->aenc_name = g_strdup (new_name); + } + } + break; + } + case PROP_IENC_NAME: { + const gchar *new_name; + if(encodebin->profile < GST_ENCODE_BIN_PROFILE_IMAGE) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + new_name = g_value_get_string (value); + + if(encodebin->image_encode == NULL) { + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_IENC, new_name)) + encodebin->ienc_name = g_strdup (new_name); + } else { + if(strcmp (encodebin->ienc_name, new_name)) { + gst_encode_bin_remove_element(encodebin, encodebin->image_encode); + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_IENC, new_name)) + encodebin->ienc_name = g_strdup (new_name); + } + } + break; + } + case PROP_MUX_NAME: { + const gchar *new_name; + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match"); + break; + } + new_name = g_value_get_string (value); + + if(encodebin->mux == NULL) { + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_MUX, new_name)) + encodebin->mux_name = g_strdup (new_name); + } else { + if(strcmp (encodebin->mux_name, new_name)) { + gst_encode_bin_remove_element(encodebin, encodebin->mux); + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_MUX, new_name)) + encodebin->mux_name = g_strdup (new_name); + } + } + break; + } + case PROP_VCONV_NAME: { + const gchar *new_name; + if (encodebin->profile == GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match"); + break; + } + new_name = g_value_get_string(value); + + if (encodebin->color_space == NULL) { + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_VIDEO_CONV, new_name)) + encodebin->vconv_name = g_strdup (new_name); + } else { + if(strcmp (encodebin->vconv_name, new_name)) { + gst_encode_bin_remove_element(encodebin, encodebin->color_space); + if(gst_encode_bin_add_element_by_name(encodebin, ENCODEBIN_ELEMENT_VIDEO_CONV, new_name)) + encodebin->vconv_name = g_strdup (new_name); + } + } + break; + } + //caps + case PROP_VCAPS: { + GstCaps *new_caps; + GstCaps *old_caps; + const GstCaps *new_caps_val = gst_value_get_caps (value); + + if (new_caps_val == NULL) { + new_caps = gst_caps_new_any (); + } else { + new_caps = (GstCaps *) new_caps_val; + gst_caps_ref (new_caps); + } + + old_caps = encodebin->vcaps; + encodebin->vcaps = new_caps; + gst_caps_unref (old_caps); + break; + } + case PROP_ACAPS: { + GstCaps *new_caps; + GstCaps *old_caps; + const GstCaps *new_caps_val = gst_value_get_caps (value); + + if (new_caps_val == NULL) { + new_caps = gst_caps_new_any (); + } else { + new_caps = (GstCaps *) new_caps_val; + gst_caps_ref (new_caps); + } + + old_caps = encodebin->acaps; + encodebin->acaps = new_caps; + gst_caps_unref (old_caps); + break; + } + case PROP_ICAPS: { + GstCaps *new_caps; + GstCaps *old_caps; + const GstCaps *new_caps_val = gst_value_get_caps (value); + + if (new_caps_val == NULL) { + new_caps = gst_caps_new_any (); + } else { + new_caps = (GstCaps *) new_caps_val; + gst_caps_ref (new_caps); + } + + old_caps = encodebin->icaps; + encodebin->icaps = new_caps; + gst_caps_unref (old_caps); + break; + } + //functions + case PROP_AUTO_AUDIO_CONVERT: + encodebin->auto_audio_convert = g_value_get_boolean (value); + break; + case PROP_AUTO_AUDIO_RESAMPLE: + encodebin->auto_audio_resample = g_value_get_boolean (value); + break; + case PROP_AUTO_COLORSPACE: + encodebin->auto_color_space = g_value_get_boolean (value); + break; + case PROP_BLOCK: { + gboolean newval = g_value_get_boolean (value); + if(encodebin->block != newval) { + if(!gst_encode_bin_block(encodebin, newval)) { +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + if(newval) { + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_BLOCK], 0, FALSE); + } else { + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_UNBLOCK], 0, FALSE); + } +#endif + break; + } + } +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + if(newval) { + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_BLOCK], 0, TRUE); + } else { + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_UNBLOCK], 0, TRUE); + } +#endif + break; + } + case PROP_PAUSE: { + gboolean newval = g_value_get_boolean (value); + if(encodebin->pause != newval) { + if(!gst_encode_bin_pause(encodebin, newval)) + break; + } +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + if(newval) { + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_PAUSE], 0, TRUE); + } else { + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_RESUME], 0, TRUE); + } +#endif + break; + } + case PROP_VENC_QUEUE: +// encodebin->use_venc_queue = g_value_get_boolean (value); + { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AV) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->video_encode_queue); + encodebin->video_encode_queue = newelement; + gst_object_ref (encodebin->video_encode_queue); + gst_object_sink (GST_OBJECT_CAST (encodebin->video_encode_queue)); // take ownership ?? + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode_queue); + } + break; + } + break; + case PROP_AENC_QUEUE: +// encodebin->use_aenc_queue = g_value_get_boolean (value); + { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode_queue); + encodebin->audio_encode_queue = newelement; + gst_object_ref (encodebin->audio_encode_queue); + gst_object_sink (GST_OBJECT_CAST (encodebin->audio_encode_queue)); + gst_bin_add(GST_BIN(encodebin), encodebin->audio_encode_queue); + } + break; + } + break; + case PROP_VIDEO_ENC: + { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AV) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->video_encode); + encodebin->video_encode = newelement; + gst_object_ref (encodebin->video_encode); + gst_object_sink (GST_OBJECT_CAST (encodebin->video_encode)); // take ownership ?? + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode); + } + break; + } + case PROP_AUDIO_ENC: + { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode); + encodebin->audio_encode = newelement; + gst_object_ref (encodebin->audio_encode); + gst_object_sink (GST_OBJECT_CAST (encodebin->audio_encode)); + gst_bin_add(GST_BIN(encodebin), encodebin->audio_encode); + } + break; + } + case PROP_IMAGE_ENC: { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile < GST_ENCODE_BIN_PROFILE_IMAGE) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->image_encode); + encodebin->image_encode = newelement; + gst_object_ref (encodebin->image_encode); + gst_object_sink (GST_OBJECT_CAST (encodebin->image_encode)); + gst_bin_add(GST_BIN(encodebin), encodebin->image_encode); + } + break; + } + case PROP_MUX: { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->mux); + encodebin->mux = newelement; + gst_object_ref (encodebin->mux); + gst_object_sink (GST_OBJECT_CAST (encodebin->mux)); + gst_bin_add(GST_BIN(encodebin), encodebin->mux); + } + break; + } + case PROP_VIDEO_CONV: { + GstElement *newelement = g_value_get_object (value); + if(encodebin->profile == GST_ENCODE_BIN_PROFILE_AUDIO) { + GST_WARNING_OBJECT(encodebin, "Profile isn't match, change profile first!"); + break; + } + if(newelement != NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->color_space); + encodebin->color_space = newelement; + gst_object_ref (encodebin->color_space); + gst_object_sink (GST_OBJECT_CAST (encodebin->color_space)); + gst_bin_add(GST_BIN(encodebin), encodebin->color_space); + } + break; + } + case PROP_USE_VIDEO_TOGGLE: + encodebin->use_video_toggle = g_value_get_boolean( value ); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstPad * +gst_encode_bin_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) +{ + GstEncodeBin *encodebin = NULL; + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + GstPad *pad = NULL; + + g_return_val_if_fail (templ != NULL, NULL); + + if (templ->direction != GST_PAD_SINK) { + GST_WARNING_OBJECT (GST_IS_ENCODE_BIN (element), "encodebin: request pad that is not a SINK pad\n"); + return NULL; + } + + g_return_val_if_fail (GST_IS_ENCODE_BIN (element), NULL); + + encodebin = GST_ENCODE_BIN (element); + + /* FIXME */ + if (templ == gst_element_class_get_pad_template (klass, "audio")) { + if (encodebin->profile <= GST_ENCODE_BIN_PROFILE_AUDIO) { + gst_encode_bin_init_audio_elements(element, NULL); //?? + + if(encodebin->audio_sinkpad == NULL) + { + pad = gst_element_get_static_pad (encodebin->audio_queue, "sink"); + encodebin->audio_sinkpad = gst_ghost_pad_new ("audio", pad); + gst_object_unref(pad); + pad = NULL; + } + else + { + GST_WARNING_OBJECT (GST_IS_ENCODE_BIN (element), "encodebin: audio pad is aleady existed, return existing audio pad\n"); + return encodebin->audio_sinkpad; + } + + gst_element_add_pad (element, encodebin->audio_sinkpad); + gst_pad_set_setcaps_function (encodebin->audio_sinkpad, + GST_DEBUG_FUNCPTR (gst_encode_bin_audsink_set_caps)); + return encodebin->audio_sinkpad; + } else + return NULL; + } else if (templ == gst_element_class_get_pad_template (klass, "video")) { + if (encodebin->profile == GST_ENCODE_BIN_PROFILE_AV) { + gst_encode_bin_init_video_elements(element, NULL); //?? + + if(encodebin->video_sinkpad == NULL) + { + pad = gst_element_get_static_pad (encodebin->video_queue, "sink"); + encodebin->video_sinkpad = gst_ghost_pad_new ("video", pad); + gst_object_unref(pad); + pad = NULL; + } + else + { + GST_WARNING_OBJECT (GST_IS_ENCODE_BIN (element), "encodebin: video pad is aleady existed, return existing video pad\n"); + return encodebin->video_sinkpad; + } + + gst_element_add_pad (element, encodebin->video_sinkpad); + gst_pad_set_setcaps_function (encodebin->video_sinkpad, + GST_DEBUG_FUNCPTR (gst_encode_bin_vidsink_set_caps)); + return encodebin->video_sinkpad; + } else if (encodebin->profile == GST_ENCODE_BIN_PROFILE_IMAGE) { + gst_encode_bin_init_image_elements(element, NULL); //?? + + if(encodebin->image_sinkpad == NULL) + { + pad = gst_element_get_static_pad (encodebin->image_queue, "sink"); + encodebin->image_sinkpad = gst_ghost_pad_new ("image", pad); + gst_object_unref(pad); + pad = NULL; + } + else + { + GST_WARNING_OBJECT (GST_IS_ENCODE_BIN (element), "encodebin: image pad is aleady existed, return existing image pad\n"); + return encodebin->image_sinkpad; + } + + gst_element_add_pad (element, encodebin->image_sinkpad); + gst_pad_set_setcaps_function (encodebin->image_sinkpad, + GST_DEBUG_FUNCPTR (gst_encode_bin_imgsink_set_caps)); + return encodebin->image_sinkpad; + } else + return NULL; + } else { + if (encodebin->profile == GST_ENCODE_BIN_PROFILE_IMAGE) { + gst_encode_bin_init_image_elements(element, NULL); //?? + + if(encodebin->image_sinkpad == NULL) + { + pad = gst_element_get_static_pad (encodebin->image_queue, "sink"); + encodebin->image_sinkpad = gst_ghost_pad_new ("image", pad); + gst_object_unref(pad); + pad = NULL; + } + else + { + GST_WARNING_OBJECT (GST_IS_ENCODE_BIN (element), "encodebin: image pad is aleady existed, return existing image pad\n"); + return encodebin->image_sinkpad; + } + + gst_element_add_pad (element, encodebin->image_sinkpad); + gst_pad_set_setcaps_function (encodebin->image_sinkpad, + GST_DEBUG_FUNCPTR (gst_encode_bin_imgsink_set_caps)); + return encodebin->image_sinkpad; + } else + return NULL; + } +} + +static void +gst_encode_bin_class_init (GstEncodeBinClass *klass) +{ + GObjectClass *gobject_klass; + GstElementClass *gstelement_klass; + GstBinClass *gstbin_klass; + + gobject_klass = (GObjectClass *) klass; + gstelement_klass = (GstElementClass *) klass; + gstbin_klass = (GstBinClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_klass->get_property = gst_encode_bin_get_property; + gobject_klass->set_property = gst_encode_bin_set_property; + gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_encode_bin_dispose); + gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_encode_bin_finalize); + + + g_object_class_install_property (gobject_klass, PROP_PROFILE, + g_param_spec_enum ("profile", "PROFILE", "Profile of the media to record", + GST_TYPE_ENCODE_BIN_PROFILE, DEFAULT_PROP_PROFILE, + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_HIGH_SPEED, + g_param_spec_int ("high-speed-fps", "high speed rec. fps", "framerate for high speed recording", 0, G_MAXINT, + DEFAULT_PROP_HIGH_SPEED, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_VENC_NAME, + g_param_spec_string ("venc-name", "video encoder name", "the name of video encoder to use", + DEFAULT_PROP_VENC_NAME, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AENC_NAME, + g_param_spec_string ("aenc-name", "audio encoder name", "the name of audio encoder to use", + DEFAULT_PROP_AENC_NAME, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_IENC_NAME, + g_param_spec_string ("ienc-name", "image encoder name", "the name of image encoder to use", + DEFAULT_PROP_IENC_NAME, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_MUX_NAME, + g_param_spec_string ("mux-name", "muxer name", "the name of muxer to use", + DEFAULT_PROP_MUX_NAME, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_VCONV_NAME, + g_param_spec_string ("vconv-name", "Video converter name", "the name of video color converter to use", + DEFAULT_PROP_VCONV_NAME, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_VCAPS, + g_param_spec_boxed ("vcaps", "caps for video","caps for video recording", + GST_TYPE_CAPS, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_ACAPS, + g_param_spec_boxed ("acaps", "caps for audio","caps for audio recording", + GST_TYPE_CAPS, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_ICAPS, + g_param_spec_boxed ("icaps", "caps for image","caps for image stillshot", + GST_TYPE_CAPS, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AUTO_AUDIO_CONVERT, + g_param_spec_boolean ("auto-audio-convert", "auto audio convert", + "Support for auto audio convert", TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AUTO_AUDIO_RESAMPLE, + g_param_spec_boolean ("auto-audio-resample", "auto audio resample", + "Support for auto audio resample", TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AUTO_COLORSPACE, + g_param_spec_boolean ("auto-colorspace", "auto colorspace", + "Support for auto colorspace", TRUE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_BLOCK, + g_param_spec_boolean ("block", "stream block", + "Support for stream block", FALSE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_PAUSE, + g_param_spec_boolean ("runtime-pause", "recording pause", + "Support for recording pause/resume", FALSE, G_PARAM_READWRITE)); + +#if 0 + g_object_class_install_property (gobject_klass, PROP_VENC_QUEUE, + g_param_spec_boolean ("use-venc-queue", "use queue between venc and mux", + "add queue between venc and mux(only for custom optimization)", FALSE, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AENC_QUEUE, + g_param_spec_boolean ("use-aenc-queue", "use queue between aenc and mux", + "add queue between aenc and mux(only for custom optimization)", FALSE, G_PARAM_READWRITE)); +#else + g_object_class_install_property (gobject_klass, PROP_VENC_QUEUE, + g_param_spec_object ("use-venc-queue", "Video Encoder queue", + "add queue between venc and mux(only for custom optimization)", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AENC_QUEUE, + g_param_spec_object ("use-aenc-queue", "Audio Encoder queue", + "add queue between aenc and mux(only for custom optimization)", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); +#endif + + g_object_class_install_property (gobject_klass, PROP_VIDEO_ENC, + g_param_spec_object ("video-encode", "Video Encoder", + "the video encoder element to use", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_AUDIO_ENC, + g_param_spec_object ("audio-encode", "Audio Encoder", + "the audio encoder element to use", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_IMAGE_ENC, + g_param_spec_object ("image-encode", "Image Encoder", + "the Image encoder element to use", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_MUX, + g_param_spec_object ("mux", "Muxer", + "the muxer element to use", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_VIDEO_CONV, + g_param_spec_object ("video-convert", "Video converter", + "the video converter element to use", + GST_TYPE_ELEMENT, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_klass, PROP_USE_VIDEO_TOGGLE, + g_param_spec_boolean ("use-video-toggle", "Use video toggle", + "Use video toggle while AV recording", TRUE, G_PARAM_READWRITE)); + +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + gst_encode_bin_signals[SIGNAL_STREAM_BLOCK] = + g_signal_new ("stream-block", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstEncodeBinClass, stream_block), + NULL, NULL, gst_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + gst_encode_bin_signals[SIGNAL_STREAM_UNBLOCK] = + g_signal_new ("stream-unblock", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstEncodeBinClass, stream_unblock), + NULL, NULL, gst_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + gst_encode_bin_signals[SIGNAL_STREAM_PAUSE] = + g_signal_new ("stream-pause", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstEncodeBinClass, stream_pause), + NULL, NULL, gst_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); + + gst_encode_bin_signals[SIGNAL_STREAM_RESUME] = + g_signal_new ("stream-resume", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstEncodeBinClass, stream_resume), + NULL, NULL, gst_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN); +#endif + + gst_element_class_add_pad_template (gstelement_klass, + gst_static_pad_template_get (&encoder_bin_src_template)); + gst_element_class_add_pad_template (gstelement_klass, + gst_static_pad_template_get (&encoder_bin_audio_sink_template)); + gst_element_class_add_pad_template (gstelement_klass, + gst_static_pad_template_get (&encoder_bin_video_sink_template)); + gst_element_class_add_pad_template (gstelement_klass, + gst_static_pad_template_get (&encoder_bin_image_sink_template)); + + gst_element_class_set_details (gstelement_klass, &gst_encode_bin_details); + + gstelement_klass->request_new_pad = + GST_DEBUG_FUNCPTR (gst_encode_bin_request_new_pad); + gstelement_klass->release_pad = + GST_DEBUG_FUNCPTR (gst_encode_bin_release_pad); + gstelement_klass->change_state = + GST_DEBUG_FUNCPTR (gst_encode_bin_change_state); +} + +static void +gst_encode_bin_init (GstEncodeBin *encodebin) +{ + encodebin->mutex = g_mutex_new(); + + if (encodebin->srcpad == NULL) { + encodebin->srcpad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); + gst_element_add_pad (GST_ELEMENT(encodebin), encodebin->srcpad); + } + + encodebin->video_sinkpad = NULL; + encodebin->audio_sinkpad = NULL; + encodebin->image_sinkpad = NULL; + encodebin->mux_audio_sinkpad = NULL; + encodebin->mux_video_sinkpad = NULL; + + encodebin->profile = DEFAULT_PROP_PROFILE; + encodebin->fps = 0; + encodebin->high_speed_fps = DEFAULT_PROP_HIGH_SPEED; + encodebin->multiple = 1; + + encodebin->auto_audio_convert = TRUE; + encodebin->auto_audio_resample = TRUE; + encodebin->auto_color_space = TRUE; + encodebin->block = FALSE; + encodebin->pause= FALSE; + encodebin->use_video_toggle = TRUE; + encodebin->use_venc_queue= FALSE; + encodebin->use_aenc_queue= FALSE; + + encodebin->venc_name = g_strdup(DEFAULT_PROP_VENC_NAME); + encodebin->aenc_name = g_strdup(DEFAULT_PROP_AENC_NAME); + encodebin->ienc_name = g_strdup(DEFAULT_PROP_IENC_NAME); + encodebin->mux_name = g_strdup(DEFAULT_PROP_MUX_NAME); + encodebin->vconv_name = g_strdup(DEFAULT_PROP_VCONV_NAME); + + encodebin->vcaps = gst_caps_new_any (); + encodebin->acaps = gst_caps_new_any (); + encodebin->icaps = gst_caps_new_any (); + + encodebin->audio_queue = NULL; + encodebin->video_queue = NULL; + encodebin->video_encode_queue = NULL; + encodebin->image_queue = NULL; + + encodebin->audio_encode = NULL; + encodebin->video_encode = NULL; + encodebin->image_encode = NULL; + + encodebin->vcapsfilter = NULL; + encodebin->acapsfilter = NULL; + encodebin->icapsfilter = NULL; + + encodebin->video_toggle = NULL; + encodebin->image_toggle = NULL; + encodebin->color_space = NULL; + encodebin->audio_conv = NULL; + encodebin->audio_sample = NULL; + + encodebin->mux = NULL; + + encodebin->paused_time = 0; + encodebin->total_offset_time = 0; + + encodebin->vsink_probeid = 0; + encodebin->vsink_hs_probeid = 0; + encodebin->asink_probeid = 0; + encodebin->veque_sig_id = 0; + encodebin->aeque_sig_id = 0; +} + +static void +gst_encode_bin_dispose (GObject * object) +{ + GstEncodeBin *encodebin = GST_ENCODE_BIN (object); + + g_free(encodebin->venc_name); + encodebin->venc_name = NULL; + + g_free(encodebin->aenc_name); + encodebin->aenc_name = NULL; + + g_free(encodebin->ienc_name); + encodebin->ienc_name = NULL; + + g_free(encodebin->mux_name); + encodebin->mux_name = NULL; + + g_free(encodebin->vconv_name); + encodebin->vconv_name = NULL; + + gst_caps_replace (&encodebin->vcaps, NULL); + gst_caps_replace (&encodebin->acaps, NULL); + gst_caps_replace (&encodebin->icaps, NULL); + + if (encodebin->srcpad != NULL) { + gst_element_remove_pad(GST_ELEMENT(encodebin), encodebin->srcpad); + encodebin->srcpad = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); + + encodebin->video_sinkpad = NULL; + encodebin->audio_sinkpad = NULL; + encodebin->image_sinkpad = NULL; + encodebin->mux_audio_sinkpad = NULL; + encodebin->mux_video_sinkpad = NULL; + + encodebin->audio_queue = NULL; + encodebin->video_queue = NULL; + encodebin->image_queue = NULL; + + encodebin->audio_encode = NULL; + encodebin->video_encode = NULL; + encodebin->video_encode_queue = NULL; + encodebin->image_encode = NULL; + + encodebin->vcapsfilter = NULL; + encodebin->acapsfilter = NULL; + encodebin->icapsfilter = NULL; + + encodebin->video_toggle = NULL; + encodebin->image_toggle = NULL; + encodebin->color_space = NULL; + encodebin->audio_conv = NULL; + encodebin->audio_sample = NULL; + + if (encodebin->mux && GST_IS_ELEMENT(encodebin->mux)) { + int remain_count= 0; + remain_count = GST_OBJECT_REFCOUNT_VALUE(encodebin->mux); + while (remain_count) { + gst_object_unref(encodebin->mux); + remain_count--; + } + } + + encodebin->mux = NULL; +} + +static void +gst_encode_bin_finalize (GObject * object) +{ + GstEncodeBin *encodebin = GST_ENCODE_BIN (object); + + g_mutex_free (encodebin->mutex); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static GstStateChangeReturn +gst_encode_bin_change_state (GstElement * element, GstStateChange transition) +{ + GstStateChangeReturn ret; + GstEncodeBin *encode_bin; + + encode_bin = GST_ENCODE_BIN (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + gst_encode_bin_link_elements(encode_bin); + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + /* reset time related values */ + encode_bin->paused_time = 0; + encode_bin->total_offset_time = 0; + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_NULL: + gst_encode_bin_unlink_elements(encode_bin); + break; + default: + break; + } + +// if (ret == GST_STATE_CHANGE_FAILURE) +// goto done; +//done: + return ret; +} + +static void +gst_encode_bin_release_all_pads (GstEncodeBin *encodebin) +{ + gst_element_remove_pad(GST_ELEMENT(encodebin), encodebin->video_sinkpad); + gst_element_remove_pad(GST_ELEMENT(encodebin), encodebin->audio_sinkpad); + gst_element_remove_pad(GST_ELEMENT(encodebin), encodebin->image_sinkpad); +} + +static void +gst_encode_bin_release_pad (GstElement * element, GstPad * pad) +{ + GstEncodeBin *encodebin = GST_ENCODE_BIN (element); + GstPad *muxpad = NULL; + + if(!pad_compare_name(pad, "video")) { +#if 0 + gst_encode_bin_remove_element(encodebin, encodebin->video_queue); + encodebin->video_queue = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->video_toggle); + encodebin->video_toggle = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->color_space); + encodebin->color_space = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->vcapsfilter); + encodebin->vcapsfilter = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->video_encode_queue); + encodebin->video_encode_queue = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->video_encode); + encodebin->video_encode = NULL; + + gst_element_release_request_pad(encodebin->mux, encodebin->mux_video_sinkpad); + encodebin->mux_video_sinkpad = NULL; + + if(encodebin->mux_audio_sinkpad == NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->mux); + encodebin->mux = NULL; + } + else + { + encodebin->mux_audio_sinkpad = NULL; + } +#endif + + if(encodebin->mux_video_sinkpad != NULL) + { + gst_element_release_request_pad(encodebin->mux, encodebin->mux_video_sinkpad); + encodebin->mux_video_sinkpad = NULL; + } + + gst_pad_set_active (pad, FALSE); //?? + gst_element_remove_pad(element, pad); + encodebin->video_sinkpad = NULL; + } else if(!pad_compare_name(pad, "audio")) { +#if 0 + gst_encode_bin_remove_element(encodebin, encodebin->audio_queue); + encodebin->audio_queue = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->audio_sample); + encodebin->audio_sample = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->audio_conv); + encodebin->audio_conv = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->acapsfilter); + encodebin->acapsfilter = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode_queue); + encodebin->audio_encode_queue = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode); + encodebin->audio_encode = NULL; + + encodebin->mux_audio_sinkpad; + gst_element_release_request_pad(encodebin->mux, encodebin->mux_audio_sinkpad); + muxpad = NULL; + + if(encodebin->mux_video_sinkpad == NULL) { + gst_encode_bin_remove_element(encodebin, encodebin->mux); + encodebin->mux = NULL; + } + else + { + encodebin->mux_video_sinkpad = NULL; + } +#endif + if(encodebin->mux_audio_sinkpad != NULL) + { + gst_element_release_request_pad(encodebin->mux, encodebin->mux_audio_sinkpad); +// gst_object_unref(encodebin->mux_audio_sinkpad); //*** + encodebin->mux_audio_sinkpad = NULL; + } + + gst_pad_set_active (pad, FALSE); //?? + gst_element_remove_pad(element, pad); + encodebin->audio_sinkpad = NULL; + } else { +#if 0 + gst_encode_bin_remove_element(encodebin, encodebin->image_queue); + encodebin->image_queue = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->image_toggle); + encodebin->image_toggle = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->color_space); + encodebin->color_space = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->icapsfilter); + encodebin->icapsfilter = NULL; + gst_encode_bin_remove_element(encodebin, encodebin->image_encode); + encodebin->image_encode = NULL; +#endif + gst_pad_set_active (pad, FALSE); //?? + gst_element_remove_pad(element, pad); + encodebin->image_sinkpad = NULL; + } +} + +static gint +pad_compare_name (GstPad * pad1, const gchar * name) +{ + gint result; + + GST_OBJECT_LOCK (pad1); + result = strcmp (GST_PAD_NAME (pad1), name); + GST_OBJECT_UNLOCK (pad1); + + return result; +} + +static gboolean +gst_encode_bin_add_element_by_name (GstEncodeBin *encodebin, GstEncodeBinElement type, const gchar *name) +{ + switch(type) { + case ENCODEBIN_ELEMENT_VENC: + encodebin->video_encode = gst_element_factory_make (name, "video_encode"); + if(encodebin->video_encode != NULL) { + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode); + g_free(encodebin->venc_name); + encodebin->venc_name = NULL; + } else { + goto element_make_fail; + } + break; + case ENCODEBIN_ELEMENT_AENC: + encodebin->audio_encode = gst_element_factory_make (name, "audio_encode"); + if(encodebin->audio_encode != NULL) { + gst_bin_add(GST_BIN(encodebin), encodebin->audio_encode); + g_free(encodebin->aenc_name); + encodebin->aenc_name = NULL; + } else { + goto element_make_fail; + } + break; + case ENCODEBIN_ELEMENT_IENC: + encodebin->image_encode = gst_element_factory_make (name, "image_encode"); + if(encodebin->image_encode != NULL) { + gst_bin_add(GST_BIN(encodebin), encodebin->image_encode); + g_free(encodebin->ienc_name); + encodebin->ienc_name = NULL; + } else { + goto element_make_fail; + } + break; + case ENCODEBIN_ELEMENT_MUX: + encodebin->mux = gst_element_factory_make (name, "mux"); + if(encodebin->mux != NULL) { + gst_bin_add(GST_BIN(encodebin), encodebin->mux); + g_free(encodebin->mux_name); + encodebin->mux_name = NULL; + } else { + goto element_make_fail; + } + break; + case ENCODEBIN_ELEMENT_VIDEO_CONV: + encodebin->color_space = gst_element_factory_make(name, "video_convert"); + if (encodebin->color_space != NULL) { + gst_bin_add(GST_BIN(encodebin), encodebin->color_space); + g_free(encodebin->vconv_name); + encodebin->vconv_name = NULL; + } else { + goto element_make_fail; + } + break; + default: + GST_WARNING_OBJECT(encodebin, "Invalid element type = %d", type); + break; + } + + return TRUE; + +element_make_fail: + GST_WARNING_OBJECT(encodebin, "no such element factory \"%s\"!", name); + return FALSE; +} + +#if 0 //disable unused function +static gboolean +gst_encode_bin_change_profile(GstEncodeBin *encodebin, gboolean newprofile) +{ + + gst_encode_bin_remove_element(encodebin, encodebin->video_encode); + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode); + gst_encode_bin_remove_element(encodebin, encodebin->image_encode); + gst_encode_bin_remove_element(encodebin, encodebin->mux); + + switch (newprofile) { + case GST_ENCODE_BIN_PROFILE_AV : + encodebin->audio_encode = gst_element_factory_make (encodebin->aenc_name, "audio_encode"); + encodebin->video_encode = gst_element_factory_make (encodebin->venc_name,"video_encode"); + encodebin->mux = gst_element_factory_make (encodebin->mux_name,"mux"); + + gst_bin_add_many (GST_BIN (encodebin), + encodebin->audio_encode, + encodebin->video_encode, + encodebin->mux, + NULL); + break; + case GST_ENCODE_BIN_PROFILE_AUDIO : + encodebin->audio_encode = gst_element_factory_make (encodebin->aenc_name, "audio_encode"); + encodebin->mux = gst_element_factory_make (encodebin->mux_name,"mux"); + + gst_bin_add_many (GST_BIN (encodebin), + encodebin->audio_encode, + encodebin->mux, + NULL); + break; + case GST_ENCODE_BIN_PROFILE_IMAGE : + encodebin->image_encode = gst_element_factory_make (encodebin->ienc_name,"image_encode"); + + gst_bin_add_many (GST_BIN (encodebin), + encodebin->image_encode, + NULL); + break; + default: + GST_WARNING_OBJECT(encodebin, "Invalid profile number = %d", encodebin->profile); + return FALSE; + break; + } + return TRUE; + +} + +static void +gst_encode_bin_replace_element (GstEncodeBin *encodebin, gint type, GstElement * newelement) +{ + if(newelement == NULL) { + GST_ERROR_OBJECT(encodebin, "some elements are null\n"); + return; + } + switch(type) { + case PROP_VIDEO_ENC: + gst_encode_bin_remove_element(encodebin, encodebin->video_encode); + encodebin->video_encode = newelement; + gst_object_ref (encodebin->video_encode); + gst_object_sink (GST_OBJECT_CAST (encodebin->video_encode)); // take ownership ?? + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode); + break; + case PROP_AUDIO_ENC: + gst_encode_bin_remove_element(encodebin, encodebin->audio_encode); + encodebin->audio_encode = newelement; + gst_object_ref (encodebin->audio_encode); + gst_object_sink (GST_OBJECT_CAST (encodebin->audio_encode)); + gst_bin_add(GST_BIN(encodebin), encodebin->audio_encode); + break; + case PROP_IMAGE_ENC: + gst_encode_bin_remove_element(encodebin, encodebin->image_encode); + encodebin->image_encode = newelement; + gst_object_ref (encodebin->image_encode); + gst_object_sink (GST_OBJECT_CAST (encodebin->image_encode)); + gst_bin_add(GST_BIN(encodebin), encodebin->image_encode); + break; + case PROP_MUX: + gst_encode_bin_remove_element(encodebin, encodebin->mux); + encodebin->mux = newelement; + gst_object_ref (encodebin->mux); + gst_object_sink (GST_OBJECT_CAST (encodebin->mux)); + gst_bin_add(GST_BIN(encodebin), encodebin->mux); + break; + default: + GST_WARNING_OBJECT(encodebin, "Invalid type = %d", type); + return; + break; + } +} + +static gboolean +gst_encode_bin_replace_element_by_name(GstEncodeBin *encodebin, GstEncodeBinElement type, const gchar *name) +{ + GstPad *sink1, *sink2, *src, *peersink1, *peersink2, *peersrc; + + switch(type) { + case ENCODEBIN_ELEMENT_VENC: + if(encodebin->video_encode == NULL) { + encodebin->video_encode = gst_element_factory_make (name, "video_encode"); + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode); + } else { + sink1 = gst_element_get_static_pad(encodebin->video_encode, "sink"); + src = gst_element_get_static_pad(encodebin->video_encode, "src"); + if(sink1 != NULL) { + peersink1 = gst_pad_get_peer(sink1); + if(peersink1 != NULL) { + if(!gst_pad_unlink(peersink1, sink1)) { + goto unlink_fail; + } + } + } + + if(src !=NULL) { + peersrc = gst_pad_get_peer(src); + if(peersrc != NULL) { + if(!gst_pad_unlink(src, peersrc)) { + goto unlink_fail; + } + } + } + + if(gst_encode_bin_remove_element(encodebin, encodebin->video_encode)) { + if(encodebin->video_encode = gst_element_factory_make (name, "video_encode") != NULL) { + gst_bin_add(GST_BIN(encodebin), encodebin->video_encode); + if(peersink1 != NULL) { + if(!gst_pad_link(peersink1, gst_element_get_pad(encodebin->video_encode, "sink"))) { + goto link_fail; + } + } + + if(peersrc != NULL) { + if(!gst_pad_link(gst_element_get_pad(encodebin->video_encode, "src"), peersrc)) { + goto link_fail; + } + } + } else { + GST_ERROR_OBJECT(encodebin, "gst_encode_bin_replace_element_by_name() new element[%d] make fail\n", type); + return FALSE; + } + } else { + GST_ERROR_OBJECT(encodebin, "gst_encode_bin_replace_element_by_name() old element[%d] remove fail\n", type); + return FALSE; + } + } + break; + case ENCODEBIN_ELEMENT_AENC: + break; + case ENCODEBIN_ELEMENT_IENC: + break; + case ENCODEBIN_ELEMENT_MUX: + break; + default : + GST_WARNING_OBJECT(encodebin, "Invalid element type = %d", type); + break; + } + gst_object_unref(sink1); + gst_object_unref(sink2); + gst_object_unref(src); + gst_object_unref(peersink1); + gst_object_unref(peersink2); + gst_object_unref(peersrc); + return TRUE; + +unlink_fail: + gst_object_unref(sink1); + gst_object_unref(sink2); + gst_object_unref(src); + gst_object_unref(peersink1); + gst_object_unref(peersink2); + gst_object_unref(peersrc); + GST_ERROR_OBJECT(encodebin, "gst_encode_bin_replace_element_by_name() old element[%d] unlink fail\n", type); + return FALSE; + + +link_fail: + gst_object_unref(sink1); + gst_object_unref(sink2); + gst_object_unref(src); + gst_object_unref(peersink1); + gst_object_unref(peersink2); + gst_object_unref(peersrc); + GST_ERROR_OBJECT(encodebin, "gst_encode_bin_replace_element_by_name() new element[%d] link fail\n", type); + return FALSE; +} + +static gboolean +gst_encode_bin_replace_element_by_object(GstEncodeBin *encodebin, GstEncodeBinElement type, GstElement * element) +{ + GstPad *sink1, *sink2, *src, *peersink1, *peersink2, *peersrc; + + switch(type) + case ENCODEBIN_ELEMENT_VENC: + if(encodebin->video_encode == NULL) { + encodebin->video_encode = element + } + break; + case ENCODEBIN_ELEMENT_AENC: + break; + case ENCODEBIN_ELEMENT_IENC: + break; + case ENCODEBIN_ELEMENT_MUX: + break; + default : + GST_WARNING_OBJECT (encodebin,"Invalid element type = %d", type); + break; +} +#endif //disable unused function + +static gboolean +gst_encode_bin_remove_element (GstEncodeBin *encodebin, GstElement * element) +{ + GstObject *parent; + gchar *ename = NULL; + GST_INFO_OBJECT (encodebin, "gst_encode_bin_remove_element"); + + if (element == NULL) { + GST_INFO_OBJECT (encodebin, "element is already NULL"); + return TRUE; + } + + gst_element_set_state (element, GST_STATE_NULL); + parent = gst_element_get_parent (element); + + if (parent != NULL) { + if(!gst_bin_remove (GST_BIN_CAST (parent), element)) { + gst_object_unref (parent); + ename = gst_element_get_name (element); + GST_ERROR_OBJECT (encodebin, "gst_encode_bin_remove_element() [%s] remove fail", ename); + g_free (ename); + return FALSE; + } else { + gst_object_unref(parent); + } + } else { + gst_object_unref(element); + } + + return TRUE; + } + +static gboolean +gst_encode_bin_link_elements (GstEncodeBin *encodebin) // need to return ???? +{ + GstPad *srcpad = NULL, *sinkpad = NULL; + switch(encodebin->profile) { + case GST_ENCODE_BIN_PROFILE_AV : + if (!gst_caps_is_any(encodebin->vcaps)) { + gchar *caps_str = NULL; + caps_str = gst_caps_to_string(encodebin->vcaps); + if (caps_str) { + GST_INFO_OBJECT(encodebin, "vconv caps [%s]", caps_str); + g_free(caps_str); + caps_str = NULL; + } + + g_object_set(encodebin->vcapsfilter, "caps", encodebin->vcaps, NULL); + } + + if (encodebin->auto_color_space) { + if(encodebin->color_space == NULL) { + encodebin->color_space = gst_element_factory_make (encodebin->vconv_name, "video_convert"); + gst_bin_add (GST_BIN (encodebin), encodebin->color_space); + } + + srcpad = gst_element_get_static_pad(encodebin->video_queue, "src"); + if( encodebin->video_toggle ) + { + sinkpad = gst_element_get_static_pad(encodebin->video_toggle, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->video_toggle, "src"); + } + sinkpad = gst_element_get_static_pad(encodebin->color_space, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->color_space, "src"); + sinkpad = gst_element_get_static_pad(encodebin->vcapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->vcapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->video_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); +#if 0 + if(encodebin->use_venc_queue) + { + if(encodebin->video_encode_queue == NULL) { + encodebin->video_encode_queue = gst_element_factory_make ("queue","video_encode_queue"); + gst_bin_add (GST_BIN (encodebin), encodebin->video_encode_queue); + + ENCODER_QUEUE_SET(encodebin->video_encode_queue, 0, 0, VIDEO_ENC_QUE_TIME); + encodebin->veque_sig_id = g_signal_connect( G_OBJECT(encodebin->video_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + + } + + srcpad = gst_element_get_static_pad(encodebin->video_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->video_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + } +#else + if(encodebin->video_encode_queue) + { + ENCODER_QUEUE_SET(encodebin->video_encode_queue, 0, 0, VIDEO_ENC_QUE_TIME); + encodebin->veque_sig_id = g_signal_connect( G_OBJECT(encodebin->video_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); +#if 0 + g_object_set(G_OBJECT(encodebin->video_queue), + "max-size-bytes", (guint)0, + "max-size-buffers", (guint)1, + "max-size-time", (guint64)0, + NULL); +#endif + srcpad = gst_element_get_static_pad(encodebin->video_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->video_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + } +#endif + + } + else { + srcpad = gst_element_get_static_pad(encodebin->video_queue, "src"); + if( encodebin->video_toggle ) + { + sinkpad = gst_element_get_static_pad(encodebin->video_toggle, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->video_toggle, "src"); + } + sinkpad = gst_element_get_static_pad(encodebin->vcapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->vcapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->video_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + #if 0 + if(encodebin->use_venc_queue) + { + if(encodebin->video_encode_queue == NULL) { + encodebin->video_encode_queue = gst_element_factory_make ("queue","video_encode_queue"); + gst_bin_add (GST_BIN (encodebin), encodebin->video_encode_queue); + + ENCODER_QUEUE_SET(encodebin->video_encode_queue, 0, 0, VIDEO_ENC_QUE_TIME); + encodebin->veque_sig_id = g_signal_connect( G_OBJECT(encodebin->video_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + } + + srcpad = gst_element_get_static_pad(encodebin->video_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->video_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + + } +#else + if(encodebin->video_encode_queue) + { + ENCODER_QUEUE_SET(encodebin->video_encode_queue, 0, 0, VIDEO_ENC_QUE_TIME); + encodebin->veque_sig_id = g_signal_connect( G_OBJECT(encodebin->video_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); +#if 0 + g_object_set(G_OBJECT(encodebin->video_queue), + "max-size-bytes", (guint)0, + "max-size-buffers", (guint)1, + "max-size-time", (guint64)0, + NULL); +#endif + + srcpad = gst_element_get_static_pad(encodebin->video_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->video_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + } +#endif + + } + +// gst_element_get_request_pad (encodebin->mux, "video_%d"); +#if 0 + if(encodebin->use_venc_queue) + { + srcpad = gst_element_get_static_pad(encodebin->video_encode_queue, "src"); + sinkpad = encodebin->mux_video_sinkpad = gst_encode_bin_get_mux_sink_pad(encodebin->mux, ENCODEBIN_MUX_VIDEO_SINK); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + } +#else + if(encodebin->video_encode_queue) + { + srcpad = gst_element_get_static_pad(encodebin->video_encode_queue, "src"); + sinkpad = encodebin->mux_video_sinkpad = gst_encode_bin_get_mux_sink_pad(encodebin->mux, ENCODEBIN_MUX_VIDEO_SINK); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + } +#endif + else + { + srcpad = gst_element_get_static_pad(encodebin->video_encode, "src"); + sinkpad = encodebin->mux_video_sinkpad = gst_encode_bin_get_mux_sink_pad(encodebin->mux, ENCODEBIN_MUX_VIDEO_SINK); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, video_link_fail); + } + + srcpad = gst_element_get_static_pad(encodebin->mux, "src"); + if(gst_ghost_pad_get_target(GST_GHOST_PAD (encodebin->srcpad)) != srcpad) + gst_ghost_pad_set_target(GST_GHOST_PAD (encodebin->srcpad), srcpad); + gst_object_unref(srcpad); + srcpad = NULL; + + /* For pause/resume control */ +// encodebin->vsink_probeid = gst_pad_add_data_probe (gst_element_get_static_pad (encodebin->video_queue, "sink"), + sinkpad = gst_element_get_static_pad (encodebin->video_queue, "sink"); + encodebin->vsink_probeid = gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (gst_encode_bin_video_probe), encodebin); + gst_object_unref(sinkpad); + sinkpad = NULL; + + if(encodebin->high_speed_fps > DEFAULT_PROP_HIGH_SPEED) + { +// encodebin->vsink_hs_probeid = gst_pad_add_data_probe (gst_element_get_static_pad (encodebin->video_encode, "sink"), + sinkpad = gst_element_get_static_pad (encodebin->video_encode, "sink"); + encodebin->vsink_hs_probeid = gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (gst_encode_bin_video_probe_hs), encodebin); + gst_object_unref(sinkpad); + sinkpad = NULL; + } + + if(encodebin->audio_queue == NULL) + { + GST_WARNING_OBJECT(encodebin, "Audio pad isn't requested, recording video only mode"); + break; + } + case GST_ENCODE_BIN_PROFILE_AUDIO : + if(!gst_caps_is_any(encodebin->acaps)) + { + g_object_set(encodebin->acapsfilter, "caps", encodebin->acaps, NULL); + } + if (encodebin->auto_audio_convert ||encodebin->auto_audio_resample) { + if (!encodebin->auto_audio_convert) { + if(encodebin->audio_sample == NULL) { + encodebin->audio_sample = gst_element_factory_make ("audioresample","audio_sample"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_sample); + } + srcpad = gst_element_get_static_pad(encodebin->audio_queue, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_sample, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->audio_sample, "src"); + sinkpad = gst_element_get_static_pad(encodebin->acapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->acapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); +#if 0 + if(encodebin->use_aenc_queue) + { + if(encodebin->audio_encode_queue == NULL) { + encodebin->audio_encode_queue = gst_element_factory_make ("queue","audio_encode_queue"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_encode_queue); + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + } + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + } +#else + if(encodebin->audio_encode_queue) + { + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + } +#endif + + } else if (!encodebin->auto_audio_resample) { + if (encodebin->audio_conv == NULL) { + encodebin->audio_conv = gst_element_factory_make ("audioconvert","audio_conv"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_conv); + } + + srcpad = gst_element_get_static_pad(encodebin->audio_queue, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_conv, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->audio_conv, "src"); + sinkpad = gst_element_get_static_pad(encodebin->acapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->acapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); +#if 0 + if(encodebin->use_aenc_queue) + { + if(encodebin->audio_encode_queue == NULL) { + encodebin->audio_encode_queue = gst_element_factory_make ("queue","audio_encode_queue"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_encode_queue); + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + } + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + } +#else + if(encodebin->audio_encode_queue) + { + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + } +#endif + + } else { + if(encodebin->audio_sample == NULL) { + encodebin->audio_sample = gst_element_factory_make ("audioresample","audio_sample"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_sample); + } + if (encodebin->audio_conv == NULL) { + encodebin->audio_conv = gst_element_factory_make ("audioconvert","audio_conv"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_conv); + } + + srcpad = gst_element_get_static_pad(encodebin->audio_queue, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_conv, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->audio_conv, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_sample, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->audio_sample, "src"); + sinkpad = gst_element_get_static_pad(encodebin->acapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->acapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); +#if 0 + if(encodebin->use_aenc_queue) + { + if(encodebin->audio_encode_queue == NULL) { + encodebin->audio_encode_queue = gst_element_factory_make ("queue","audio_encode_queue"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_encode_queue); + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + } + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + } +#else + if(encodebin->audio_encode_queue) + { + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + } +#endif + + } + }else { + + srcpad = gst_element_get_static_pad(encodebin->audio_queue, "src"); + sinkpad = gst_element_get_static_pad(encodebin->acapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->acapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); +#if 0 + if(encodebin->use_aenc_queue) + { + if(encodebin->audio_encode_queue == NULL) { + encodebin->audio_encode_queue = gst_element_factory_make ("queue","audio_encode_queue"); + gst_bin_add (GST_BIN (encodebin), encodebin->audio_encode_queue); + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + } + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + } +#else + if(encodebin->audio_encode_queue) + { + + ENCODER_QUEUE_SET(encodebin->audio_encode_queue, 0, 0, AUDIO_ENC_QUE_TIME); + encodebin->aeque_sig_id = g_signal_connect( G_OBJECT(encodebin->audio_encode_queue), "overrun", + G_CALLBACK(queue_overun_cb), encodebin); + + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + } +#endif + + } +#if 0 + if(encodebin->use_aenc_queue) + { + srcpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "src"); + sinkpad = encodebin->mux_audio_sinkpad = gst_encode_bin_get_mux_sink_pad(encodebin->mux, ENCODEBIN_MUX_AUDIO_SINK); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + } +#else + + if(encodebin->audio_encode_queue) + { + srcpad = gst_element_get_static_pad(encodebin->audio_encode_queue, "src"); + sinkpad = encodebin->mux_audio_sinkpad = gst_encode_bin_get_mux_sink_pad(encodebin->mux, ENCODEBIN_MUX_AUDIO_SINK); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + } +#endif + else + { + srcpad = gst_element_get_static_pad(encodebin->audio_encode, "src"); + sinkpad = encodebin->mux_audio_sinkpad = gst_encode_bin_get_mux_sink_pad(encodebin->mux, ENCODEBIN_MUX_AUDIO_SINK); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, audio_link_fail); + + } + + srcpad = gst_element_get_static_pad(encodebin->mux, "src"); + if(gst_ghost_pad_get_target(GST_GHOST_PAD (encodebin->srcpad)) != srcpad) + gst_ghost_pad_set_target(GST_GHOST_PAD (encodebin->srcpad), srcpad); + gst_object_unref(srcpad); + srcpad = NULL; + + /* For pause/resume control */ + sinkpad = gst_element_get_static_pad (encodebin->audio_queue, "sink"); + encodebin->asink_probeid = gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (gst_encode_bin_audio_probe), encodebin); + gst_object_unref(sinkpad); + sinkpad = NULL; + + break; + case GST_ENCODE_BIN_PROFILE_IMAGE : + if(!gst_caps_is_any(encodebin->icaps)) + { + g_object_set(encodebin->icapsfilter, "caps", encodebin->icaps, NULL); + } + + if (encodebin->auto_color_space) { + if(encodebin->color_space == NULL) { + encodebin->color_space = gst_element_factory_make ("ffmpegcolorspace","color_space"); + gst_bin_add (GST_BIN (encodebin), encodebin->color_space); + } + + srcpad = gst_element_get_static_pad(encodebin->image_queue, "src"); + sinkpad = gst_element_get_static_pad(encodebin->image_toggle, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->image_toggle, "src"); + sinkpad = gst_element_get_static_pad(encodebin->color_space, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->color_space, "src"); + sinkpad = gst_element_get_static_pad(encodebin->icapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->icapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->image_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + } + else { + + srcpad = gst_element_get_static_pad(encodebin->image_queue, "src"); + sinkpad = gst_element_get_static_pad(encodebin->image_toggle, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->image_toggle, "src"); + sinkpad = gst_element_get_static_pad(encodebin->icapsfilter, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + srcpad = gst_element_get_static_pad(encodebin->icapsfilter, "src"); + sinkpad = gst_element_get_static_pad(encodebin->image_encode, "sink"); + _GST_PAD_LINK_UNREF(srcpad, sinkpad, image_link_fail); + + } + srcpad = gst_element_get_static_pad (encodebin->image_encode, "src"); + if(gst_ghost_pad_get_target(GST_GHOST_PAD (encodebin->srcpad)) != srcpad) + gst_ghost_pad_set_target(GST_GHOST_PAD (encodebin->srcpad), srcpad); + gst_object_unref(srcpad); + srcpad = NULL; + break; + default: + GST_WARNING_OBJECT(encodebin, "Invalid profile number = %d", encodebin->profile); + return FALSE; + break; + } +// gst_pad_set_active(encodebin->srcpad, TRUE); + return TRUE; + +video_link_fail: + // remove elements + gst_encode_bin_remove_element(encodebin, encodebin->color_space); + GST_WARNING_OBJECT(encodebin, "encodebin link video elements fail"); + return FALSE; + +audio_link_fail: + // remove element + gst_encode_bin_remove_element(encodebin, encodebin->audio_conv); + gst_encode_bin_remove_element(encodebin, encodebin->audio_sample); + GST_WARNING_OBJECT(encodebin, "encodebin link audio elements fail"); + return FALSE; + +image_link_fail: + // remove element + gst_encode_bin_remove_element(encodebin, encodebin->color_space); + GST_WARNING_OBJECT(encodebin, "encodebin link image elements fail"); + return FALSE; + + +} + +static gboolean +gst_encode_bin_unlink_elements (GstEncodeBin *encodebin) +{ + GstPad *pad = NULL, *muxpad = NULL; + + switch(encodebin->profile) { + case GST_ENCODE_BIN_PROFILE_AV : + if (encodebin->auto_color_space) { + if (encodebin->video_toggle) { + gst_element_unlink_many( + encodebin->video_queue, + encodebin->video_toggle, + encodebin->color_space, + encodebin->vcapsfilter, + encodebin->video_encode, + //encodebin->video_encode_queue, + NULL); + } else { + gst_element_unlink_many( + encodebin->video_queue, + encodebin->color_space, + encodebin->vcapsfilter, + encodebin->video_encode, + //encodebin->video_encode_queue, + NULL); + } + } else { + if (encodebin->video_toggle) { + gst_element_unlink_many( + encodebin->video_queue, + encodebin->video_toggle, + encodebin->vcapsfilter, + encodebin->video_encode, + //encodebin->video_encode_queue, + NULL); + } else { + gst_element_unlink_many( + encodebin->video_queue, + encodebin->vcapsfilter, + encodebin->video_encode, + //encodebin->video_encode_queue, + NULL); + } + } + + if(encodebin->mux_video_sinkpad != NULL) + { +#if 0 + if(encodebin->use_venc_queue) + { + gst_element_unlink(encodebin->video_encode, encodebin->video_encode_queue); + + pad = gst_element_get_static_pad (encodebin->video_encode_queue, "src"); + gst_pad_unlink(pad, muxpad); + gst_object_unref(pad); + pad = NULL; + + if ( g_signal_handler_is_connected ( encodebin->video_encode_queue, encodebin->veque_sig_id) ) + { + g_signal_handler_disconnect ( encodebin->video_encode_queue, encodebin->veque_sig_id ); + } + } +#else + if(encodebin->video_encode_queue) + { + gst_element_unlink(encodebin->video_encode, encodebin->video_encode_queue); + + pad = gst_element_get_static_pad (encodebin->video_encode_queue, "src"); + gst_pad_unlink(pad, encodebin->mux_video_sinkpad); + gst_object_unref(pad); + pad = NULL; + + if ( g_signal_handler_is_connected ( encodebin->video_encode_queue, encodebin->veque_sig_id) ) + { + g_signal_handler_disconnect ( encodebin->video_encode_queue, encodebin->veque_sig_id ); + } + } +#endif + else + { + pad = gst_element_get_static_pad (encodebin->video_encode, "src"); + gst_pad_unlink(pad, encodebin->mux_video_sinkpad); + gst_object_unref(pad); + pad = NULL; + } + + gst_element_release_request_pad(encodebin->mux, encodebin->mux_video_sinkpad); +// gst_object_unref(encodebin->mux_video_sinkpad); //*** + encodebin->mux_video_sinkpad = NULL; + } + + if(encodebin->vsink_probeid) + { + pad = gst_element_get_static_pad (encodebin->video_queue, "sink"); + gst_pad_remove_buffer_probe(pad, encodebin->vsink_probeid); + encodebin->vsink_probeid = 0; + gst_object_unref(pad); + pad = NULL; + } + + + if(encodebin->vsink_hs_probeid) + { + pad = gst_element_get_static_pad (encodebin->video_encode, "sink"); + gst_pad_remove_buffer_probe(pad, encodebin->vsink_hs_probeid); + encodebin->vsink_hs_probeid = 0; + gst_object_unref(pad); + pad = NULL; + } + + if(encodebin->audio_queue == NULL) + { + break; + } + case GST_ENCODE_BIN_PROFILE_AUDIO : + if (encodebin->auto_audio_convert ||encodebin->auto_audio_resample) { + if (!encodebin->auto_audio_convert) { + gst_element_unlink_many ( + encodebin->audio_queue, + encodebin->audio_sample, + encodebin->acapsfilter, + encodebin->audio_encode, + NULL); + } else if (!encodebin->auto_audio_resample) { + gst_element_unlink_many ( + encodebin->audio_queue, + encodebin->audio_conv, + encodebin->acapsfilter, + encodebin->audio_encode, + NULL); + } else { + gst_element_unlink_many ( + encodebin->audio_queue, + encodebin->audio_conv, + encodebin->audio_sample, + encodebin->acapsfilter, + encodebin->audio_encode, + NULL); + } + } + else { + gst_element_unlink_many ( + encodebin->audio_queue, + encodebin->acapsfilter, + encodebin->audio_encode, + NULL); + } + + if(encodebin->mux_audio_sinkpad != NULL) + { +#if 0 + if(encodebin->use_aenc_queue) + { + gst_element_unlink(encodebin->audio_encode, encodebin->audio_encode_queue); + + pad = gst_element_get_static_pad (encodebin->audio_encode_queue, "src"); + gst_pad_unlink(pad, muxpad); + gst_object_unref(pad); + pad = NULL; + + if ( g_signal_handler_is_connected ( encodebin->audio_encode_queue, encodebin->veque_sig_id) ) + { + g_signal_handler_disconnect ( encodebin->audio_encode_queue, encodebin->veque_sig_id ); + } + } +#else + if(encodebin->audio_encode_queue) + { + gst_element_unlink(encodebin->audio_encode, encodebin->audio_encode_queue); + + pad = gst_element_get_static_pad (encodebin->audio_encode_queue, "src"); + gst_pad_unlink(pad, encodebin->mux_audio_sinkpad); + gst_object_unref(pad); + pad = NULL; + + if ( g_signal_handler_is_connected ( encodebin->audio_encode_queue, encodebin->veque_sig_id) ) + { + g_signal_handler_disconnect ( encodebin->audio_encode_queue, encodebin->veque_sig_id ); + } + } +#endif + else + { + pad = gst_element_get_static_pad (encodebin->audio_encode, "src"); + gst_pad_unlink(pad, encodebin->mux_audio_sinkpad); + gst_object_unref(pad); + pad = NULL; + } + + gst_element_release_request_pad(encodebin->mux, encodebin->mux_audio_sinkpad); +// gst_object_unref(encodebin->mux_audio_sinkpad); //*** + encodebin->mux_audio_sinkpad = NULL; + } + + if(encodebin->asink_probeid) + { + pad = gst_element_get_static_pad (encodebin->audio_queue, "sink"); + gst_pad_remove_buffer_probe(pad, encodebin->asink_probeid); + encodebin->asink_probeid =0; + gst_object_unref(pad); + pad = NULL; + } + + break; + case GST_ENCODE_BIN_PROFILE_IMAGE : + if (encodebin->auto_color_space) { + gst_element_unlink_many ( + encodebin->image_queue, + encodebin->image_toggle, + encodebin->color_space, + encodebin->icapsfilter, + encodebin->image_encode, + NULL); + } + else { + gst_element_unlink_many ( + encodebin->image_queue, + encodebin->image_toggle, + encodebin->icapsfilter, + encodebin->image_encode, + NULL); + } + break; + default: + GST_WARNING_OBJECT(encodebin, "Invalid profile number = %d", encodebin->profile); + return FALSE; + break; + } + // gst_pad_set_active(encodebin->srcpad, TRUE); + return TRUE; + +} + +static gboolean +gst_encode_bin_init_video_elements (GstElement *element, gpointer user_data) +{ + GstEncodeBin *encodebin = GST_ENCODE_BIN (element); + + if(encodebin->profile != GST_ENCODE_BIN_PROFILE_AV) + return FALSE; + + if(encodebin->video_queue == NULL) { + encodebin->video_queue = gst_element_factory_make ("queue","video_queue"); + gst_bin_add (GST_BIN (element), encodebin->video_queue); + } + + if( encodebin->use_video_toggle ) + { + if( encodebin->video_toggle == NULL ) + { + encodebin->video_toggle = gst_element_factory_make ("toggle","video_toggle"); + gst_bin_add (GST_BIN (element), encodebin->video_toggle); + } + GST_INFO_OBJECT( encodebin, "Video toggle is Enabled" ); + } + else + { + GST_INFO_OBJECT( encodebin, "Video toggle is Disabled" ); + } + + if(encodebin->vcapsfilter == NULL) { + encodebin->vcapsfilter = gst_element_factory_make ("capsfilter","vcapsfilter"); + gst_bin_add (GST_BIN (element), encodebin->vcapsfilter); + } +#if 0 + encodebin->vcaps = gst_caps_new_simple("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), + "width", G_TYPE_INT, 320, + "height", G_TYPE_INT, 240, + "framerate", GST_TYPE_FRACTION, 30, 1, + NULL); + +#endif + if(encodebin->video_encode == NULL) { + encodebin->video_encode = gst_element_factory_make (encodebin->venc_name, "video_encode"); + gst_bin_add (GST_BIN (element), encodebin->video_encode); + } + +#if 0 + if(encodebin->video_encode_queue == NULL) { + encodebin->video_encode_queue = gst_element_factory_make ("queue", "video_encode_queue"); + gst_bin_add (GST_BIN (element), encodebin->video_encode_queue); + } + + g_object_set(G_OBJECT(encodebin->video_encode_queue), "max-size-bytes", (unsigned int)0, NULL); +#endif + + if(encodebin->mux == NULL) { + encodebin->mux = gst_element_factory_make (encodebin->mux_name, "mux"); + gst_bin_add (GST_BIN (element), encodebin->mux); + } + + if (!encodebin->video_encode +// || !encodebin->video_encode_queue + || !encodebin->mux + || !encodebin->video_queue + || !encodebin->vcapsfilter + || !encodebin->srcpad ) + { + GST_ERROR_OBJECT(encodebin, "Faild create element \n"); + return FALSE; + } + + if( encodebin->use_video_toggle && !encodebin->video_toggle ) + { + GST_ERROR_OBJECT(encodebin, "Faild create video toggle element \n"); + return FALSE; + } + +#if 0 + if (encodebin->auto_color_space && (encodebin->color_space == NULL)) { + encodebin->color_space = gst_element_factory_make ("ffmpegcolorspace","color_space"); + gst_bin_add (GST_BIN (element), encodebin->color_space); + } +#endif + return TRUE; +} + +static gboolean +gst_encode_bin_init_audio_elements (GstElement *element, gpointer user_data) +{ + GstEncodeBin *encodebin = GST_ENCODE_BIN (element); + + if(encodebin->profile > GST_ENCODE_BIN_PROFILE_AUDIO) + return FALSE; + + if(encodebin->audio_queue == NULL) { + encodebin->audio_queue = gst_element_factory_make ("queue","audio_queue"); + gst_bin_add (GST_BIN (element), encodebin->audio_queue); + } + + if(encodebin->acapsfilter == NULL) { + encodebin->acapsfilter = gst_element_factory_make ("capsfilter","acapsfilter"); + gst_bin_add (GST_BIN (element), encodebin->acapsfilter); + } +#if 0 +encodebin->acaps = gst_caps_new_simple("audio/x-raw-int", + "rate", G_TYPE_INT, 8000, + "channels", G_TYPE_INT, 2, + "depth", G_TYPE_INT, 16, + NULL); +#endif + + if(encodebin->audio_encode == NULL) { + encodebin->audio_encode = gst_element_factory_make (encodebin->aenc_name, "audio_encode"); + gst_bin_add (GST_BIN (element), encodebin->audio_encode); + } + + if(encodebin->mux == NULL) { + encodebin->mux = gst_element_factory_make (encodebin->mux_name, "mux"); + gst_bin_add (GST_BIN (element), encodebin->mux); + } + + if (!encodebin->audio_encode + || !encodebin->audio_queue + || !encodebin->mux + || !encodebin->acapsfilter + || !encodebin->srcpad ) + { + GST_ERROR_OBJECT(encodebin, "Faild create element \n"); + return FALSE; + } +#if 0 + if (encodebin->auto_audio_convert && (encodebin->audio_conv == NULL)) { + encodebin->audio_conv = gst_element_factory_make ("audioconvert","audio_conv"); + gst_bin_add (GST_BIN (element), encodebin->audio_conv); + } + + if (encodebin->auto_audio_resample && (encodebin->audio_sample == NULL)) { + encodebin->audio_sample = gst_element_factory_make ("audioresample","audio_sample"); + gst_bin_add (GST_BIN (element), encodebin->audio_sample); + } +#endif + return TRUE; +} + + +static gboolean +gst_encode_bin_init_image_elements (GstElement *element, gpointer user_data) +{ + GstEncodeBin *encodebin = GST_ENCODE_BIN (element); + + if(encodebin->profile < GST_ENCODE_BIN_PROFILE_IMAGE) + return FALSE; + + if(encodebin->image_queue == NULL) { + encodebin->image_queue = gst_element_factory_make ("queue","image_queue"); + gst_bin_add (GST_BIN (element), encodebin->image_queue); + } + + if(encodebin->image_toggle == NULL) { + encodebin->image_toggle = gst_element_factory_make ("toggle","image_toggle"); + gst_bin_add (GST_BIN (element), encodebin->image_toggle); + } + + if(encodebin->icapsfilter == NULL) { + encodebin->icapsfilter = gst_element_factory_make ("capsfilter","icapsfilter"); + gst_bin_add (GST_BIN (element), encodebin->icapsfilter); + } + + if(encodebin->image_encode == NULL) { + encodebin->image_encode = gst_element_factory_make (encodebin->ienc_name, "image_encode"); + gst_bin_add (GST_BIN (element), encodebin->image_encode); + } + + if (!encodebin->image_encode + || !encodebin->image_queue + || !encodebin->image_toggle + || !encodebin->icapsfilter + || !encodebin->srcpad ) + { + GST_ERROR_OBJECT(encodebin, "Faild create element \n"); + return FALSE; + } +#if 0 + if (encodebin->auto_color_space && (encodebin->color_space == NULL)) { + encodebin->color_space = gst_element_factory_make ("ffmpegcolorspace","color_space"); + gst_bin_add (GST_BIN (element), encodebin->color_space); + } +#endif + return TRUE; +} + +static gboolean gst_encode_bin_block(GstEncodeBin *encodebin, gboolean value) +{ + + if(value) { //block stream + switch(encodebin->profile) { + case GST_ENCODE_BIN_PROFILE_AV: + if(encodebin->audio_queue == NULL && encodebin->video_queue == NULL) { + goto block_fail; + } else { + if(g_object_class_find_property(G_OBJECT_GET_CLASS(GST_OBJECT(encodebin->video_queue)), + "empty-buffers") == NULL) { + GST_ERROR_OBJECT(encodebin, "The queue element doesn't support 'empty-buffers' property"); + goto block_fail; + } + if( encodebin->video_toggle ) + { + g_object_set(encodebin->video_toggle, "block-data", TRUE , NULL); + GST_INFO_OBJECT( encodebin, "video_toggle block-data TRUE" ); + } + + g_object_set(encodebin->video_queue, "empty-buffers", TRUE , NULL); + GST_INFO_OBJECT( encodebin, "video_queue empty-buffers TRUE" ); + if(encodebin->audio_queue != NULL) + { + g_object_set(encodebin->audio_queue, "empty-buffers", TRUE , NULL); + GST_INFO_OBJECT( encodebin, "audio_queue empty-buffers TRUE" ); + } + } + break; + case GST_ENCODE_BIN_PROFILE_AUDIO: + if(encodebin->audio_queue == NULL) { + goto block_fail; + } else { + if(g_object_class_find_property(G_OBJECT_GET_CLASS(GST_OBJECT(encodebin->audio_queue)), + "empty-buffers") == NULL) { + GST_ERROR_OBJECT(encodebin, "The queue element doesn't support 'empty-buffers' property"); + goto block_fail; + } + g_object_set(encodebin->audio_queue, "empty-buffers", TRUE , NULL); + GST_INFO_OBJECT( encodebin, "audio_queue empty-buffers TRUE" ); + } + break; + case GST_ENCODE_BIN_PROFILE_IMAGE: + if(encodebin->image_toggle == NULL) { + goto block_fail; + } else { + g_object_set(encodebin->image_toggle, "block_data", TRUE, NULL); + GST_INFO_OBJECT( encodebin, "image_toggle block_data TRUE" ); + } + break; + default: + GST_WARNING_OBJECT (encodebin,"Invalid profile number = %d", encodebin->profile); + goto block_fail; + break; + } + } else { //release blocked-stream + switch(encodebin->profile) { + case GST_ENCODE_BIN_PROFILE_AV: + if(encodebin->audio_queue == NULL && encodebin->video_queue == NULL) { + goto unblock_fail; + } else { + if(g_object_class_find_property(G_OBJECT_GET_CLASS(GST_OBJECT(encodebin->video_queue)), + "empty-buffers") == NULL) { + GST_ERROR_OBJECT(encodebin, "The queue element doesn't support 'empty-buffers' property"); + goto unblock_fail; + } + if( encodebin->video_toggle ) + { + g_object_set(encodebin->video_toggle, "block-data", FALSE , NULL); + GST_INFO_OBJECT( encodebin, "video_toggle block-data FALSE" ); + } + + if(encodebin->audio_queue != NULL) + { + g_object_set(encodebin->audio_queue, "empty-buffers", FALSE , NULL); + GST_INFO_OBJECT( encodebin, "audio_queue empty-buffers FALSE" ); + } + g_object_set(encodebin->video_queue, "empty-buffers", FALSE , NULL); + GST_INFO_OBJECT( encodebin, "video_queue empty-buffers FALSE" ); + } + break; + case GST_ENCODE_BIN_PROFILE_AUDIO: + if(encodebin->audio_queue == NULL) { + goto unblock_fail; + } else { + if(g_object_class_find_property(G_OBJECT_GET_CLASS(GST_OBJECT(encodebin->audio_queue)), + "empty-buffers") == NULL) { + GST_ERROR_OBJECT(encodebin, "The queue element doesn't support 'empty-buffers' property"); + goto unblock_fail; + } + g_object_set(encodebin->audio_queue, "empty-buffers", FALSE , NULL); + GST_INFO_OBJECT( encodebin, "audio_queue empty-buffers FALSE" ); + } + break; + case GST_ENCODE_BIN_PROFILE_IMAGE: + if(encodebin->image_toggle == NULL) { + goto unblock_fail; + } else { + g_object_set(encodebin->image_toggle, "block_data", FALSE, NULL); + GST_INFO_OBJECT( encodebin, "image_toggle block_data FALSE" ); + } + break; + default: + GST_WARNING_OBJECT (encodebin,"Invalid profile number = %d", encodebin->profile); + goto unblock_fail; + break; + } + } + encodebin->block = value; + return TRUE; + +block_fail: + GST_ERROR_OBJECT(encodebin, "encodebin block failed"); + return FALSE; + +unblock_fail: + GST_ERROR_OBJECT(encodebin, "encodebin unblock failed"); + return FALSE; +} + +static gboolean gst_encode_bin_pause(GstEncodeBin *encodebin, gboolean value) +{ + GstClock *clock = NULL; + + if(value) { + /* pause stream*/ + //Block src of encode bin + if (!gst_encode_bin_block(encodebin, TRUE)) + { + GST_WARNING_OBJECT (encodebin, "Fail to block Encodebin."); + goto pause_fail; + } + + if (encodebin->paused_time == 0) + { + //get steam time + if (clock = GST_ELEMENT_CLOCK(encodebin)) //before PLAYING, this would be NULL. Need to check. + { + GstClockTime current_time, base_time; + + current_time = gst_clock_get_time(clock); + base_time = gst_element_get_base_time(GST_ELEMENT(encodebin)); + + encodebin->paused_time = current_time - base_time; + + GST_INFO_OBJECT (encodebin, "Encodebin is in running-pause at [%"GST_TIME_FORMAT"]." + , GST_TIME_ARGS(encodebin->paused_time)); + } + else + { + encodebin->paused_time = 0; + encodebin->total_offset_time = 0; + + GST_WARNING_OBJECT (encodebin, "There is no clock in Encodebin."); + } + } +#if 0 //def GST_ENCODE_BIN_SIGNAL_ENABLE + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_PAUSE], 0, TRUE); +#endif + } + else { + /* release paused-stream*/ + if (encodebin->paused_time != 0) + { + if (clock = GST_ELEMENT_CLOCK(encodebin)) + { + GstClockTime current_time, base_time; + GstClockTime paused_gap; + + current_time = gst_clock_get_time(clock); + base_time = gst_element_get_base_time(GST_ELEMENT(encodebin)); + paused_gap = current_time - base_time - encodebin->paused_time; + + encodebin->total_offset_time += paused_gap; + encodebin->paused_time = 0; + + GST_INFO_OBJECT (encodebin, "Encodebin now resumes. Offset delay [%"GST_TIME_FORMAT"], Total offset delay [%"GST_TIME_FORMAT"]" + , GST_TIME_ARGS(paused_gap) , GST_TIME_ARGS(encodebin->total_offset_time)); + } + else + { + encodebin->paused_time = 0; + encodebin->total_offset_time = 0; + + GST_WARNING_OBJECT (encodebin, "There is no clock in Encodebin."); + } + } + + //TODO : How about qos? + + //Unblock src of encode bin + if (!gst_encode_bin_block(encodebin, FALSE)) + { + GST_WARNING_OBJECT (encodebin, "Fail to Unblock Encodebin."); + goto resume_fail; + } +#if 0 //def GST_ENCODE_BIN_SIGNAL_ENABLE + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_RESUME], 0, TRUE); +#endif + } + encodebin->pause = value; + return TRUE; + +pause_fail: + GST_WARNING_OBJECT (encodebin, "Fail to pause Encodebin"); +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_PAUSE], 0, FALSE); +#endif + return FALSE; + +resume_fail: + GST_WARNING_OBJECT (encodebin, "Fail to resume Encodebin"); +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + g_signal_emit (G_OBJECT (encodebin), gst_encode_bin_signals[SIGNAL_STREAM_RESUME], 0, FALSE); +#endif + return FALSE; +} + +static gboolean +gst_encode_bin_release_pipeline (GstElement *element, + gpointer user_data) +{ +#if 0 + GstEncodeBin *encodebin = GST_ENCODE_BIN (element); + + gst_element_set_state (encodebin->audio_queue, GST_STATE_NULL); + gst_element_set_state (encodebin->audio_encode, GST_STATE_NULL); + gst_element_set_state (encodebin->video_queue, GST_STATE_NULL); + gst_element_set_state (encodebin->video_encode, GST_STATE_NULL); + gst_element_set_state (encodebin->mux, GST_STATE_NULL); + + if (encodebin->auto_video_scale) { + gst_element_set_state (encodebin->video_scale, GST_STATE_NULL); + gst_element_unlink (encodebin->video_queue, encodebin->video_scale); + gst_element_unlink (encodebin->video_scale, encodebin->video_encode); + gst_bin_remove (GST_BIN (element), encodebin->video_scale); + + encodebin->video_scale = NULL; + } else { + gst_element_unlink (encodebin->video_queue, encodebin->video_encode); + } + + gst_pad_unlink (gst_element_get_pad (encodebin->audio_encode, "src"), + encodebin->mux_audio_sinkpad); + gst_pad_unlink (gst_element_get_pad (encodebin->video_encode, "src"), + encodebin->mux_video_sinkpad); + + gst_bin_remove_many (GST_BIN (element), + encodebin->audio_queue, + encodebin->audio_encode, + encodebin->video_queue, + encodebin->video_encode, + encodebin->mux, + NULL); + + encodebin->audio_queue = NULL; + encodebin->audio_encode = NULL; + encodebin->video_queue = NULL; + encodebin->video_encode = NULL; + encodebin->mux = NULL; +#endif + return TRUE; +} + +static gboolean +gst_encode_bin_audsink_set_caps (GstPad * pad, GstCaps * vscaps) +{ + GstEncodeBin *encodebin; + GstStructure *structure; +// const gchar *mimetype; +// const GValue *codec_data; + gint channels, rate; + + encodebin = GST_ENCODE_BIN (gst_pad_get_parent (pad)); + + structure = gst_caps_get_structure (vscaps, 0); +// mimetype = gst_structure_get_name (structure); + + /* we want these for all */ + if (!gst_structure_get_int (structure, "channels", &channels) || + !gst_structure_get_int (structure, "rate", &rate)) { + goto refuse_caps; + } + +// codec_data = gst_structure_get_value (structure, "codec_data"); + /* FIXME */ + // g_return_val_if_fail (!strcmp (mimetype, "audio/x-raw-int"), FALSE); + gst_object_unref (encodebin); + return TRUE; + +refuse_caps: + { + GST_WARNING_OBJECT (encodebin, "refused caps %" GST_PTR_FORMAT, vscaps); + gst_object_unref (encodebin); + return FALSE; + } +} + +static gboolean +gst_encode_bin_vidsink_set_caps (GstPad * pad, GstCaps * vscaps) +{ + GstEncodeBin *encodebin; + GstStructure *structure; +// const gchar *mimetype; + const GValue *fps; +// const GValue *codec_data; + gint width, height; + + encodebin = GST_ENCODE_BIN (gst_pad_get_parent (pad)); + + structure = gst_caps_get_structure (vscaps, 0); +// mimetype = gst_structure_get_name (structure); + + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) { + goto refuse_caps; + } + +// codec_data = gst_structure_get_value (structure, "codec_data"); + + fps = gst_structure_get_value (structure, "framerate"); + if (fps == NULL) + goto refuse_caps; + + encodebin->fps = gst_value_get_fraction_numerator(fps); + + if(encodebin->high_speed_fps > 0) + { + encodebin->multiple =(encodebin->high_speed_fps)/(encodebin->fps); + } + + { + guint32 format; + + gst_structure_get_fourcc (structure, "format", &format); + + switch (format) { + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + break; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + break; + } + } +/* FIXME */ +// g_return_val_if_fail (!strcmp (mimetype, "video/x-raw-yuv"), FALSE); + +#if 0 + switch (encodebin->profile) { + case GST_ENCODE_BIN_PROFILE_3GP: + // need_videoscale + break; + case GST_ENCODE_BIN_PROFILE_MP4: + break; + default : + break; + } +#endif + gst_object_unref (encodebin); + return TRUE; + +refuse_caps: + { + GST_WARNING_OBJECT (encodebin, "refused caps %" GST_PTR_FORMAT, vscaps); + gst_object_unref (encodebin); + return FALSE; + } +} + +static gboolean gst_encode_bin_imgsink_set_caps (GstPad * pad, GstCaps * vscaps) +{ + GstEncodeBin *encodebin; + GstStructure *structure; +// const gchar *mimetype; +// const GValue *codec_data; + gint width, height; + + encodebin = GST_ENCODE_BIN (gst_pad_get_parent (pad)); + + structure = gst_caps_get_structure (vscaps, 0); +// mimetype = gst_structure_get_name (structure); + + if (!gst_structure_get_int (structure, "width", &width) || + !gst_structure_get_int (structure, "height", &height)) { + goto refuse_caps; + } + +// codec_data = gst_structure_get_value (structure, "codec_data"); + + { + guint32 format; + + gst_structure_get_fourcc (structure, "format", &format); + + switch (format) { + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + break; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + break; + } + } + gst_object_unref (encodebin); + return TRUE; + +refuse_caps: + { + GST_WARNING_OBJECT (encodebin, "refused caps %" GST_PTR_FORMAT, vscaps); + gst_object_unref (encodebin); + return FALSE; + } + +} + +static gboolean +gst_encode_bin_video_probe(GstPad *pad, GstBuffer *buffer, GstEncodeBin *encodebin) +{ + if (!encodebin) + { + GST_WARNING_OBJECT (encodebin, "encodebin is Null."); + return TRUE; + } + + //Adjusting timestamp of video source + GST_BUFFER_TIMESTAMP(buffer) -= encodebin->total_offset_time; + + return TRUE; +} + +static gboolean +gst_encode_bin_video_probe_hs(GstPad *pad, GstBuffer *buffer, GstEncodeBin *encodebin) +{ + if (!encodebin) + { + GST_WARNING_OBJECT (encodebin, "encodebin is Null."); + return TRUE; + } + + GST_BUFFER_TIMESTAMP(buffer) *= encodebin->multiple; + return TRUE; +} + +static gboolean +gst_encode_bin_audio_probe(GstPad *pad, GstBuffer *buffer, GstEncodeBin *encodebin) +{ + if (!encodebin) + { + GST_WARNING_OBJECT (encodebin, "encodebin is Null."); + return TRUE; + } + + //Adjusting timestamp of video source + GST_BUFFER_TIMESTAMP(buffer) -= encodebin->total_offset_time; + + return TRUE; +} + +static GstPad* +gst_encode_bin_get_mux_sink_pad(GstElement *mux, GstEncodeBinMuxSinkPad type) +{ + GstElementClass *elemclass = NULL; + GList *walk = NULL; + GstPad *pad = NULL; + + elemclass = GST_ELEMENT_GET_CLASS (mux); + + walk = gst_element_class_get_pad_template_list (elemclass); + + while (walk) { + GstPadTemplate *templ; + + templ = (GstPadTemplate *) walk->data; + if (GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SINK) { + /* ENHANCE ME: Please add other specific mux's case */ + if (((type == ENCODEBIN_MUX_AUDIO_SINK) && strstr(GST_PAD_TEMPLATE_NAME_TEMPLATE (templ), "audio")) || //audio, audio_%d,... ex)ffmux_3gp + ((type == ENCODEBIN_MUX_VIDEO_SINK) && strstr(GST_PAD_TEMPLATE_NAME_TEMPLATE (templ), "video")) || //video, video_%d,... ex)ffmux_3gp + strstr(GST_PAD_TEMPLATE_NAME_TEMPLATE (templ), "sink") //sink, sink_%d, wavparse_sink, ... ex)oggmux, wavparse + ) { + g_print("PRINT TEMPLATE(%s)\n", GST_PAD_TEMPLATE_NAME_TEMPLATE (templ)); + pad = gst_element_get_request_pad (mux, GST_PAD_TEMPLATE_NAME_TEMPLATE (templ)); + break; + } + } + walk = g_list_next (walk); + } + + return pad; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gst_encode_bin_debug, "encodebin", 0, "encoder bin"); + +#ifdef ENABLE_NLS + GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE, + LOCALEDIR); + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); +#endif /* ENABLE_NLS */ + + return gst_element_register (plugin, "encodebin", GST_RANK_NONE, + GST_TYPE_ENCODE_BIN); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "encodebin", + "EXT encoder bin", + plugin_init, VERSION, "LGPL", "Samsung Electronics Co", "http://www.samsung.com/") diff --git a/mobile/encodebin/src/gstencodebin.h b/mobile/encodebin/src/gstencodebin.h new file mode 100644 index 0000000..136fc92 --- /dev/null +++ b/mobile/encodebin/src/gstencodebin.h @@ -0,0 +1,159 @@ +/* + * GStreamer encodebin + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_ENCODE_BIN_H__ +#define __GST_ENCODE_BIN_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_CAT_DEFAULT gst_encode_bin_debug + +#define GST_TYPE_ENCODE_BIN_PROFILE (gst_encode_bin_profile_get_type()) +GType gst_encode_bin_profile_get_type (void); + +#define GST_TYPE_ENCODE_BIN (gst_encode_bin_get_type()) +#define GST_ENCODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ENCODE_BIN,GstEncodeBin)) +#define GST_ENCODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ENCODE_BIN,GstEncodeBinClass)) +#define GST_IS_ENCODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ENCODE_BIN)) +#define GST_IS_ENCODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ENCODE_BIN)) + +#define GST_ENCODE_BIN_GET_LOCK(encodebin) (((GstEncodeBin*)encodebin)->mutex) +#define GST_ENCODE_BIN_LOCK(encodebin) g_mutex_lock (GST_ENCODE_BIN_GET_LOCK(encodebin)) +#define GST_ENCODE_BIN_UNLOCK(encodebin) g_mutex_unlock (GST_ENCODE_BIN_GET_LOCK(encodebin)) + +/* Signal enable */ +#define GST_ENCODE_BIN_SIGNAL_ENABLE + +typedef struct _GstEncodeBinPad { + GstCollectData *collect; + + gboolean is_video; + gboolean connected; + + gchar *tag; + + gst_riff_strh hdr; +} GstEncodeBinPad; + +typedef struct _GstEncodeBin GstEncodeBin; +typedef struct _GstEncodeBinClass GstEncodeBinClass; + +struct _GstEncodeBin +{ + GstBin bin; /* we extend GstBin */ + + GMutex *mutex; + + /* pads */ + GstPad *srcpad; + GstPad *video_sinkpad; + GstPad *audio_sinkpad; + GstPad *image_sinkpad; + GstPad *mux_audio_sinkpad; + GstPad *mux_video_sinkpad; + + /* sinkpads, video first */ + GSList *sinkpads; + + /* video restricted to 1 pad */ + guint video_pads, audio_pads; + + gint profile; + gint fps; + gint high_speed_fps; + gint multiple; + gchar *venc_name; + gchar *aenc_name; + gchar *ienc_name; + gchar *mux_name; + gchar *vconv_name; + + GstCaps *vcaps; + GstCaps *acaps; + GstCaps *icaps; + + gboolean auto_audio_convert; + gboolean auto_audio_resample; + gboolean auto_color_space; + gboolean block; + gboolean pause; + gboolean use_video_toggle; + gboolean use_venc_queue; + gboolean use_aenc_queue; + + GstElement *audio_queue; + GstElement *video_queue; + GstElement *video_encode_queue; + GstElement *audio_encode_queue; + GstElement *image_queue; + + GstElement *audio_encode; + GstElement *video_encode; + GstElement *image_encode; + + GstElement *vcapsfilter; + GstElement *acapsfilter; + GstElement *icapsfilter; + + GstElement *video_toggle; + GstElement *image_toggle; + GstElement *color_space; + GstElement *audio_conv; + GstElement *audio_sample; + + GstElement *mux; + + /* pause/resume variables */ + GstClockTime paused_time; /* pipeline time when pausing */ + GstClockTime total_offset_time; /* delayed time which is due to pause */ + gulong vsink_probeid; + gulong vsink_hs_probeid; + gulong asink_probeid; + gulong veque_sig_id; + gulong aeque_sig_id; +}; + +struct _GstEncodeBinClass +{ + GstBinClass parent_class; + +#ifdef GST_ENCODE_BIN_SIGNAL_ENABLE + /* signal we fire when stream block/pause function called */ + void (*stream_block) (GstElement * element, gboolean result); + void (*stream_unblock) (GstElement * element, gboolean result); + void (*stream_pause) (GstElement * element, gboolean result); + void (*stream_resume) (GstElement * element, gboolean result); +#endif + +}; + +GType gst_encode_bin_get_type (void); + +G_END_DECLS + + +#endif /* __GST_ENCODE_BIN_H__ */ diff --git a/mobile/evasimagesink/Makefile.am b/mobile/evasimagesink/Makefile.am new file mode 100644 index 0000000..308a09c --- /dev/null +++ b/mobile/evasimagesink/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/evasimagesink/src/Makefile.am b/mobile/evasimagesink/src/Makefile.am new file mode 100644 index 0000000..8521916 --- /dev/null +++ b/mobile/evasimagesink/src/Makefile.am @@ -0,0 +1,26 @@ +# Note: plugindir is set in configure + +############################################################################## +# TODO: change libgstevasimagesink.la to something else, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstevasimagesink.la + +############################################################################## +# TODO: for the next set of variables, name the prefix if you named the .la, # +# e.g. libmysomething.la => libmysomething_la_SOURCES # +# libmysomething_la_CFLAGS # +# libmysomething_la_LIBADD # +# libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstevasimagesink_la_SOURCES = gstevasimagesink.c gstevasimagesink.h + +# compiler and linker flags used to compile this plugin, set in configure.ac +libgstevasimagesink_la_CFLAGS = $(GST_CFLAGS) $(GST_VIDEO_CFLAGS) $(EFL_CFLAGS) $(MMTA_CFLAGS) +libgstevasimagesink_la_LIBADD = $(GST_LIBS) $(GST_VIDEO_LIBS) $(EFL_LIBS) $(MMTA_LIBS) +libgstevasimagesink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstevasimagesink_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = gstevasimagesink.h diff --git a/mobile/evasimagesink/src/gstevasimagesink.c b/mobile/evasimagesink/src/gstevasimagesink.c new file mode 100644 index 0000000..0647bf6 --- /dev/null +++ b/mobile/evasimagesink/src/gstevasimagesink.c @@ -0,0 +1,684 @@ +/* + * evasimagesink + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Sangchul Lee + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/** + * SECTION:element-evasimagesink + * Gstreamer Evas Video Sink - draw video on the given Evas Image Object + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "gstevasimagesink.h" + +#define CAP_WIDTH "width" +#define CAP_HEIGHT "height" + +GST_DEBUG_CATEGORY_STATIC (gst_evas_image_sink_debug); +#define GST_CAT_DEFAULT gst_evas_image_sink_debug + +/* Enumerations */ +enum +{ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_EVAS_OBJECT, + PROP_EVAS_OBJECT_SHOW +}; + +enum +{ + UPDATE_FALSE, + UPDATE_TRUE +}; + +#define COLOR_DEPTH 4 +#define GL_X11_ENGINE "gl_x11" +#define DO_RENDER_FROM_FIMC 1 +#define SIZE_FOR_UPDATE_VISIBILITY sizeof(gchar) + +#define EVASIMAGESINK_SET_EVAS_OBJECT_EVENT_CALLBACK( x_evas_image_object, x_usr_data ) \ +do \ +{ \ + if (x_evas_image_object) { \ + evas_object_event_callback_add (x_evas_image_object, EVAS_CALLBACK_DEL, evas_callback_del_event, x_usr_data); \ + evas_object_event_callback_add (x_evas_image_object, EVAS_CALLBACK_RESIZE, evas_callback_resize_event, x_usr_data); \ + } \ +}while(0) + +#define EVASIMAGESINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK( x_evas_image_object ) \ +do \ +{ \ + if (x_evas_image_object) { \ + evas_object_event_callback_del (x_evas_image_object, EVAS_CALLBACK_DEL, evas_callback_del_event); \ + evas_object_event_callback_del (x_evas_image_object, EVAS_CALLBACK_RESIZE, evas_callback_resize_event); \ + } \ +}while(0) + +GMutex *instance_lock; +guint instance_lock_count; + +static inline gboolean +is_evas_image_object (Evas_Object *obj) +{ + const char *type; + if (!obj) { + return FALSE; + } + type = evas_object_type_get (obj); + if (!type) { + return FALSE; + } + if (strcmp (type, "image") == 0) { + return TRUE; + } + return FALSE; +} + +/* the capabilities of the inputs. + * + * BGRx format + */ +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx)); + +GST_BOILERPLATE (GstEvasImageSink, gst_evas_image_sink, GstVideoSink, GST_TYPE_VIDEO_SINK); + +static void gst_evas_image_sink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); +static void gst_evas_image_sink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); +static gboolean gst_evas_image_sink_set_caps (GstBaseSink *base_sink, GstCaps *caps); +static GstFlowReturn gst_evas_image_sink_show_frame (GstVideoSink *video_sink, GstBuffer *buf); +static gboolean gst_evas_image_sink_event (GstBaseSink *sink, GstEvent *event); +static GstStateChangeReturn gst_evas_image_sink_change_state (GstElement *element, GstStateChange transition); +static void evas_callback_del_event (void *data, Evas *e, Evas_Object *obj, void *event_info); +static void evas_callback_resize_event (void *data, Evas *e, Evas_Object *obj, void *event_info); + +static void +gst_evas_image_sink_base_init (gpointer gclass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_set_details_simple (element_class, + "EvasImageSink", + "VideoSink", + "Video sink element for evas image object", + "Samsung Electronics "); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); +} + +static void +gst_evas_image_sink_class_init (GstEvasImageSinkClass *klass) +{ + GObjectClass *gobject_class; + GstBaseSinkClass *gstbasesink_class; + GstVideoSinkClass *gstvideosink_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstbasesink_class = GST_BASE_SINK_CLASS (klass); + gstvideosink_class = GST_VIDEO_SINK_CLASS (klass); + gstelement_class = (GstElementClass *) klass; + + gobject_class->set_property = gst_evas_image_sink_set_property; + gobject_class->get_property = gst_evas_image_sink_get_property; + + g_object_class_install_property (gobject_class, PROP_EVAS_OBJECT, + g_param_spec_pointer ("evas-object", "Destination Evas Object", "Destination evas image object", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_EVAS_OBJECT_SHOW, + g_param_spec_boolean ("visible", "Show Evas Object", "When disabled, evas object does not show", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gstvideosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_evas_image_sink_show_frame); + gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_evas_image_sink_set_caps); + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_evas_image_sink_event); + gstelement_class->change_state = GST_DEBUG_FUNCPTR(gst_evas_image_sink_change_state); +} + +static void +gst_evas_image_sink_fini (gpointer data, GObject *obj) +{ + GST_DEBUG ("[ENTER]"); + + GstEvasImageSink *esink = GST_EVASIMAGESINK (obj); + if (!esink) { + return; + } + if (esink->oldbuf) { + gst_buffer_unref (esink->oldbuf); + } + + if (esink->eo) { + evas_object_image_data_set(esink->eo, NULL); + } + + g_mutex_lock (instance_lock); + instance_lock_count--; + g_mutex_unlock (instance_lock); + if (instance_lock_count == 0) { + g_mutex_free (instance_lock); + instance_lock = NULL; + } + + GST_DEBUG ("[LEAVE]"); +} + +static void +evas_image_sink_cb_pipe (void *data, void *buffer, unsigned int nbyte) +{ + GstBuffer *buf; + GstEvasImageSink *esink = data; + void *img_data; + + GST_DEBUG ("[ENTER]"); + + if (!esink || !esink->eo) { + return; + } + if (nbyte == SIZE_FOR_UPDATE_VISIBILITY) { + if(!esink->object_show) { + evas_object_hide(esink->eo); + GST_INFO ("object hide.."); + } else { + evas_object_show(esink->eo); + GST_INFO ("object show.."); + } + GST_DEBUG ("[LEAVE]"); + return; + } + if (!buffer || nbyte != sizeof (GstBuffer *)) { + return; + } + + memcpy (&buf, buffer, sizeof (GstBuffer *)); + if (!buf) { + GST_ERROR ("There is no buffer"); + return; + } + if (esink->present_data_addr == -1) { + /* if present_data_addr is -1, we don't use this member variable */ + } else if (esink->present_data_addr != DO_RENDER_FROM_FIMC) { + GST_WARNING ("skip rendering this buffer, present_data_addr:%d, DO_RENDER_FROM_FIMC:%d", esink->present_data_addr, DO_RENDER_FROM_FIMC); + return; + } + + MMTA_ACUM_ITEM_BEGIN("eavsimagesink _cb_pipe total", FALSE); + + if ( !esink->is_evas_object_size_set && esink->w > 0 && esink->h > 0) { + evas_object_image_size_set (esink->eo, esink->w, esink->h); + GST_DEBUG("evas_object_image_size_set(), width(%d),height(%d)",esink->w,esink->h); + esink->is_evas_object_size_set = TRUE; + } + if (esink->gl_zerocopy) { + img_data = evas_object_image_data_get (esink->eo, EINA_TRUE); + if (!img_data || !GST_BUFFER_DATA(buf)) { + GST_WARNING ("Cannot get image data from evas object or cannot get gstbuffer data"); + evas_object_image_data_set(esink->eo, img_data); + } else { + GST_DEBUG ("img_data(%x), GST_BUFFER_DATA(buf):%x, esink->w(%d),esink->h(%d), esink->eo(%x)",img_data,GST_BUFFER_DATA(buf),esink->w,esink->h,esink->eo); + __ta__("evasimagesink memcpy in _cb_pipe", memcpy (img_data, GST_BUFFER_DATA (buf), esink->w * esink->h * COLOR_DEPTH);); + evas_object_image_pixels_dirty_set (esink->eo, 1); + evas_object_image_data_set(esink->eo, img_data); + } + gst_buffer_unref (buf); + } else { + GST_DEBUG ("GST_BUFFER_DATA(buf):%x, esink->eo(%x)",GST_BUFFER_DATA(buf),esink->eo); + evas_object_image_data_set (esink->eo, GST_BUFFER_DATA (buf)); + evas_object_image_pixels_dirty_set (esink->eo, 1); + if (esink->oldbuf) { + gst_buffer_unref(esink->oldbuf); + } + esink->oldbuf = buf; + } + + MMTA_ACUM_ITEM_END("eavsimagesink _cb_pipe total", FALSE); + + GST_DEBUG ("[LEAVE]"); +} + +static void +gst_evas_image_sink_init (GstEvasImageSink *esink, GstEvasImageSinkClass *gclass) +{ + GST_DEBUG ("[ENTER]"); + + esink->eo = NULL; + esink->epipe = NULL; + esink->object_show = FALSE; + esink->update_visibility = UPDATE_FALSE; + esink->gl_zerocopy = FALSE; + esink->is_evas_object_size_set = FALSE; + esink->present_data_addr = -1; + + if(!instance_lock) { + instance_lock = g_mutex_new(); + } + g_mutex_lock (instance_lock); + instance_lock_count++; + g_mutex_unlock (instance_lock); + + g_object_weak_ref (G_OBJECT (esink), gst_evas_image_sink_fini, NULL); + + GST_DEBUG ("[LEAVE]"); +} + +static void +evas_callback_del_event (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + GST_DEBUG ("[ENTER]"); + + GstEvasImageSink *esink = data; + if (!esink) { + return; + } + + EVASIMAGESINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK (esink->eo); + if (esink->oldbuf) { + gst_buffer_unref (esink->oldbuf); + esink->oldbuf = NULL; + } + + if (esink->eo) { + evas_object_image_data_set(esink->eo, NULL); + esink->eo = NULL; + } + + GST_DEBUG ("[LEAVE]"); +} + +static void +evas_callback_resize_event (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int w = 0; + int h = 0; + + GST_DEBUG ("[ENTER]"); + + GstEvasImageSink *esink = data; + if (!esink) { + return; + } + + evas_object_geometry_get(esink->eo, NULL, NULL, &w, &h); + if (!w || !h) { + GST_WARNING ("evas object size (w:%d,h:%d) was not set",w,h); + } else { + evas_object_image_fill_set(esink->eo, 0, 0, w, h); + GST_DEBUG ("evas object fill set (w:%d,h:%d)",w,h); + } + + GST_DEBUG ("[LEAVE]"); +} + +static int +evas_image_sink_get_size_from_caps (GstCaps *caps, int *w, int *h) +{ + gboolean r; + int width, height; + GstStructure *s; + + if (!caps || !w || !h) { + return -1; + } + s = gst_caps_get_structure (caps, 0); + if (!s) { + return -1; + } + + r = gst_structure_get_int (s, CAP_WIDTH, &width); + if (r == FALSE) { + return -1; + } + + r = gst_structure_get_int (s, CAP_HEIGHT, &height); + if (r == FALSE) { + return -1; + } + + *w = width; + *h = height; + return 0; +} + +static gboolean +is_zerocopy_supported (Evas *e) +{ + Eina_List *engines, *l; + int cur_id; + int id; + char *name; + + if (!e) { + return FALSE; + } + + engines = evas_render_method_list (); + if (!engines) { + return FALSE; + } + + cur_id = evas_output_method_get (e); + + EINA_LIST_FOREACH (engines, l, name) { + id = evas_render_method_lookup (name); + if (name && id == cur_id) { + if (!strcmp (name, GL_X11_ENGINE)) { + return TRUE; + } + break; + } + } + return FALSE; +} + +static int +evas_image_sink_event_parse_data (GstEvasImageSink *esink, GstEvent *event) +{ + const GstStructure *st; + guint st_data_addr = 0; + gint st_data_width = 0; + gint st_data_height = 0; + + g_return_val_if_fail (event != NULL, FALSE); + g_return_val_if_fail (esink != NULL, FALSE); + + if (GST_EVENT_TYPE (event) != GST_EVENT_CUSTOM_DOWNSTREAM_OOB) { + GST_WARNING ("it's not a custom downstream oob event"); + return -1; + } + st = gst_event_get_structure (event); + if (st == NULL || !gst_structure_has_name (st, "GstStructureForCustomEvent")) { + GST_WARNING ("structure in a given event is not proper"); + return -1; + } + if (!gst_structure_get_uint (st, "data-addr", &st_data_addr)) { + GST_WARNING ("parsing data-addr failed"); + return -1; + } + esink->present_data_addr = st_data_addr; + + return 0; +} + +static gboolean +gst_evas_image_sink_event (GstBaseSink *sink, GstEvent *event) +{ + GstEvasImageSink *esink = GST_EVASIMAGESINK (sink); + GstMessage *msg; + gchar *str; + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + GST_DEBUG ("GST_EVENT_FLUSH_START"); + break; + case GST_EVENT_FLUSH_STOP: + GST_DEBUG ("GST_EVENT_FLUSH_STOP"); + break; + case GST_EVENT_EOS: + GST_DEBUG ("GST_EVENT_EOS"); + break; + case GST_EVENT_CUSTOM_DOWNSTREAM_OOB: + if(!evas_image_sink_event_parse_data(esink, event)) { + GST_DEBUG ("GST_EVENT_CUSTOM_DOWNSTREAM_OOB, present_data_addr:%x",esink->present_data_addr); + } else { + GST_ERROR ("evas_image_sink_event_parse_data() failed"); + } + break; + default: + break; + } + if (GST_BASE_SINK_CLASS (parent_class)->event) { + return GST_BASE_SINK_CLASS (parent_class)->event (sink, event); + } else { + return TRUE; + } +} + +static GstStateChangeReturn +gst_evas_image_sink_change_state (GstElement *element, GstStateChange transition) +{ + GstStateChangeReturn ret_state = GST_STATE_CHANGE_SUCCESS; + GstEvasImageSink *esink = NULL; + esink = GST_EVASIMAGESINK(element); + int ret = 0; + + if(!esink) { + GST_ERROR("can not get evasimagesink from element"); + return GST_STATE_CHANGE_FAILURE; + } + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + GST_INFO ("*** STATE_CHANGE_NULL_TO_READY ***"); + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_INFO ("*** STATE_CHANGE_READY_TO_PAUSED ***"); + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + GST_INFO ("*** STATE_CHANGE_PAUSED_TO_PLAYING ***"); + break; + default: + break; + } + + ret_state = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + GST_INFO ("*** STATE_CHANGE_PLAYING_TO_PAUSED ***"); + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + GST_INFO ("*** STATE_CHANGE_PAUSED_TO_READY ***"); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + GST_INFO ("*** STATE_CHANGE_READY_TO_NULL ***"); + EVASIMAGESINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK (esink->eo); + if (esink->epipe) { + ecore_pipe_del (esink->epipe); + esink->epipe = NULL; + } + break; + default: + break; + } + + return ret_state; +} + +static void +gst_evas_image_sink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GstEvasImageSink *esink = GST_EVASIMAGESINK (object); + Evas_Object *eo; + + g_mutex_lock (instance_lock); + + switch (prop_id) { + case PROP_EVAS_OBJECT: + eo = g_value_get_pointer (value); + if (is_evas_image_object (eo)) { + if (eo != esink->eo) { + Eina_Bool r; + + /* delete evas object callbacks registrated on a previous evas image object */ + EVASIMAGESINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK (esink->eo); + esink->eo = eo; + /* add evas object callbacks on a new evas image object */ + EVASIMAGESINK_SET_EVAS_OBJECT_EVENT_CALLBACK (esink->eo, esink); + + esink->gl_zerocopy = is_zerocopy_supported (evas_object_evas_get (eo)); + if (esink->gl_zerocopy) { + evas_object_image_content_hint_set (esink->eo, EVAS_IMAGE_CONTENT_HINT_DYNAMIC); + GST_DEBUG("Enable gl zerocopy"); + } + GST_DEBUG("Evas Image Object(%x) is set",esink->eo); + esink->is_evas_object_size_set = FALSE; + if (!esink->epipe) { + esink->epipe = ecore_pipe_add (evas_image_sink_cb_pipe, esink); + if (!esink->epipe) { + GST_ERROR ("ecore-pipe create failed"); + break; + } + } + } + } else { + GST_ERROR ("Cannot set evas-object property: value is not an evas image object"); + } + break; + + case PROP_EVAS_OBJECT_SHOW: + { + Eina_Bool r; + esink->object_show = g_value_get_boolean (value); + if( !is_evas_image_object(esink->eo) ) { + GST_WARNING ("Cannot apply visible(show-object) property: cannot get an evas object\n"); + break; + } + esink->update_visibility = UPDATE_TRUE; + if (!esink->epipe) { + esink->epipe = ecore_pipe_add (evas_image_sink_cb_pipe, esink); + if (!esink->epipe) { + GST_ERROR ("ecore-pipe create failed"); + break; + } + } + r = ecore_pipe_write (esink->epipe, &esink->update_visibility, SIZE_FOR_UPDATE_VISIBILITY); + if (r == EINA_FALSE) { + GST_WARNING ("Failed to ecore_pipe_write() for updating visibility)\n"); + } + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + + g_mutex_unlock (instance_lock); +} + +static void +gst_evas_image_sink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GstEvasImageSink *esink = GST_EVASIMAGESINK (object); + + switch (prop_id) { + case PROP_EVAS_OBJECT: + g_value_set_pointer (value, esink->eo); + break; + case PROP_EVAS_OBJECT_SHOW: + g_value_set_boolean (value, esink->object_show); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_evas_image_sink_set_caps (GstBaseSink *base_sink, GstCaps *caps) +{ + int r; + int w, h; + GstEvasImageSink *esink = GST_EVASIMAGESINK (base_sink); + + esink->is_evas_object_size_set = FALSE; + r = evas_image_sink_get_size_from_caps (caps, &w, &h); + if (!r) { + esink->w = w; + esink->h = h; + GST_DEBUG ("set size w(%d), h(%d)", w, h); + } + return TRUE; +} + +static GstFlowReturn +gst_evas_image_sink_show_frame (GstVideoSink *video_sink, GstBuffer *buf) +{ + GstEvasImageSink *esink = GST_EVASIMAGESINK (video_sink); + Eina_Bool r; + + g_mutex_lock (instance_lock); + if (esink->present_data_addr == -1) { + /* if present_data_addr is -1, we don't use this member variable */ + } else if (esink->present_data_addr != DO_RENDER_FROM_FIMC) { + GST_WARNING ("skip rendering this buffer, present_data_addr:%d, DO_RENDER_FROM_FIMC:%d", esink->present_data_addr, DO_RENDER_FROM_FIMC); + g_mutex_unlock (instance_lock); + return GST_FLOW_OK; + } + if (!esink->epipe) { + esink->epipe = ecore_pipe_add (evas_image_sink_cb_pipe, esink); + if (!esink->epipe) { + GST_ERROR ("ecore-pipe create failed"); + g_mutex_unlock (instance_lock); + return GST_FLOW_ERROR; + } + } + + gst_buffer_ref (buf); + __ta__("evasimagesink ecore_pipe_write", r = ecore_pipe_write (esink->epipe, &buf, sizeof (GstBuffer *));); + if (r == EINA_FALSE) { + gst_buffer_unref (buf); + } + GST_DEBUG ("ecore_pipe_write() was called with GST_BUFFER_DATA(buf):%x", GST_BUFFER_DATA(buf)); + + g_mutex_unlock (instance_lock); + return GST_FLOW_OK; +} + +static gboolean +evas_image_sink_init (GstPlugin *evasimagesink) +{ + GST_DEBUG_CATEGORY_INIT (gst_evas_image_sink_debug, "evasimagesink", 0, "Evas image object based videosink"); + + return gst_element_register (evasimagesink, "evasimagesink", GST_RANK_NONE, GST_TYPE_EVASIMAGESINK); +} + +#ifndef PACKAGE +#define PACKAGE "gstevasimagesink-plugin-package" +#endif + +GST_PLUGIN_DEFINE ( + GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "evasimagesink", + "Evas image object based videosink", + evas_image_sink_init, + VERSION, + "LGPL", + "Samsung Electronics Co", + "http://www.samsung.com/" +) diff --git a/mobile/evasimagesink/src/gstevasimagesink.h b/mobile/evasimagesink/src/gstevasimagesink.h new file mode 100644 index 0000000..09c8102 --- /dev/null +++ b/mobile/evasimagesink/src/gstevasimagesink.h @@ -0,0 +1,77 @@ +/* + * evasimagesink + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Sangchul Lee + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_EVASIMAGESINK_H__ +#define __GST_EVASIMAGESINK_H__ + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +/* #defines don't like whitespacey bits */ +#define GST_TYPE_EVASIMAGESINK \ + (gst_evas_image_sink_get_type()) +#define GST_EVASIMAGESINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EVASIMAGESINK,GstEvasImageSink)) +#define GST_EVASIMAGESINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EVASIMAGESINK,GstEvasImageSinkClass)) +#define GST_IS_EVASIMAGESINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EVASIMAGESINK)) +#define GST_IS_EVASIMAGESINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EVASIMAGESINK)) + +typedef struct _GstEvasImageSink GstEvasImageSink; +typedef struct _GstEvasImageSinkClass GstEvasImageSinkClass; + +struct _GstEvasImageSink +{ + GstVideoSink element; + + Evas_Object *eo; + Ecore_Pipe *epipe; + Evas_Coord w; + Evas_Coord h; + gboolean object_show; + gchar update_visibility; + gboolean gl_zerocopy; + + GstBuffer *oldbuf; + + gboolean is_evas_object_size_set; + guint present_data_addr; +}; + +struct _GstEvasImageSinkClass +{ + GstVideoSinkClass parent_class; +}; + +GType gst_evas_image_sink_get_type (void); + +G_END_DECLS + +#endif /* __GST_EVASIMAGESINK_H__ */ diff --git a/mobile/evaspixmapsink/Makefile.am b/mobile/evaspixmapsink/Makefile.am new file mode 100644 index 0000000..f05ccbd --- /dev/null +++ b/mobile/evaspixmapsink/Makefile.am @@ -0,0 +1,15 @@ +plugin_LTLIBRARIES = libgstevaspixmapsink.la + +libgstevaspixmapsink_la_SOURCES = evaspixmapsink.c +libgstevaspixmapsink_la_CFLAGS = $(GST_CFLAGS) $(X_CFLAGS) $(EFL_CFLAGS) $(MMTA_CFLAGS) \ + $(XFIXES_CFLAGS) $(DRI2PROTO_CFLAGS) $(DRI2_CFLAGS) $(X11_CFLAGS) $(XDAMAGE_CFLAGS) $(XV_CFLAGS) $(TBM_CFLAGS) +libgstevaspixmapsink_la_LIBADD = \ + $(GST_LIBS) -lgstvideo-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ + $(X_LIBS) $(XVIDEO_LIBS) $(XSHM_LIBS) $(LIBM) \ + $(EFL_LIBS) \ + $(MMTA_LIBS) \ + $(XFIXES_LIBS) $(DRI2PROTO_LIBS) $(DRI2_LIBS) $(X11_LIBS) $(XDAMAGE_LIBS) $(XV_LIBS) $(TBM_LIBS) +libgstevaspixmapsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstxvimagesink_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = evaspixmapsink.h diff --git a/mobile/evaspixmapsink/evaspixmapsink.c b/mobile/evaspixmapsink/evaspixmapsink.c new file mode 100644 index 0000000..8d62714 --- /dev/null +++ b/mobile/evaspixmapsink/evaspixmapsink.c @@ -0,0 +1,4432 @@ +/* + * EvasPixmapSink + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Sangchul Lee + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* Our interfaces */ +#include +#include +#include +/* Helper functions */ +#include + +/* Object header */ +#include "evaspixmapsink.h" + +#include + +/* Samsung extension headers */ +/* For xv extension header for buffer transfer (output) */ +#include "xv_types.h" + +/* headers for drm */ +#include +#include +#include +#include +#include +#include +#include + +/* max channel count *********************************************************/ +#define SCMN_IMGB_MAX_PLANE (4) + +/* image buffer definition *************************************************** + + +------------------------------------------+ --- + | | ^ + | a[], p[] | | + | +---------------------------+ --- | | + | | | ^ | | + | |<---------- w[] ---------->| | | | + | | | | | | + | | | | + | | | h[] | e[] + | | | | + | | | | | | + | | | | | | + | | | v | | + | +---------------------------+ --- | | + | | v + +------------------------------------------+ --- + + |<----------------- s[] ------------------>| +*/ + +typedef struct +{ + /* width of each image plane */ + int w[SCMN_IMGB_MAX_PLANE]; + /* height of each image plane */ + int h[SCMN_IMGB_MAX_PLANE]; + /* stride of each image plane */ + int s[SCMN_IMGB_MAX_PLANE]; + /* elevation of each image plane */ + int e[SCMN_IMGB_MAX_PLANE]; + /* user space address of each image plane */ + void *a[SCMN_IMGB_MAX_PLANE]; + /* physical address of each image plane, if needs */ + void *p[SCMN_IMGB_MAX_PLANE]; + /* color space type of image */ + int cs; + /* left postion, if needs */ + int x; + /* top position, if needs */ + int y; + /* to align memory */ + int __dummy2; + /* arbitrary data */ + int data[16]; + /* dma buf fd */ + int dma_buf_fd[SCMN_IMGB_MAX_PLANE]; + /* buffer share method */ + int buf_share_method; + /* Y plane size in case of ST12 */ + int y_size; + /* UV plane size in case of ST12 */ + int uv_size; + /* Tizen buffer object */ + void *bo[SCMN_IMGB_MAX_PLANE]; + /* JPEG data */ + void *jpeg_data; + /* JPEG size */ + int jpeg_size; + /* TZ memory buffer */ + int tz_enable; +} SCMN_IMGB; + +/* Debugging category */ +#include +GST_DEBUG_CATEGORY_STATIC (gst_debug_evaspixmapsink); +#define GST_CAT_DEFAULT gst_debug_evaspixmapsink +GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE); + +enum { + UPDATE_FALSE, + UPDATE_TRUE +}; + +enum { + DEGREE_0, + DEGREE_90, + DEGREE_180, + DEGREE_270, + DEGREE_NUM, +}; + +enum { + DISP_GEO_METHOD_LETTER_BOX = 0, + DISP_GEO_METHOD_ORIGIN_SIZE, + DISP_GEO_METHOD_FULL_SCREEN, + DISP_GEO_METHOD_CROPPED_FULL_SCREEN, + DISP_GEO_METHOD_CUSTOM_ROI, + DISP_GEO_METHOD_NUM, +}; + +enum { + FLIP_NONE = 0, + FLIP_HORIZONTAL, + FLIP_VERTICAL, + FLIP_BOTH, + FLIP_NUM, +}; + +#define DEF_DISPLAY_GEOMETRY_METHOD DISP_GEO_METHOD_LETTER_BOX +#define DEF_DISPLAY_FLIP FLIP_NONE +#define GST_TYPE_EVASPIXMAPSINK_FLIP (gst_evaspixmapsink_flip_get_type()) +#define GST_TYPE_EVASPIXMAPSINK_ROTATE_ANGLE (gst_evaspixmapsink_rotate_angle_get_type()) +#define GST_TYPE_EVASPIXMAPSINK_DISPLAY_GEOMETRY_METHOD (gst_evaspixmapsink_display_geometry_method_get_type()) +#define SIZE_FOR_UPDATE_VISIBILITY sizeof(gchar) +#define EPIPE_REQUEST_LIMIT 20 + +/* macro ******************************************************/ +#define EVASPIXMAPSINK_SET_PIXMAP_ID_TO_GEM_INFO( x_evaspixmapsink, x_pixmap_id ) \ +do \ +{ \ + int i = 0; \ + XV_DATA_PTR data = (XV_DATA_PTR)x_evaspixmapsink->evas_pixmap_buf->xvimage->data; \ + if (data->YBuf > 0) { \ + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { \ + if (evaspixmapsink->gem_info[i].gem_name == data->YBuf) { \ + evaspixmapsink->gem_info[i].ref_pixmap = x_pixmap_id; \ + GST_LOG_OBJECT (x_evaspixmapsink,"pixmap(%d) is marked at index(%d) of gem_info(YBuf)->gem_handle(%d)", x_pixmap_id, i, evaspixmapsink->gem_info[i].gem_handle); \ + break; \ + } \ + } \ + } \ + if (data->CbBuf > 0) { \ + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { \ + if (evaspixmapsink->gem_info[i].gem_name == data->CbBuf) { \ + evaspixmapsink->gem_info[i].ref_pixmap = x_pixmap_id; \ + GST_LOG_OBJECT (x_evaspixmapsink,"pixmap(%d) is marked at index(%d) of gem_info(CbBuf)->gem_handle(%d)", x_pixmap_id, i, evaspixmapsink->gem_info[i].gem_handle); \ + break; \ + } \ + } \ + } \ + if (data->CrBuf > 0) { \ + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { \ + if (evaspixmapsink->gem_info[i].gem_name == data->CrBuf) { \ + evaspixmapsink->gem_info[i].ref_pixmap = x_pixmap_id; \ + GST_LOG_OBJECT (x_evaspixmapsink,"pixmap(%d) is marked at index(%d) of gem_info(CrBuf)->gem_handle(%d)", x_pixmap_id, i, evaspixmapsink->gem_info[i].gem_handle); \ + break; \ + } \ + } \ + } \ +}while(0) + +#define EVASPIXMAPSINK_SET_EVAS_OBJECT_EVENT_CALLBACK( x_evas_image_object, x_usr_data ) \ +do \ +{ \ + evas_object_event_callback_add (x_evas_image_object, EVAS_CALLBACK_DEL, evas_callback_del_event, x_usr_data); \ + evas_object_event_callback_add (x_evas_image_object, EVAS_CALLBACK_RESIZE, evas_callback_resize_event, x_usr_data); \ + evas_object_event_callback_add (x_evas_image_object, EVAS_CALLBACK_SHOW, evas_callback_show_event, x_usr_data); \ + evas_object_event_callback_add (x_evas_image_object, EVAS_CALLBACK_HIDE, evas_callback_hide_event, x_usr_data); \ +}while(0) + +#define EVASPIXMAPSINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK( x_evas_image_object ) \ +do \ +{ \ + evas_object_event_callback_del (x_evas_image_object, EVAS_CALLBACK_DEL, evas_callback_del_event); \ + evas_object_event_callback_del (x_evas_image_object, EVAS_CALLBACK_RESIZE, evas_callback_resize_event); \ + evas_object_event_callback_del (x_evas_image_object, EVAS_CALLBACK_SHOW, evas_callback_show_event); \ + evas_object_event_callback_del (x_evas_image_object, EVAS_CALLBACK_HIDE, evas_callback_hide_event); \ +}while(0) + +static GType +gst_evaspixmapsink_flip_get_type(void) +{ + static GType evaspixmapsink_flip_type = 0; + static const GEnumValue flip_type[] = { + { FLIP_NONE, "Flip NONE", "FLIP_NONE"}, + { FLIP_HORIZONTAL, "Flip HORIZONTAL", "FLIP_HORIZONTAL"}, + { FLIP_VERTICAL, "Flip VERTICAL", "FLIP_VERTICAL"}, + { FLIP_BOTH, "Flip BOTH", "FLIP_BOTH"}, + { FLIP_NUM, NULL, NULL}, + }; + + if (!evaspixmapsink_flip_type) { + evaspixmapsink_flip_type = g_enum_register_static("GstEvasPixmapSinkFlipType", flip_type); + } + + return evaspixmapsink_flip_type; +} + +static GType +gst_evaspixmapsink_rotate_angle_get_type(void) +{ + static GType evaspixmapsink_rotate_angle_type = 0; + static const GEnumValue rotate_angle_type[] = { + { 0, "No rotate", "DEGREE_0"}, + { 1, "Rotate 90 degree", "DEGREE_90"}, + { 2, "Rotate 180 degree", "DEGREE_180"}, + { 3, "Rotate 270 degree", "DEGREE_270"}, + { 4, NULL, NULL}, + }; + + if (!evaspixmapsink_rotate_angle_type) { + evaspixmapsink_rotate_angle_type = g_enum_register_static("GstEvasPixmapSinkRotateAngleType", rotate_angle_type); + } + + return evaspixmapsink_rotate_angle_type; +} + +static GType +gst_evaspixmapsink_display_geometry_method_get_type(void) +{ + static GType evaspixmapsink_display_geometry_method_type = 0; + static const GEnumValue display_geometry_method_type[] = { + { 0, "Letter box", "LETTER_BOX"}, + { 1, "Origin size", "ORIGIN_SIZE"}, + { 2, "Full-screen", "FULL_SCREEN"}, + { 3, "Cropped Full-screen", "CROPPED_FULL_SCREEN"}, + { 4, "Explicitely described destination ROI", "CUSTOM_ROI"}, + { 5, NULL, NULL}, + }; + + if (!evaspixmapsink_display_geometry_method_type) { + evaspixmapsink_display_geometry_method_type = g_enum_register_static("GstEvasPixmapSinkDisplayGeometryMethodType", display_geometry_method_type); + } + + return evaspixmapsink_display_geometry_method_type; +} + +typedef struct +{ + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long input_mode; + unsigned long status; +} +MotifWmHints, MwmHints; + +#define MWM_HINTS_DECORATIONS (1L << 1) + +static void gst_evaspixmapsink_reset (GstEvasPixmapSink *evaspixmapsink); +static GstBufferClass *evaspixmap_buffer_parent_class = NULL; +static void gst_evaspixmap_buffer_finalize (GstEvasPixmapBuffer *evaspixmapbuf); +static void gst_evaspixmapsink_xcontext_clear (GstEvasPixmapSink *evaspixmapsink); +static void gst_evaspixmapsink_xpixmap_destroy (GstEvasPixmapSink *evaspixmapsink, GstXPixmap *xpixmap); +static void gst_evaspixmapsink_xpixmap_update_geometry (GstEvasPixmapSink *evaspixmapsink, int idx); +static gboolean gst_evaspixmap_buffer_put (GstEvasPixmapSink *evaspixmapsink, GstEvasPixmapBuffer *evaspixmapbuf); +static gboolean gst_evaspixmapsink_xpixmap_link (GstEvasPixmapSink *evaspixmapsink); +static void gst_evaspixmapsink_xpixmap_clear (GstEvasPixmapSink *evaspixmapsink, GstXPixmap *xpixmap); +static gint gst_evaspixmapsink_get_format_from_caps (GstEvasPixmapSink *evaspixmapsink, GstCaps *caps); +static void drm_close_gem(GstEvasPixmapSink *evaspixmapsink, unsigned int gem_handle); +static void drm_fini_close_gem_handle(GstEvasPixmapSink *evaspixmapsink, Pixmap pixmap_id); +static void evas_callback_resize_event (void *data, Evas *e, Evas_Object *obj, void *event_info); +static void evas_callback_del_event (void *data, Evas *e, Evas_Object *obj, void *event_info); +static void evas_callback_show_event (void *data, Evas *e, Evas_Object *obj, void *event_info); +static void evas_callback_hide_event (void *data, Evas *e, Evas_Object *obj, void *event_info); + +/* Default template - initiated with class struct to allow gst-register to work + without X running */ +static GstStaticPadTemplate gst_evaspixmapsink_sink_template_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " + "height = (int) [ 1, MAX ]; " + "video/x-raw-yuv, " + "framerate = (fraction) [ 0, MAX ], " + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]") + ); + +enum +{ + PROP_0, + PROP_CONTRAST, + PROP_BRIGHTNESS, + PROP_HUE, + PROP_SATURATION, + PROP_DISPLAY, + PROP_SYNCHRONOUS, + PROP_PIXEL_ASPECT_RATIO, + PROP_DEVICE, + PROP_DEVICE_NAME, + PROP_DOUBLE_BUFFER, + PROP_AUTOPAINT_COLORKEY, + PROP_COLORKEY, + PROP_PIXMAP_WIDTH, + PROP_PIXMAP_HEIGHT, + PROP_FLIP, + PROP_ROTATE_ANGLE, + PROP_DISPLAY_GEOMETRY_METHOD, + PROP_ZOOM, + PROP_DST_ROI_X, + PROP_DST_ROI_Y, + PROP_DST_ROI_W, + PROP_DST_ROI_H, + PROP_STOP_VIDEO, + PROP_EVAS_OBJECT, + PROP_VISIBLE, + PROP_ORIGIN_SIZE, +}; + +static GstVideoSinkClass *parent_class = NULL; + +/* ============================================================= */ +/* */ +/* Private Methods */ +/* */ +/* ============================================================= */ + +/* evaspixmap buffers */ + +#define GST_TYPE_EVASPIXMAP_BUFFER (gst_evaspixmap_buffer_get_type()) + +#define GST_IS_EVASPIXMAP_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_EVASPIXMAP_BUFFER)) +#define GST_EVASPIXMAP_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_EVASPIXMAP_BUFFER, GstEvasPixmapBuffer)) + +static int get_millis_time() +{ + struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); + return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L); +} + +static void +ecore_pipe_callback_handler (void *data, void *buffer, unsigned int nbyte) +{ + GstEvasPixmapSink *evaspixmapsink = (GstEvasPixmapSink*)data; + GST_DEBUG_OBJECT (evaspixmapsink,"[START] Evas_Object(0x%x)", evaspixmapsink->eo); + MMTA_ACUM_ITEM_BEGIN("evaspixmapsink - ecore thread cb : TOTAL", FALSE); + int i = 0; + guint idx = 0; + GstXPixmap *xpixmap = NULL; + + if (!data ) { + GST_WARNING_OBJECT (evaspixmapsink,"data is NULL.."); + return; + } + evaspixmapsink->epipe_request_count--; + if (!evaspixmapsink->eo) { + GST_WARNING_OBJECT (evaspixmapsink,"evas object is NULL.."); + return; + } + + /* setting evas object hide and show */ + if (nbyte == SIZE_FOR_UPDATE_VISIBILITY) { + if(!evaspixmapsink->visible) { + evas_object_hide(evaspixmapsink->eo); + GST_INFO_OBJECT (evaspixmapsink, "object hide"); + } else { + if (!evas_object_image_native_surface_get(evaspixmapsink->eo)) { + GST_WARNING_OBJECT (evaspixmapsink, "native surface is not set, skip evas_object_show().."); + } else { + evas_object_show(evaspixmapsink->eo); + GST_INFO_OBJECT (evaspixmapsink, "object show"); + } + } + return; + } + + /* mapping evas object with xpixmap */ + if (evaspixmapsink->do_link) { + GST_DEBUG_OBJECT (evaspixmapsink,"do link"); + evas_object_image_size_set(evaspixmapsink->eo, evaspixmapsink->w, evaspixmapsink->h); + if (evaspixmapsink->xpixmap[idx]->pixmap) { + Evas_Native_Surface surf; + surf.version = EVAS_NATIVE_SURFACE_VERSION; + surf.type = EVAS_NATIVE_SURFACE_X11; + surf.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get()); + surf.data.x11.pixmap = evaspixmapsink->xpixmap[idx]->pixmap; + __ta__("evaspixmapsink - ecore thread cb : _native_surface_set(LINK)", evas_object_image_native_surface_set(evaspixmapsink->eo, &surf); ); + evaspixmapsink->do_link = FALSE; + } else { + GST_WARNING_OBJECT (evaspixmapsink,"pixmap is NULL.."); + return; + } + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->xpixmap[i]->prev_pixmap && evaspixmapsink->xpixmap[i]->prev_gc && evaspixmapsink->prev_damage[i]) { + GST_LOG_OBJECT (evaspixmapsink,"Free pixmap(%d), gc(%x), destroy previous damage(%d)", + evaspixmapsink->xpixmap[i]->prev_pixmap, evaspixmapsink->xpixmap[i]->prev_gc, evaspixmapsink->prev_damage[i]); + g_mutex_lock (evaspixmapsink->x_lock); + XFreePixmap(evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[i]->prev_pixmap); + XFreeGC (evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[i]->prev_gc); + XDamageDestroy(evaspixmapsink->xcontext->disp, evaspixmapsink->prev_damage[i]); + XSync(evaspixmapsink->xcontext->disp, FALSE); + g_mutex_unlock (evaspixmapsink->x_lock); + evaspixmapsink->xpixmap[i]->prev_pixmap = 0; + evaspixmapsink->xpixmap[i]->prev_gc = 0; + evaspixmapsink->prev_damage[i] = NULL; + } + } + if (evaspixmapsink->visible && !evas_object_visible_get(evaspixmapsink->eo)) { + evas_object_show(evaspixmapsink->eo); + GST_WARNING_OBJECT (evaspixmapsink, "object show (lazy)"); + } + + } else { + GST_DEBUG_OBJECT (evaspixmapsink,"update"); + /* update evas image object size */ + if (evaspixmapsink->use_origin_size) { + evas_object_geometry_get(evaspixmapsink->eo, NULL, NULL, &evaspixmapsink->w, &evaspixmapsink->h); + } + + g_mutex_lock (evaspixmapsink->pixmap_ref_lock); + + /* find a oldest damaged pixmap */ + int temp_time = 0; + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->last_updated_idx == i) { + continue; + } else { + xpixmap = evaspixmapsink->xpixmap[i]; + if (xpixmap->ref > 0 && xpixmap->damaged_time) { + if (temp_time == 0) { + temp_time = xpixmap->damaged_time; + idx = i; + } else { + if (temp_time > xpixmap->damaged_time) { + temp_time = xpixmap->damaged_time; + idx = i; + } + } + } + } + } + + xpixmap = evaspixmapsink->xpixmap[idx]; + if (xpixmap->pixmap) { + if (evaspixmapsink->last_updated_idx != idx) { + Evas_Native_Surface surf; + surf.version = EVAS_NATIVE_SURFACE_VERSION; + surf.type = EVAS_NATIVE_SURFACE_X11; + surf.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get()); + surf.data.x11.pixmap = xpixmap->pixmap; + if (evaspixmapsink->eo) { + evas_object_image_native_surface_set(evaspixmapsink->eo, NULL); + } + __ta__("evaspixmapsink - ecore thread cb : _native_surface_set", evas_object_image_native_surface_set(evaspixmapsink->eo, &surf); ); + GST_LOG_OBJECT (evaspixmapsink,"update, native_surface_set of xpixmap[%d]",idx); + if (evaspixmapsink->last_updated_idx == -1) { + xpixmap->damaged_time = 0; + GST_INFO_OBJECT (evaspixmapsink,"this is the first time to request to update(do not DECREASE ref-count) : pixmap(%d), refcount(%d), damaged_time(%d), idx(%d)", + xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time, idx); + } else { + xpixmap = evaspixmapsink->xpixmap[evaspixmapsink->last_updated_idx]; + xpixmap->ref--; + xpixmap->damaged_time = 0; + GST_INFO_OBJECT (evaspixmapsink,"pixmap ref-count DECREASED : pixmap(%d), refcount(%d), damaged_time(%d), idx(%d)", + xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time, evaspixmapsink->last_updated_idx); + } + evaspixmapsink->last_updated_idx = idx; + } + + MMTA_ACUM_ITEM_BEGIN("evaspixmapsink evas_object_image update", FALSE); + evas_object_image_pixels_dirty_set (evaspixmapsink->eo, 1); + evas_object_image_fill_set(evaspixmapsink->eo, 0, 0, evaspixmapsink->w, evaspixmapsink->h); + evas_object_image_data_update_add(evaspixmapsink->eo, 0, 0, evaspixmapsink->w, evaspixmapsink->h); + MMTA_ACUM_ITEM_END("evaspixmapsink evas_object_image update", FALSE); + //GST_LOG_OBJECT (evaspixmapsink,"request to update : pixmap idx(%d), ref(%d)", idx, xpixmap->ref); + } else { + GST_ERROR_OBJECT (evaspixmapsink,"pixmap is NULL.."); + } + g_mutex_unlock (evaspixmapsink->pixmap_ref_lock); + } + + MMTA_ACUM_ITEM_END("evaspixmapsink - ecore thread cb : TOTAL", FALSE); + + GST_DEBUG_OBJECT (evaspixmapsink,"[END]"); +} + +static inline gboolean +is_evas_image_object (Evas_Object *obj) +{ + const char *type; + if (!obj) { + GST_ERROR ("evas image object is NULL.."); + return FALSE; + } + type = evas_object_type_get (obj); + if (!type) { + GST_ERROR ("could not find type of the evas object.."); + return FALSE; + } + if (strcmp (type, "image") == 0) { + return TRUE; + } + return FALSE; +} + +static void +evas_callback_resize_event (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + int w = 0; + int h = 0; + float former_ratio = 0; + float ratio = 0; + int i = 0; +#ifdef COMPARE_RATIO + float abs_margin = 0; +#endif + + GstEvasPixmapSink *evaspixmapsink = (GstEvasPixmapSink *)data; + GST_DEBUG_OBJECT (evaspixmapsink,"[START] evas_image_object(%x), tid(%u)", obj, (unsigned int)pthread_self()); + + evas_object_geometry_get(evaspixmapsink->eo, NULL, NULL, &w, &h); + GST_DEBUG_OBJECT (evaspixmapsink,"resized : w(%d), h(%d)", w, h); + if (!evaspixmapsink->use_origin_size && + (evaspixmapsink->w != w || evaspixmapsink->h != h)) { + former_ratio = (float)evaspixmapsink->w / evaspixmapsink->h; + ratio = (float)w / h; + evaspixmapsink->w = w; + evaspixmapsink->h = h; + +#ifdef COMPARE_RATIO + GST_DEBUG_OBJECT (evaspixmapsink,"resized : ratio(%.3f=>%.3f)", former_ratio, ratio); + if ( former_ratio >= ratio ) { + abs_margin = former_ratio - ratio; + } else { + abs_margin = ratio - former_ratio; + } + /* re-link_pixmap can only be set when ratio is changed */ + if ( abs_margin >= MARGIN_OF_ERROR ) { +#endif + if (!gst_evaspixmapsink_xpixmap_link(evaspixmapsink)) { + GST_ERROR_OBJECT (evaspixmapsink,"link evas image object with pixmap failed..."); + return; + } + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { + if (evaspixmapsink->gem_info[i].ref_pixmap > 0) { + GST_LOG_OBJECT (evaspixmapsink,"set ref_pixmap(%d) to 0 in gem_info[%d]", evaspixmapsink->gem_info[i].ref_pixmap, i); + evaspixmapsink->gem_info[i].ref_pixmap = 0; + } + } +#ifdef COMPARE_RATIO + } +#endif + } + + if (GST_STATE(evaspixmapsink) == GST_STATE_PAUSED) { + gst_evaspixmap_buffer_put (evaspixmapsink, evaspixmapsink->evas_pixmap_buf); + } + + GST_DEBUG_OBJECT (evaspixmapsink,"[END]"); +} + +static void +evas_callback_del_event (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + GstEvasPixmapSink *evaspixmapsink = data; + if (!evaspixmapsink) { + GST_WARNING ("evaspixmapsink is NULL.."); + return; + } + GST_DEBUG_OBJECT (evaspixmapsink,"[START]"); + + EVASPIXMAPSINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK( evaspixmapsink->eo ); + if (evaspixmapsink->eo) { + evas_object_image_native_surface_set(evaspixmapsink->eo, NULL); + evaspixmapsink->eo = NULL; + } + + GST_DEBUG_OBJECT (evaspixmapsink,"[END]"); +} + +static void +evas_callback_show_event (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + GstEvasPixmapSink *evaspixmapsink = (GstEvasPixmapSink *)data; + GST_INFO_OBJECT (evaspixmapsink,"show evas_image_object(%x) from pid(%d), tid(%u)", obj, getpid(), (unsigned int)pthread_self()); +} + +static void +evas_callback_hide_event (void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + GstEvasPixmapSink *evaspixmapsink = (GstEvasPixmapSink *)data; + GST_INFO_OBJECT (evaspixmapsink,"hide evas_image_object(%x) from pid(%d), tid(%u)", obj, getpid(), (unsigned int)pthread_self()); +} + +/* X11 stuff */ +static gboolean error_caught = FALSE; + +static int +gst_evaspixmapsink_handle_xerror (Display * display, XErrorEvent * xevent) +{ + char error_msg[1024]; + + XGetErrorText (display, xevent->error_code, error_msg, 1024); + GST_ERROR ("evaspixmapsink triggered an XError. error(%s), display(%p), xevent->request_code(%d)", error_msg, display, xevent->request_code); + error_caught = TRUE; + return 0; +} + +#ifdef HAVE_XSHM +/* This function checks that it is actually really possible to create an image + using XShm */ +static gboolean +gst_evaspixmapsink_check_xshm_calls (GstXContext * xcontext) +{ + XvImage *xvimage; + XShmSegmentInfo SHMInfo; + gint size; + int (*handler) (Display *, XErrorEvent *); + gboolean result = FALSE; + gboolean did_attach = FALSE; + + g_return_val_if_fail (xcontext != NULL, FALSE); + + /* Sync to ensure any older errors are already processed */ + XSync (xcontext->disp, FALSE); + + /* Set defaults so we don't free these later unnecessarily */ + SHMInfo.shmaddr = ((void *) -1); + SHMInfo.shmid = -1; + + /* Setting an error handler to catch failure */ + error_caught = FALSE; + handler = XSetErrorHandler (gst_evaspixmapsink_handle_xerror); + + /* Trying to create a 1x1 picture */ + GST_DEBUG ("XvShmCreateImage of 1x1"); + xvimage = XvShmCreateImage (xcontext->disp, xcontext->xv_port_id, + xcontext->im_format, NULL, 1, 1, &SHMInfo); + + /* Might cause an error, sync to ensure it is noticed */ + XSync (xcontext->disp, FALSE); + if (!xvimage || error_caught) { + GST_WARNING ("could not XvShmCreateImage a 1x1 image"); + goto beach; + } + size = xvimage->data_size; + + SHMInfo.shmid = shmget (IPC_PRIVATE, size, IPC_CREAT | 0777); + if (SHMInfo.shmid == -1) { + GST_WARNING ("could not get shared memory of %d bytes", size); + goto beach; + } + + SHMInfo.shmaddr = shmat (SHMInfo.shmid, NULL, 0); + if (SHMInfo.shmaddr == ((void *) -1)) { + GST_WARNING ("Failed to shmat: %s", g_strerror (errno)); + /* Clean up the shared memory segment */ + shmctl (SHMInfo.shmid, IPC_RMID, NULL); + goto beach; + } + + xvimage->data = SHMInfo.shmaddr; + SHMInfo.readOnly = FALSE; + + if (XShmAttach (xcontext->disp, &SHMInfo) == 0) { + GST_WARNING ("Failed to XShmAttach"); + /* Clean up the shared memory segment */ + shmctl (SHMInfo.shmid, IPC_RMID, NULL); + goto beach; + } + + /* Sync to ensure we see any errors we caused */ + XSync (xcontext->disp, FALSE); + + /* Delete the shared memory segment as soon as everyone is attached. + * This way, it will be deleted as soon as we detach later, and not + * leaked if we crash. */ + shmctl (SHMInfo.shmid, IPC_RMID, NULL); + + if (!error_caught) { + GST_DEBUG ("XServer ShmAttached to 0x%x, id 0x%lx", SHMInfo.shmid, + SHMInfo.shmseg); + + did_attach = TRUE; + /* store whether we succeeded in result */ + result = TRUE; + } else { + GST_WARNING ("MIT-SHM extension check failed at XShmAttach. " + "Not using shared memory."); + } + +beach: + /* Sync to ensure we swallow any errors we caused and reset error_caught */ + XSync (xcontext->disp, FALSE); + + error_caught = FALSE; + XSetErrorHandler (handler); + + if (did_attach) { + GST_DEBUG ("XServer ShmDetaching from 0x%x id 0x%lx", + SHMInfo.shmid, SHMInfo.shmseg); + XShmDetach (xcontext->disp, &SHMInfo); + XSync (xcontext->disp, FALSE); + } + if (SHMInfo.shmaddr != ((void *) -1)) + shmdt (SHMInfo.shmaddr); + if (xvimage) + XFree (xvimage); + return result; +} +#endif /* HAVE_XSHM */ + +/* This function destroys a GstEvasPixmap handling XShm availability */ +static void +gst_evaspixmap_buffer_destroy (GstEvasPixmapBuffer *evaspixmapbuf) +{ + GstEvasPixmapSink *evaspixmapsink; + + evaspixmapsink = evaspixmapbuf->evaspixmapsink; + if (G_UNLIKELY (evaspixmapsink == NULL)) { + goto no_sink; + } + GST_DEBUG_OBJECT (evaspixmapsink, "Destroying buffer"); + + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + GST_OBJECT_LOCK (evaspixmapsink); + + /* We might have some buffers destroyed after changing state to NULL */ + if (evaspixmapsink->xcontext == NULL) { + GST_DEBUG_OBJECT (evaspixmapsink,"Destroying XvImage after Xcontext"); +#ifdef HAVE_XSHM + /* Need to free the shared memory segment even if the x context + * was already cleaned up */ + if (evaspixmapbuf->SHMInfo.shmaddr != ((void *) -1)) { + shmdt (evaspixmapbuf->SHMInfo.shmaddr); + } +#endif + goto beach; + } + g_mutex_lock (evaspixmapsink->x_lock); + +#ifdef HAVE_XSHM + if (evaspixmapsink->xcontext->use_xshm) { + if (evaspixmapbuf->SHMInfo.shmaddr != ((void *) -1)) { + GST_DEBUG_OBJECT (evaspixmapsink,"XServer ShmDetaching from 0x%x id 0x%lx", evaspixmapbuf->SHMInfo.shmid, evaspixmapbuf->SHMInfo.shmseg); + XShmDetach (evaspixmapsink->xcontext->disp, &evaspixmapbuf->SHMInfo); + XSync (evaspixmapsink->xcontext->disp, FALSE); + shmdt (evaspixmapbuf->SHMInfo.shmaddr); + } + if (evaspixmapbuf->xvimage) + XFree (evaspixmapbuf->xvimage); + } else +#endif /* HAVE_XSHM */ + { + if (evaspixmapbuf->xvimage) { + if (evaspixmapbuf->xvimage->data) { + g_free (evaspixmapbuf->xvimage->data); + } + XFree (evaspixmapbuf->xvimage); + } + } + + XSync (evaspixmapsink->xcontext->disp, FALSE); + + g_mutex_unlock (evaspixmapsink->x_lock); + +beach: + GST_OBJECT_UNLOCK (evaspixmapsink); + evaspixmapbuf->evaspixmapsink = NULL; + gst_object_unref (evaspixmapsink); + + GST_MINI_OBJECT_CLASS (evaspixmap_buffer_parent_class)->finalize (GST_MINI_OBJECT(evaspixmapbuf)); + + return; + + no_sink: + { + GST_WARNING ("no sink found"); + return; + } +} + +static void +gst_evaspixmap_buffer_finalize (GstEvasPixmapBuffer *evaspixmapbuf) +{ + GstEvasPixmapSink *evaspixmapsink; + + evaspixmapsink = evaspixmapbuf->evaspixmapsink; + if (G_UNLIKELY (evaspixmapsink == NULL)) { + GST_WARNING_OBJECT (evaspixmapsink,"no sink found"); + return; + } + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + /* If our geometry changed we can't reuse that image. */ + GST_LOG_OBJECT (evaspixmapsink,"destroy image as sink is shutting down"); + gst_evaspixmap_buffer_destroy (evaspixmapbuf); +} + +static void +gst_evaspixmap_buffer_free (GstEvasPixmapBuffer *evaspixmapbuf) +{ + /* make sure it is not recycled */ + evaspixmapbuf->width = -1; + evaspixmapbuf->height = -1; + gst_buffer_unref (GST_BUFFER (evaspixmapbuf)); +} + +static void +gst_evaspixmap_buffer_init (GstEvasPixmapBuffer *evaspixmapbuf, gpointer g_class) +{ +#ifdef HAVE_XSHM + evaspixmapbuf->SHMInfo.shmaddr = ((void *) -1); + evaspixmapbuf->SHMInfo.shmid = -1; +#endif +} + +static void +gst_evaspixmap_buffer_class_init (gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + + evaspixmap_buffer_parent_class = g_type_class_peek_parent (g_class); + + mini_object_class->finalize = (GstMiniObjectFinalizeFunction) gst_evaspixmap_buffer_finalize; +} + +static GType +gst_evaspixmap_buffer_get_type (void) +{ + static GType _gst_evaspixmap_buffer_type; + + if (G_UNLIKELY (_gst_evaspixmap_buffer_type == 0)) { + static const GTypeInfo evaspixmap_buffer_info = { + sizeof (GstBufferClass), + NULL, + NULL, + gst_evaspixmap_buffer_class_init, + NULL, + NULL, + sizeof (GstEvasPixmapBuffer), + 0, + (GInstanceInitFunc) gst_evaspixmap_buffer_init, + NULL + }; + _gst_evaspixmap_buffer_type = g_type_register_static (GST_TYPE_BUFFER, + "GstEvasPixmapBuffer", &evaspixmap_buffer_info, 0); + } + return _gst_evaspixmap_buffer_type; +} + +/* This function handles GstEvasPixmapBuffer creation depending on XShm availability */ +static GstEvasPixmapBuffer* +gst_evaspixmap_buffer_new (GstEvasPixmapSink *evaspixmapsink, GstCaps *caps) +{ + GstEvasPixmapBuffer *evaspixmapbuf = NULL; + GstStructure *structure = NULL; + gboolean succeeded = FALSE; + int (*handler) (Display *, XErrorEvent *); + + g_return_val_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink), NULL); + + if (caps == NULL) { + return NULL; + } + + evaspixmapbuf = (GstEvasPixmapBuffer*) gst_mini_object_new (GST_TYPE_EVASPIXMAP_BUFFER); + GST_DEBUG_OBJECT (evaspixmapsink,"Creating new EvasPixmapBuffer"); + + structure = gst_caps_get_structure (caps, 0); + + if (!gst_structure_get_int (structure, "width", &evaspixmapbuf->width) || !gst_structure_get_int (structure, "height", &evaspixmapbuf->height)) { + GST_WARNING_OBJECT (evaspixmapsink,"failed getting geometry from caps %" GST_PTR_FORMAT, caps); + } + + GST_LOG_OBJECT (evaspixmapsink,"creating %dx%d", evaspixmapbuf->width, evaspixmapbuf->height); + + GST_LOG_OBJECT (evaspixmapsink,"aligned size %dx%d", evaspixmapsink->aligned_width, evaspixmapsink->aligned_height); + if (evaspixmapsink->aligned_width == 0 || evaspixmapsink->aligned_height == 0) { + GST_INFO_OBJECT (evaspixmapsink,"aligned size is zero. set size of caps."); + evaspixmapsink->aligned_width = evaspixmapbuf->width; + evaspixmapsink->aligned_height = evaspixmapbuf->height; + } + + evaspixmapbuf->im_format = gst_evaspixmapsink_get_format_from_caps (evaspixmapsink, caps); + if (evaspixmapbuf->im_format == -1) { + GST_WARNING_OBJECT (evaspixmapsink,"failed to get format from caps %"GST_PTR_FORMAT, caps); + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE,("Failed to create output image buffer of %dx%d pixels", + evaspixmapbuf->width, evaspixmapbuf->height), ("Invalid input caps")); + goto beach_unlocked; + } + + GST_INFO_OBJECT (evaspixmapsink, "FOURCC format : %c%c%c%c", evaspixmapbuf->im_format, evaspixmapbuf->im_format>>8, + evaspixmapbuf->im_format>>16, evaspixmapbuf->im_format>>24); + + evaspixmapbuf->evaspixmapsink = gst_object_ref (evaspixmapsink); + + g_mutex_lock (evaspixmapsink->x_lock); + + /* Sync to ensure we swallow any errors we caused and reset error_caught */ + XSync (evaspixmapsink->xcontext->disp, FALSE); + + /* Setting an error handler to catch failure */ + error_caught = FALSE; + handler = XSetErrorHandler (gst_evaspixmapsink_handle_xerror); + +#ifdef HAVE_XSHM + if (evaspixmapsink->xcontext->use_xshm) { + int expected_size; + evaspixmapbuf->xvimage = XvShmCreateImage (evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, evaspixmapbuf->im_format, NULL, + evaspixmapsink->aligned_width, evaspixmapsink->aligned_height, &evaspixmapbuf->SHMInfo); + if (!evaspixmapbuf->xvimage || error_caught) { + if (error_caught) { + GST_ERROR_OBJECT (evaspixmapsink,"error_caught!"); + } + if(!evaspixmapbuf->xvimage) { + GST_ERROR_OBJECT (evaspixmapsink,"XvShmCreateImage() failed"); + } + g_mutex_unlock (evaspixmapsink->x_lock); + /* Reset error handler */ + error_caught = FALSE; + XSetErrorHandler (handler); + /* Push an error */ + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE,("Failed to create output image buffer of %dx%d pixels",evaspixmapbuf->width, + evaspixmapbuf->height),("could not XvShmCreateImage a %dx%d image",evaspixmapbuf->width, evaspixmapbuf->height)); + goto beach_unlocked; + } + + /* we have to use the returned data_size for our shm size */ + evaspixmapbuf->size = evaspixmapbuf->xvimage->data_size; + GST_LOG_OBJECT (evaspixmapsink,"XShm image size is %" G_GSIZE_FORMAT, evaspixmapbuf->size); + + /* calculate the expected size. This is only for sanity checking the + * number we get from X. */ + switch (evaspixmapbuf->im_format) { + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): + { + gint pitches[3]; + gint offsets[3]; + guint plane; + + offsets[0] = 0; + pitches[0] = GST_ROUND_UP_4 (evaspixmapbuf->width); + offsets[1] = offsets[0] + pitches[0] * GST_ROUND_UP_2 (evaspixmapbuf->height); + pitches[1] = GST_ROUND_UP_8 (evaspixmapbuf->width) / 2; + offsets[2] = + offsets[1] + pitches[1] * GST_ROUND_UP_2 (evaspixmapbuf->height) / 2; + pitches[2] = GST_ROUND_UP_8 (pitches[0]) / 2; + + expected_size = offsets[2] + pitches[2] * GST_ROUND_UP_2 (evaspixmapbuf->height) / 2; + + for (plane = 0; plane < evaspixmapbuf->xvimage->num_planes; plane++) { + GST_DEBUG_OBJECT (evaspixmapsink,"Plane %u has a expected pitch of %d bytes, " "offset of %d", + plane, pitches[plane], offsets[plane]); + } + break; + } + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): + expected_size = evaspixmapbuf->height * GST_ROUND_UP_4 (evaspixmapbuf->width * 2); + break; + case GST_MAKE_FOURCC ('S', 'T', '1', '2'): + case GST_MAKE_FOURCC ('S', 'N', '1', '2'): + case GST_MAKE_FOURCC ('S', 'U', 'Y', 'V'): + case GST_MAKE_FOURCC ('S', 'U', 'Y', '2'): + case GST_MAKE_FOURCC ('S', '4', '2', '0'): + case GST_MAKE_FOURCC ('S', 'Y', 'V', 'Y'): + case GST_MAKE_FOURCC ('I', 'T', 'L', 'V'): + case GST_MAKE_FOURCC ('S', 'R', '3', '2'): + expected_size = sizeof(SCMN_IMGB); + break; + default: + expected_size = 0; + break; + } + if (expected_size != 0 && evaspixmapbuf->size != expected_size) { + GST_WARNING_OBJECT (evaspixmapsink,"unexpected XShm image size (got %" G_GSIZE_FORMAT ", expected %d)", evaspixmapbuf->size, expected_size); + } + + /* Be verbose about our XvImage stride */ + { + guint plane; + for (plane = 0; plane < evaspixmapbuf->xvimage->num_planes; plane++) { + GST_DEBUG_OBJECT (evaspixmapsink,"Plane %u has a pitch of %d bytes, ""offset of %d", plane, + evaspixmapbuf->xvimage->pitches[plane], evaspixmapbuf->xvimage->offsets[plane]); + } + } + + evaspixmapbuf->SHMInfo.shmid = shmget (IPC_PRIVATE, evaspixmapbuf->size,IPC_CREAT | 0777); + if (evaspixmapbuf->SHMInfo.shmid == -1) { + g_mutex_unlock (evaspixmapsink->x_lock); + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE, + ("Failed to create output image buffer of %dx%d pixels", evaspixmapbuf->width, evaspixmapbuf->height), + ("could not get shared memory of %" G_GSIZE_FORMAT " bytes",evaspixmapbuf->size)); + goto beach_unlocked; + } + + evaspixmapbuf->SHMInfo.shmaddr = shmat (evaspixmapbuf->SHMInfo.shmid, NULL, 0); + if (evaspixmapbuf->SHMInfo.shmaddr == ((void *) -1)) { + g_mutex_unlock (evaspixmapsink->x_lock); + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE, + ("Failed to create output image buffer of %dx%d pixels", + evaspixmapbuf->width, evaspixmapbuf->height), + ("Failed to shmat: %s", g_strerror (errno))); + /* Clean up the shared memory segment */ + shmctl (evaspixmapbuf->SHMInfo.shmid, IPC_RMID, NULL); + goto beach_unlocked; + } + + evaspixmapbuf->xvimage->data = evaspixmapbuf->SHMInfo.shmaddr; + evaspixmapbuf->SHMInfo.readOnly = FALSE; + + if (XShmAttach (evaspixmapsink->xcontext->disp, &evaspixmapbuf->SHMInfo) == 0) { + /* Clean up the shared memory segment */ + shmctl (evaspixmapbuf->SHMInfo.shmid, IPC_RMID, NULL); + + g_mutex_unlock (evaspixmapsink->x_lock); + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE, + ("Failed to create output image buffer of %dx%d pixels", + evaspixmapbuf->width, evaspixmapbuf->height), ("Failed to XShmAttach")); + goto beach_unlocked; + } + + XSync (evaspixmapsink->xcontext->disp, FALSE); + + /* Delete the shared memory segment as soon as we everyone is attached. + * This way, it will be deleted as soon as we detach later, and not + * leaked if we crash. */ + shmctl (evaspixmapbuf->SHMInfo.shmid, IPC_RMID, NULL); + + GST_DEBUG_OBJECT (evaspixmapsink,"XServer ShmAttached to 0x%x, id 0x%lx", evaspixmapbuf->SHMInfo.shmid, evaspixmapbuf->SHMInfo.shmseg); + } else +#endif /* HAVE_XSHM */ + { + evaspixmapbuf->xvimage = XvCreateImage (evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, + evaspixmapbuf->im_format, NULL, evaspixmapsink->aligned_width, evaspixmapsink->aligned_height); + if (!evaspixmapbuf->xvimage || error_caught) { + g_mutex_unlock (evaspixmapsink->x_lock); + /* Reset error handler */ + error_caught = FALSE; + XSetErrorHandler (handler); + /* Push an error */ + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE, + ("Failed to create outputimage buffer of %dx%d pixels", + evaspixmapbuf->width, evaspixmapbuf->height), + ("could not XvCreateImage a %dx%d image", + evaspixmapbuf->width, evaspixmapbuf->height)); + goto beach_unlocked; + } + + /* we have to use the returned data_size for our image size */ + evaspixmapbuf->size = evaspixmapbuf->xvimage->data_size; + evaspixmapbuf->xvimage->data = g_malloc (evaspixmapbuf->size); + + XSync (evaspixmapsink->xcontext->disp, FALSE); + } + + /* Reset error handler */ + error_caught = FALSE; + XSetErrorHandler (handler); + + succeeded = TRUE; + + GST_BUFFER_DATA (evaspixmapbuf) = (guchar *) evaspixmapbuf->xvimage->data; + GST_BUFFER_SIZE (evaspixmapbuf) = evaspixmapbuf->size; + + g_mutex_unlock (evaspixmapsink->x_lock); + +beach_unlocked: + if (!succeeded) { + gst_evaspixmap_buffer_free (evaspixmapbuf); + evaspixmapbuf = NULL; + } + + return evaspixmapbuf; +} + +/* This function puts a GstEvasPixmapBuffer on a GstEvasPixmapSink's pixmap. Returns FALSE + * if no pixmap was available */ +static gboolean +gst_evaspixmap_buffer_put (GstEvasPixmapSink *evaspixmapsink, GstEvasPixmapBuffer *evaspixmapbuf) +{ + GstVideoRectangle result; + + GstVideoRectangle src_origin = { 0, 0, 0, 0}; + GstVideoRectangle src_input = { 0, 0, 0, 0}; + GstVideoRectangle src = { 0, 0, 0, 0}; + GstVideoRectangle dst = { 0, 0, 0, 0}; + int rotate = 0; + int ret = 0; + int idx = 0; + GstXPixmap *xpixmap = NULL; + + MMTA_ACUM_ITEM_BEGIN("evaspixmapsink evaspixmap_buffer_put()", FALSE); + + /* We take the flow_lock. If expose is in there we don't want to run + concurrently from the data flow thread */ + g_mutex_lock (evaspixmapsink->flow_lock); + + if (G_UNLIKELY (evaspixmapsink->xpixmap[idx] == NULL)) { + GST_WARNING_OBJECT (evaspixmapsink, "xpixmap is NULL. Skip buffer_put." ); + g_mutex_unlock(evaspixmapsink->flow_lock); + return FALSE; + } + if (evaspixmapsink->visible == FALSE) { + GST_WARNING_OBJECT (evaspixmapsink, "visible is FALSE. Skip buffer_put." ); + g_mutex_unlock(evaspixmapsink->flow_lock); + return TRUE; + } + if (!evaspixmapbuf) { + GST_WARNING_OBJECT (evaspixmapsink, "evaspixmapbuf is NULL. Skip buffer_put." ); + g_mutex_unlock(evaspixmapsink->flow_lock); + return TRUE; + } + + g_mutex_lock (evaspixmapsink->pixmap_ref_lock); + if (evaspixmapsink->last_updated_idx == -1) { + /* if it has never been updated any frame in Ecore thread, do below */ + idx = 0; + xpixmap = evaspixmapsink->xpixmap[idx]; + xpixmap->ref = 1; + GST_LOG_OBJECT (evaspixmapsink, "last_updated_idx(%d), we use index[%d] of pixmap buffers : pixmap(%d), ref(%d)", + evaspixmapsink->last_updated_idx, idx, xpixmap->pixmap, xpixmap->ref); + } else { + for (idx = 0; idx < evaspixmapsink->num_of_pixmaps; idx++) { + if (idx == evaspixmapsink->last_updated_idx) { + continue; + } else { + xpixmap = evaspixmapsink->xpixmap[idx]; + if (xpixmap->ref == 0 && xpixmap->damaged_time == 0) { + xpixmap->ref++; + GST_LOG_OBJECT (evaspixmapsink, "found an available pixmap(%d) : xpixmap[%d]", xpixmap->pixmap, idx); + GST_INFO_OBJECT (evaspixmapsink,"pixmap ref-count INCREASED : pixmap(%d), refcount(%d)", xpixmap->pixmap, xpixmap->ref); + break; + } + } + } + if (idx == evaspixmapsink->num_of_pixmaps) { + GST_LOG_OBJECT (evaspixmapsink, "Could not find a pixmap with idle state, skip buffer_put." ); + g_mutex_unlock (evaspixmapsink->pixmap_ref_lock); + g_mutex_unlock(evaspixmapsink->flow_lock); + return TRUE; + } + } + g_mutex_unlock (evaspixmapsink->pixmap_ref_lock); + + gst_evaspixmapsink_xpixmap_update_geometry(evaspixmapsink, idx); + + src.x = src.y = 0; + src_origin.x = src_origin.y = src_input.x = src_input.y = 0; + src_input.w = src_origin.w = evaspixmapsink->video_width; + src_input.h = src_origin.h = evaspixmapsink->video_height; + if (evaspixmapsink->use_origin_size || + (evaspixmapsink->rotate_angle == DEGREE_0 || + evaspixmapsink->rotate_angle == DEGREE_180)) { + src.w = src_origin.w; + src.h = src_origin.h; + } else { + src.w = src_origin.h; + src.h = src_origin.w; + } + + dst.w = evaspixmapsink->render_rect.w; /* pixmap width */ + dst.h = evaspixmapsink->render_rect.h; /* pixmap height */ + + if (!evaspixmapsink->use_origin_size) { + static Atom atom_rotation = None; + static Atom atom_hflip = None; + static Atom atom_vflip = None; + gboolean set_hflip = FALSE; + gboolean set_vflip = FALSE; + + /* compensation of size information (between evas image object's and pixmap's) */ + if (evaspixmapsink->sizediff_width > 1) { + if (evaspixmapsink->sizediff_height > 1) { + dst.w -= (evaspixmapsink->sizediff_width >> 1) << 1; + dst.h -= (evaspixmapsink->sizediff_height >> 1) << 1; + } else { + dst.w -= (evaspixmapsink->sizediff_width >> 1) << 1; + } + } else if (evaspixmapsink->sizediff_height > 1) { + dst.h -= (evaspixmapsink->sizediff_height >> 1) << 1; + } + + switch (evaspixmapsink->display_geometry_method) { + case DISP_GEO_METHOD_LETTER_BOX: + gst_video_sink_center_rect (src, dst, &result, TRUE); + result.x += evaspixmapsink->render_rect.x; + result.y += evaspixmapsink->render_rect.y; + GST_DEBUG_OBJECT (evaspixmapsink, "GEO_METHOD : letter box"); + break; + case DISP_GEO_METHOD_ORIGIN_SIZE: + gst_video_sink_center_rect (src, dst, &result, FALSE); + gst_video_sink_center_rect (dst, src, &src_input, FALSE); + GST_DEBUG_OBJECT (evaspixmapsink, "GEO_METHOD : origin size"); + if (evaspixmapsink->rotate_angle == DEGREE_90 || + evaspixmapsink->rotate_angle == DEGREE_270) { + src_input.x = src_input.x ^ src_input.y; + src_input.y = src_input.x ^ src_input.y; + src_input.x = src_input.x ^ src_input.y; + src_input.w = src_input.w ^ src_input.h; + src_input.h = src_input.w ^ src_input.h; + src_input.w = src_input.w ^ src_input.h; + } + break; + case DISP_GEO_METHOD_FULL_SCREEN: + result.x = result.y = 0; + result.w = evaspixmapsink->xpixmap[idx]->width; + result.h = evaspixmapsink->xpixmap[idx]->height; + GST_DEBUG_OBJECT (evaspixmapsink, "GEO_METHOD : full screen"); + break; + case DISP_GEO_METHOD_CROPPED_FULL_SCREEN: + GST_DEBUG_OBJECT (evaspixmapsink, "GEO_METHOD : cropped full screen"); + gst_video_sink_center_rect(dst, src, &src_input, TRUE); + result.x = result.y = 0; + result.w = dst.w; + result.h = dst.h; + if (evaspixmapsink->rotate_angle == DEGREE_90 || + evaspixmapsink->rotate_angle == DEGREE_270) { + src_input.x = src_input.x ^ src_input.y; + src_input.y = src_input.x ^ src_input.y; + src_input.x = src_input.x ^ src_input.y; + src_input.w = src_input.w ^ src_input.h; + src_input.h = src_input.w ^ src_input.h; + src_input.w = src_input.w ^ src_input.h; + } + break; + case DISP_GEO_METHOD_CUSTOM_ROI: + switch (evaspixmapsink->rotate_angle) { + case DEGREE_90: + result.w = evaspixmapsink->dst_roi.h; + result.h = evaspixmapsink->dst_roi.w; + result.x = evaspixmapsink->dst_roi.y; + result.y = evaspixmapsink->xpixmap[idx]->height - evaspixmapsink->dst_roi.x - evaspixmapsink->dst_roi.w; + break; + case DEGREE_180: + result.w = evaspixmapsink->dst_roi.w; + result.h = evaspixmapsink->dst_roi.h; + result.x = evaspixmapsink->xpixmap[idx]->width - result.w - evaspixmapsink->dst_roi.x; + result.y = evaspixmapsink->xpixmap[idx]->height - result.h - evaspixmapsink->dst_roi.y; + break; + case DEGREE_270: + result.w = evaspixmapsink->dst_roi.h; + result.h = evaspixmapsink->dst_roi.w; + result.x = evaspixmapsink->xpixmap[idx]->width - evaspixmapsink->dst_roi.y - evaspixmapsink->dst_roi.h; + result.y = evaspixmapsink->dst_roi.x; + break; + default: + result.x = evaspixmapsink->dst_roi.x; + result.y = evaspixmapsink->dst_roi.y; + result.w = evaspixmapsink->dst_roi.w; + result.h = evaspixmapsink->dst_roi.h; + break; + } + GST_LOG_OBJECT(evaspixmapsink, "rotate[%d], ROI input[%d,%d,%dx%d] > result[%d,%d,%dx%d]", + evaspixmapsink->rotate_angle, + evaspixmapsink->dst_roi.x, evaspixmapsink->dst_roi.y, evaspixmapsink->dst_roi.w, evaspixmapsink->dst_roi.h, + result.x, result.y, result.w, result.h); + break; + default: + break; + } + GST_DEBUG_OBJECT (evaspixmapsink, "GEO_METHOD : src(%dx%d), dst(%dx%d), result(%dx%d), result_x(%d), result_y(%d)", + src.w,src.h,dst.w,dst.h,result.w,result.h,result.x,result.y); + + switch( evaspixmapsink->rotate_angle ) { + case DEGREE_0: + break; + case DEGREE_90: + rotate = 270; + break; + case DEGREE_180: + rotate = 180; + break; + case DEGREE_270: + rotate = 90; + break; + default: + GST_WARNING_OBJECT( evaspixmapsink, "Unsupported rotation [%d]... set DEGREE 0.", + evaspixmapsink->rotate_angle ); + break; + } + + /* set display rotation */ + if (atom_rotation == None) { + atom_rotation = XInternAtom(evaspixmapsink->xcontext->disp, "_USER_WM_PORT_ATTRIBUTE_ROTATION", False); + } + + ret = XvSetPortAttribute(evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, atom_rotation, rotate); + if (ret != Success) { + GST_ERROR_OBJECT( evaspixmapsink, "XvSetPortAttribute failed[%d]. disp[%x],xv_port_id[%d],atom[%x],rotate[%d]", + ret, evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, atom_rotation, rotate ); + return FALSE; + } + + /* set display flip */ + if (atom_hflip == None) { + atom_hflip = XInternAtom(evaspixmapsink->xcontext->disp, "_USER_WM_PORT_ATTRIBUTE_HFLIP", False); + } + if (atom_vflip == None) { + atom_vflip = XInternAtom(evaspixmapsink->xcontext->disp, "_USER_WM_PORT_ATTRIBUTE_VFLIP", False); + } + + switch (evaspixmapsink->flip) { + case FLIP_HORIZONTAL: + set_hflip = TRUE; + set_vflip = FALSE; + break; + case FLIP_VERTICAL: + set_hflip = FALSE; + set_vflip = TRUE; + break; + case FLIP_BOTH: + set_hflip = TRUE; + set_vflip = TRUE; + break; + case FLIP_NONE: + default: + set_hflip = FALSE; + set_vflip = FALSE; + break; + } + GST_INFO_OBJECT(evaspixmapsink, "set rotate %d HFLIP %d, VFLIP %d", rotate, set_hflip, set_vflip); + + ret = XvSetPortAttribute(evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, atom_hflip, set_hflip); + if (ret != Success) { + GST_WARNING("set HFLIP failed[%d]. disp[%x],xv_port_id[%d],atom[%x],hflip[%d]", + ret, evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, atom_hflip, set_hflip); + } + ret = XvSetPortAttribute(evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, atom_vflip, set_vflip); + if (ret != Success) { + GST_WARNING("set VFLIP failed[%d]. disp[%x],xv_port_id[%d],atom[%x],vflip[%d]", + ret, evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, atom_vflip, set_vflip); + } + + } else { + result.x = result.y = 0; + result.w = evaspixmapsink->xpixmap[idx]->width; + result.h = evaspixmapsink->xpixmap[idx]->height; + GST_INFO_OBJECT (evaspixmapsink, "USE ORIGIN SIZE, no geometry method, no rotation/flip" ); + } + + g_mutex_lock (evaspixmapsink->x_lock); + + /* We scale to the pixmap's geometry */ +#ifdef HAVE_XSHM + if (evaspixmapsink->xcontext->use_xshm) { + GST_LOG_OBJECT (evaspixmapsink,"XvShmPutImage with image %dx%d and pixmap %dx%d, from xvimage %" + GST_PTR_FORMAT, + evaspixmapbuf->width, evaspixmapbuf->height, + evaspixmapsink->render_rect.w, evaspixmapsink->render_rect.h, evaspixmapbuf); + + /* Trim as proper size */ + if (src_input.w % 2 == 1) { + src_input.w += 1; + } + if (src_input.h % 2 == 1) { + src_input.h += 1; + } + + GST_LOG_OBJECT (evaspixmapsink, "screen[%dx%d],pixmap[%d,%d,%dx%d],method[%d],rotate[%d],src[%dx%d],dst[%d,%d,%dx%d],input[%d,%d,%dx%d],result[%d,%d,%dx%d]", + evaspixmapsink->scr_w, evaspixmapsink->scr_h, + evaspixmapsink->xpixmap[idx]->x, evaspixmapsink->xpixmap[idx]->y, evaspixmapsink->xpixmap[idx]->width, evaspixmapsink->xpixmap[idx]->height, + evaspixmapsink->display_geometry_method, rotate, + src_origin.w, src_origin.h, + dst.x, dst.y, dst.w, dst.h, + src_input.x, src_input.y, src_input.w, src_input.h, + result.x, result.y, result.w, result.h ); + + if (evaspixmapsink->visible) { + if (evaspixmapsink->buf_shared_type == BUF_SHARE_METHOD_FD) { + EVASPIXMAPSINK_SET_PIXMAP_ID_TO_GEM_INFO (evaspixmapsink, evaspixmapsink->xpixmap[idx]->pixmap); + } + ret = XvShmPutImage (evaspixmapsink->xcontext->disp, + evaspixmapsink->xcontext->xv_port_id, + evaspixmapsink->xpixmap[idx]->pixmap, + evaspixmapsink->xpixmap[idx]->gc, evaspixmapbuf->xvimage, + src_input.x, src_input.y, src_input.w, src_input.h, + result.x, result.y, result.w, result.h, FALSE); + GST_LOG_OBJECT (evaspixmapsink, "XvShmPutImage return value [%d]", ret ); + } else { + GST_WARNING_OBJECT (evaspixmapsink, "visible is FALSE. skip this image..." ); + } + } else +#endif /* HAVE_XSHM */ + { + if (evaspixmapsink->visible) { + XvPutImage (evaspixmapsink->xcontext->disp, + evaspixmapsink->xcontext->xv_port_id, + evaspixmapsink->xpixmap[idx]->pixmap, + evaspixmapsink->xpixmap[idx]->gc, evaspixmapbuf->xvimage, + evaspixmapsink->disp_x, evaspixmapsink->disp_y, + evaspixmapsink->disp_width, evaspixmapsink->disp_height, + result.x, result.y, result.w, result.h); + } else { + GST_WARNING_OBJECT (evaspixmapsink, "visible is FALSE. skip this image..." ); + } + } + XSync (evaspixmapsink->xcontext->disp, FALSE); + + g_mutex_unlock (evaspixmapsink->x_lock); + g_mutex_unlock (evaspixmapsink->flow_lock); + + MMTA_ACUM_ITEM_END("evaspixmapsink evaspixmap_buffer_put()", FALSE); + + return TRUE; +} + +static int +drm_init(GstEvasPixmapSink *evaspixmapsink) +{ + Display *dpy; + int i = 0; + int eventBase = 0; + int errorBase = 0; + int dri2Major = 0; + int dri2Minor = 0; + char *driverName = NULL; + char *deviceName = NULL; + struct drm_auth auth_arg = {0}; + + evaspixmapsink->drm_fd = -1; + + dpy = XOpenDisplay(0); + + /* DRI2 */ + if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) { + GST_ERROR_OBJECT (evaspixmapsink,"failed to DRI2QueryExtension()"); + goto ERROR_CASE; + } + + if (!DRI2QueryVersion(dpy, &dri2Major, &dri2Minor)) { + GST_ERROR_OBJECT (evaspixmapsink,"failed to DRI2QueryVersion"); + goto ERROR_CASE; + } + + if (!DRI2Connect(dpy, RootWindow(dpy, DefaultScreen(dpy)), &driverName, &deviceName)) { + GST_ERROR_OBJECT (evaspixmapsink,"failed to DRI2Connect"); + goto ERROR_CASE; + } + + if (!driverName || !deviceName) { + GST_ERROR_OBJECT (evaspixmapsink,"driverName or deviceName is not valid"); + goto ERROR_CASE; + } + + GST_INFO_OBJECT (evaspixmapsink,"Open drm device : %s", deviceName); + + /* get the drm_fd though opening the deviceName */ + evaspixmapsink->drm_fd = open(deviceName, O_RDWR); + if (evaspixmapsink->drm_fd < 0) { + GST_ERROR_OBJECT (evaspixmapsink,"cannot open drm device (%s)", deviceName); + goto ERROR_CASE; + } + + /* get magic from drm to authentication */ + if (ioctl(evaspixmapsink->drm_fd, DRM_IOCTL_GET_MAGIC, &auth_arg)) { + GST_ERROR_OBJECT (evaspixmapsink,"cannot get drm auth magic"); + close(evaspixmapsink->drm_fd); + evaspixmapsink->drm_fd = -1; + goto ERROR_CASE; + } + + if (!DRI2Authenticate(dpy, RootWindow(dpy, DefaultScreen(dpy)), auth_arg.magic)) { + GST_ERROR_OBJECT (evaspixmapsink,"cannot get drm authentication from X"); + close(evaspixmapsink->drm_fd); + evaspixmapsink->drm_fd = -1; + goto ERROR_CASE; + } + + /* init gem handle */ + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { + evaspixmapsink->gem_info[i].dmabuf_fd = 0; + evaspixmapsink->gem_info[i].gem_handle = 0; + evaspixmapsink->gem_info[i].gem_name = 0; + evaspixmapsink->gem_info[i].bo = 0; + evaspixmapsink->gem_info[i].ref_pixmap = 0; + } + + XCloseDisplay(dpy); + free(driverName); + free(deviceName); + + return 0; + +ERROR_CASE: + XCloseDisplay(dpy); + if (driverName) { + free(driverName); + } + if (deviceName) { + free(deviceName); + } + + return -1; +} + +static void +drm_fini(GstEvasPixmapSink *evaspixmapsink) +{ + if (evaspixmapsink->drm_fd >= 0) { + GST_INFO_OBJECT (evaspixmapsink,"close drm_fd(%d)", evaspixmapsink->drm_fd); + close(evaspixmapsink->drm_fd); + evaspixmapsink->drm_fd = -1; + } +} + +static unsigned int +drm_init_convert_dmabuf_gemname(GstEvasPixmapSink *evaspixmapsink, int dmabuf_fd) +{ + struct drm_prime_handle prime_arg = {0,}; + struct drm_gem_flink flink_arg = {0,}; + int i = 0; + + if (evaspixmapsink->drm_fd < 0) { + GST_ERROR_OBJECT (evaspixmapsink,"DRM is not opened"); + return 0; + } + + if (dmabuf_fd <= 0) { + GST_DEBUG_OBJECT (evaspixmapsink,"Ignore wrong dmabuf fd(%d)", dmabuf_fd); /* temporarily change log level to DEBUG for reducing WARNING level log */ + return 0; + } + + /* check duplicated dmabuf fd */ + for (i = 0 ; i < MAX_GEM_BUFFER_NUM ; i++) { + if (evaspixmapsink->gem_info[i].dmabuf_fd == dmabuf_fd) { + GST_LOG_OBJECT (evaspixmapsink,"already got fd(%u) with name(%u)", dmabuf_fd, evaspixmapsink->gem_info[i].gem_name); + return evaspixmapsink->gem_info[i].gem_name; + } + + if (evaspixmapsink->gem_info[i].dmabuf_fd == 0) { + GST_LOG_OBJECT (evaspixmapsink,"empty gem_info[%d] found", i); + break; + } + } + + if (i == MAX_GEM_BUFFER_NUM) { + GST_WARNING_OBJECT (evaspixmapsink,"too many buffers[dmabuf_fd(%d). skip it]", dmabuf_fd); + return 0; + } + + evaspixmapsink->gem_info[i].dmabuf_fd = dmabuf_fd; + prime_arg.fd = dmabuf_fd; + if (ioctl(evaspixmapsink->drm_fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &prime_arg)) { + GST_ERROR_OBJECT (evaspixmapsink,"non dmabuf fd(%d)", dmabuf_fd); + return 0; + } + + evaspixmapsink->gem_info[i].gem_handle = prime_arg.handle; + GST_LOG_OBJECT (evaspixmapsink,"gem_info[%d].gem_handle = %u", i, prime_arg.handle); + + flink_arg.handle = prime_arg.handle; + if (ioctl(evaspixmapsink->drm_fd, DRM_IOCTL_GEM_FLINK, &flink_arg)) { + GST_ERROR_OBJECT (evaspixmapsink,"cannot convert drm handle to name"); + return 0; + } + + evaspixmapsink->gem_info[i].gem_name = flink_arg.name; + GST_LOG_OBJECT (evaspixmapsink,"gem_info[%d].gem_name = %u", i, flink_arg.name); + + return flink_arg.name; +} + +static unsigned int +tbm_init_convert_bo_gemname(GstEvasPixmapSink *evaspixmapsink, tbm_bo bo) +{ + int i = 0; + + if (bo == NULL) { + GST_DEBUG_OBJECT (evaspixmapsink,"Ignore wrong bo(%u)", bo); /* temporarily change log level to DEBUG for reducing WARNING level log */ + return 0; + } + + /* check duplicated dmabuf bo */ + for (i = 0 ; i < MAX_GEM_BUFFER_NUM ; i++) { + if (evaspixmapsink->gem_info[i].bo == bo) { + GST_LOG_OBJECT (evaspixmapsink,"already got bo(%u) with name(%u)", bo, evaspixmapsink->gem_info[i].gem_name); + return evaspixmapsink->gem_info[i].gem_name; + } + + if (evaspixmapsink->gem_info[i].bo == 0) { + GST_LOG_OBJECT (evaspixmapsink,"empty gem_info[%d] found", i); + break; + } + } + + if (i == MAX_GEM_BUFFER_NUM) { + GST_WARNING_OBJECT (evaspixmapsink,"too many buffers[dmabuf_bo(%d). skip it]", bo); + return 0; + } + + evaspixmapsink->gem_info[i].bo = bo; + evaspixmapsink->gem_info[i].gem_name = tbm_bo_export(bo); + GST_LOG_OBJECT (evaspixmapsink,"gem_info[%d].gem_name = %u", i, evaspixmapsink->gem_info[i].gem_name); + + return evaspixmapsink->gem_info[i].gem_name; +} + +static void +drm_fini_close_gem_handle(GstEvasPixmapSink *evaspixmapsink, Pixmap pixmap_id) +{ + int i = 0; + if (evaspixmapsink->drm_fd >= 0) { + if (pixmap_id == 0) { + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { + if (evaspixmapsink->gem_info[i].dmabuf_fd > 0 || evaspixmapsink->gem_info[i].bo > 0) { + if (evaspixmapsink->buf_shared_type == BUF_SHARE_METHOD_FD) { + GST_INFO_OBJECT (evaspixmapsink,"close gem_handle(%u)", evaspixmapsink->gem_info[i].gem_handle); + drm_close_gem(evaspixmapsink, evaspixmapsink->gem_info[i].gem_handle); + } + evaspixmapsink->gem_info[i].dmabuf_fd = 0; + evaspixmapsink->gem_info[i].gem_handle = 0; + evaspixmapsink->gem_info[i].gem_name = 0; + evaspixmapsink->gem_info[i].bo = 0; + evaspixmapsink->gem_info[i].ref_pixmap = 0; + GST_LOG_OBJECT (evaspixmapsink,"gem_info[%d] is cleared",i); + } + } + } else { + for (i = 0; i < MAX_GEM_BUFFER_NUM; i++) { + if (evaspixmapsink->gem_info[i].ref_pixmap == pixmap_id) { + if (evaspixmapsink->buf_shared_type == BUF_SHARE_METHOD_FD) { + GST_INFO_OBJECT (evaspixmapsink,"close gem_handle(%u) for pixmap_id(%d)", + evaspixmapsink->gem_info[i].gem_handle, pixmap_id); + drm_close_gem(evaspixmapsink, evaspixmapsink->gem_info[i].gem_handle); + } + evaspixmapsink->gem_info[i].dmabuf_fd = 0; + evaspixmapsink->gem_info[i].gem_handle = 0; + evaspixmapsink->gem_info[i].gem_name = 0; + evaspixmapsink->gem_info[i].bo = 0; + evaspixmapsink->gem_info[i].ref_pixmap = 0; + GST_LOG_OBJECT (evaspixmapsink,"gem_info[%d] is cleared",i); + break; + } + } + } + } +} + +static void +drm_close_gem(GstEvasPixmapSink *evaspixmapsink, unsigned int gem_handle) +{ + struct drm_gem_close close_arg = {0,}; + + if (evaspixmapsink->drm_fd < 0) { + GST_ERROR_OBJECT (evaspixmapsink,"DRM is not opened"); + return; + } + + if (gem_handle == 0) { + GST_ERROR_OBJECT (evaspixmapsink,"invalid gem_handle(%d)",gem_handle); + return; + } + + close_arg.handle = gem_handle; + if (gem_handle > 0 && ioctl(evaspixmapsink->drm_fd, DRM_IOCTL_GEM_CLOSE, &close_arg)) { + GST_ERROR_OBJECT (evaspixmapsink,"cannot close drm gem handle(%d)", gem_handle); + return; + } + + return; +} + +/* This function destroys a GstXPixmap */ +static void +gst_evaspixmapsink_xpixmap_destroy (GstEvasPixmapSink *evaspixmapsink, GstXPixmap *xpixmap) +{ + g_return_if_fail (xpixmap != NULL); + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + g_mutex_lock (evaspixmapsink->x_lock); + + if(xpixmap->pixmap) { + GST_LOG_OBJECT (evaspixmapsink,"Free pixmap(%d)", xpixmap->pixmap); + XFreePixmap(evaspixmapsink->xcontext->disp, xpixmap->pixmap); + xpixmap->pixmap = 0; + } + + if (xpixmap->gc) { + XFreeGC (evaspixmapsink->xcontext->disp, xpixmap->gc); + } + + XSync (evaspixmapsink->xcontext->disp, FALSE); + + g_mutex_unlock (evaspixmapsink->x_lock); + + g_free (xpixmap); +} + +static void +gst_evaspixmapsink_xpixmap_update_geometry (GstEvasPixmapSink *evaspixmapsink, int idx) +{ + Window root_window; + XWindowAttributes root_attr; + + int cur_pixmap_x = 0; + int cur_pixmap_y = 0; + unsigned int cur_pixmap_width = 0; + unsigned int cur_pixmap_height = 0; + unsigned int cur_pixmap_border_width = 0; + unsigned int cur_pixmap_depth = 0; + + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + /* Update the window geometry */ + g_mutex_lock (evaspixmapsink->x_lock); + if (G_UNLIKELY (evaspixmapsink->xpixmap[idx] == NULL)) { + g_mutex_unlock (evaspixmapsink->x_lock); + return; + } + + /* Get root window and size of current pixmap */ + XGetGeometry( evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[idx]->pixmap, &root_window, + &cur_pixmap_x, &cur_pixmap_y, /* relative x, y, for pixmap these are alway 0 */ + &cur_pixmap_width, &cur_pixmap_height, + &cur_pixmap_border_width, &cur_pixmap_depth ); /* cur_pixmap_border_width, cur_pixmap_depth are not used */ + + evaspixmapsink->xpixmap[idx]->width = cur_pixmap_width; + evaspixmapsink->xpixmap[idx]->height = cur_pixmap_height; + + evaspixmapsink->xpixmap[idx]->x = cur_pixmap_x; + evaspixmapsink->xpixmap[idx]->y = cur_pixmap_y; + + /* Get size of root window == size of screen */ + XGetWindowAttributes(evaspixmapsink->xcontext->disp, root_window, &root_attr); + + evaspixmapsink->scr_w = root_attr.width; + evaspixmapsink->scr_h = root_attr.height; + + if (!evaspixmapsink->have_render_rect) { + evaspixmapsink->render_rect.x = evaspixmapsink->render_rect.y = 0; + evaspixmapsink->render_rect.w = cur_pixmap_width; + evaspixmapsink->render_rect.h = cur_pixmap_height; + } + + GST_LOG_OBJECT (evaspixmapsink,"screen size %dx%d, current pixmap geometry %d,%d,%dx%d, render_rect %d,%d,%dx%d", + evaspixmapsink->scr_w, evaspixmapsink->scr_h, + evaspixmapsink->xpixmap[idx]->x, evaspixmapsink->xpixmap[idx]->y, + evaspixmapsink->xpixmap[idx]->width, evaspixmapsink->xpixmap[idx]->height, + evaspixmapsink->render_rect.x, evaspixmapsink->render_rect.y, + evaspixmapsink->render_rect.w, evaspixmapsink->render_rect.h); + + g_mutex_unlock (evaspixmapsink->x_lock); +} + +static void +gst_evaspixmapsink_xpixmap_clear (GstEvasPixmapSink *evaspixmapsink, GstXPixmap *xpixmap) +{ + g_return_if_fail (xpixmap != NULL); + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + if (!xpixmap->pixmap) { + GST_WARNING_OBJECT (evaspixmapsink,"pixmap was not created.."); + return; + } + + g_mutex_lock (evaspixmapsink->x_lock); + + if (!evaspixmapsink->xcontext) { + GST_WARNING_OBJECT (evaspixmapsink,"xcontext is null.."); + g_mutex_unlock (evaspixmapsink->x_lock); + return; + } + + if (evaspixmapsink->stop_video) { + XvStopVideo (evaspixmapsink->xcontext->disp, evaspixmapsink->xcontext->xv_port_id, xpixmap->pixmap); + } + XSync (evaspixmapsink->xcontext->disp, FALSE); + + g_mutex_unlock (evaspixmapsink->x_lock); + + g_mutex_lock (evaspixmapsink->pixmap_ref_lock); + evaspixmapsink->last_updated_idx = -1; + xpixmap->ref = 0; + xpixmap->damaged_time = 0; + g_mutex_unlock (evaspixmapsink->pixmap_ref_lock); +} + +/* This function commits our internal colorbalance settings to our grabbed Xv + port. If the xcontext is not initialized yet it simply returns */ +static void +gst_evaspixmapsink_update_colorbalance (GstEvasPixmapSink *evaspixmapsink) +{ + GList *channels = NULL; + + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + /* If we haven't initialized the X context we can't update anything */ + if (evaspixmapsink->xcontext == NULL) + return; + + /* Don't set the attributes if they haven't been changed, to avoid + * rounding errors changing the values */ + if (!evaspixmapsink->cb_changed) + return; + + /* For each channel of the colorbalance we calculate the correct value + doing range conversion and then set the Xv port attribute to match our + values. */ + channels = evaspixmapsink->xcontext->channels_list; + + while (channels) { + if (channels->data && GST_IS_COLOR_BALANCE_CHANNEL (channels->data)) { + GstColorBalanceChannel *channel = NULL; + Atom prop_atom; + gint value = 0; + gdouble convert_coef; + + channel = GST_COLOR_BALANCE_CHANNEL (channels->data); + g_object_ref (channel); + + /* Our range conversion coef */ + convert_coef = (channel->max_value - channel->min_value) / 2000.0; + + if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0) { + value = evaspixmapsink->hue; + } else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0) { + value = evaspixmapsink->saturation; + } else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0) { + value = evaspixmapsink->contrast; + } else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0) { + value = evaspixmapsink->brightness; + } else { + g_warning ("got an unknown channel %s", channel->label); + g_object_unref (channel); + return; + } + + /* Committing to Xv port */ + g_mutex_lock (evaspixmapsink->x_lock); + prop_atom = + XInternAtom (evaspixmapsink->xcontext->disp, channel->label, True); + if (prop_atom != None) { + int xv_value; + xv_value = + floor (0.5 + (value + 1000) * convert_coef + channel->min_value); + XvSetPortAttribute (evaspixmapsink->xcontext->disp, + evaspixmapsink->xcontext->xv_port_id, prop_atom, xv_value); + } + g_mutex_unlock (evaspixmapsink->x_lock); + + g_object_unref (channel); + } + channels = g_list_next (channels); + } +} + +static void +gst_lookup_xv_port_from_adaptor (GstXContext *xcontext, XvAdaptorInfo *adaptors, int adaptor_no) +{ + gint j; + gint res; + + /* Do we support XvImageMask ? */ + if (!(adaptors[adaptor_no].type & XvImageMask)) { + GST_DEBUG ("XV Adaptor %s has no support for XvImageMask", adaptors[adaptor_no].name); + return; + } + + /* We found such an adaptor, looking for an available port */ + for (j = 0; j < adaptors[adaptor_no].num_ports && !xcontext->xv_port_id; j++) { + /* We try to grab the port */ + res = XvGrabPort (xcontext->disp, adaptors[adaptor_no].base_id + j, 0); + if (Success == res) { + xcontext->xv_port_id = adaptors[adaptor_no].base_id + j; + GST_DEBUG ("XV Adaptor %s with %ld ports", adaptors[adaptor_no].name, adaptors[adaptor_no].num_ports); + } else { + GST_DEBUG ("GrabPort %d for XV Adaptor %s failed: %d", j, adaptors[adaptor_no].name, res); + } + } +} + +/* This function generates a caps with all supported format by the first + Xv grabable port we find. We store each one of the supported formats in a + format list and append the format to a newly created caps that we return + If this function does not return NULL because of an error, it also grabs + the port via XvGrabPort */ +static GstCaps* +gst_evaspixmapsink_get_xv_support (GstEvasPixmapSink *evaspixmapsink, GstXContext *xcontext) +{ + gint i; + XvAdaptorInfo *adaptors; + gint nb_formats; + XvImageFormatValues *formats = NULL; + guint nb_encodings; + XvEncodingInfo *encodings = NULL; + gulong max_w = G_MAXINT, max_h = G_MAXINT; + GstCaps *caps = NULL; + GstCaps *rgb_caps = NULL; + + g_return_val_if_fail (xcontext != NULL, NULL); + + /* First let's check that XVideo extension is available */ + if (!XQueryExtension (xcontext->disp, "XVideo", &i, &i, &i)) { + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, SETTINGS, + ("Could not initialise Xv output"), + ("XVideo extension is not available")); + return NULL; + } + + /* Then we get adaptors list */ + if (Success != XvQueryAdaptors (xcontext->disp, xcontext->root, + &xcontext->nb_adaptors, &adaptors)) { + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, SETTINGS, + ("Could not initialise Xv output"), + ("Failed getting XV adaptors list")); + return NULL; + } + + xcontext->xv_port_id = 0; + + GST_DEBUG_OBJECT (evaspixmapsink,"Found %u XV adaptor(s)", xcontext->nb_adaptors); + + xcontext->adaptors = + (gchar **) g_malloc0 (xcontext->nb_adaptors * sizeof (gchar *)); + + /* Now fill up our adaptor name array */ + for (i = 0; i < xcontext->nb_adaptors; i++) { + xcontext->adaptors[i] = g_strdup (adaptors[i].name); + } + + if (evaspixmapsink->adaptor_no < xcontext->nb_adaptors) { + /* Find xv port from user defined adaptor */ + gst_lookup_xv_port_from_adaptor (xcontext, adaptors, evaspixmapsink->adaptor_no); + } + + if (!xcontext->xv_port_id) { + /* Now search for an adaptor that supports XvImageMask */ + for (i = 0; i < xcontext->nb_adaptors && !xcontext->xv_port_id; i++) { + gst_lookup_xv_port_from_adaptor (xcontext, adaptors, i); + evaspixmapsink->adaptor_no = i; + } + } + + XvFreeAdaptorInfo (adaptors); + + if (!xcontext->xv_port_id) { + evaspixmapsink->adaptor_no = -1; + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, BUSY, + ("Could not initialise Xv output"), ("No port available")); + return NULL; + } + + /* Set XV_AUTOPAINT_COLORKEY and XV_DOUBLE_BUFFER and XV_COLORKEY */ + { + int count, todo = 3; + XvAttribute *const attr = XvQueryPortAttributes (xcontext->disp, + xcontext->xv_port_id, &count); + static const char autopaint[] = "XV_AUTOPAINT_COLORKEY"; + static const char dbl_buffer[] = "XV_DOUBLE_BUFFER"; + static const char colorkey[] = "XV_COLORKEY"; + + GST_DEBUG_OBJECT (evaspixmapsink,"Checking %d Xv port attributes", count); + + evaspixmapsink->have_autopaint_colorkey = FALSE; + evaspixmapsink->have_double_buffer = FALSE; + evaspixmapsink->have_colorkey = FALSE; + + for (i = 0; ((i < count) && todo); i++) + if (!strcmp (attr[i].name, autopaint)) { + const Atom atom = XInternAtom (xcontext->disp, autopaint, False); + + /* turn on autopaint colorkey */ + XvSetPortAttribute (xcontext->disp, xcontext->xv_port_id, atom, + (evaspixmapsink->autopaint_colorkey ? 1 : 0)); + todo--; + evaspixmapsink->have_autopaint_colorkey = TRUE; + } else if (!strcmp (attr[i].name, dbl_buffer)) { + const Atom atom = XInternAtom (xcontext->disp, dbl_buffer, False); + + XvSetPortAttribute (xcontext->disp, xcontext->xv_port_id, atom, + (evaspixmapsink->double_buffer ? 1 : 0)); + todo--; + evaspixmapsink->have_double_buffer = TRUE; + } else if (!strcmp (attr[i].name, colorkey)) { + /* Set the colorkey, default is something that is dark but hopefully + * won't randomly appear on the screen elsewhere (ie not black or greys) + * can be overridden by setting "colorkey" property + */ + const Atom atom = XInternAtom (xcontext->disp, colorkey, False); + guint32 ckey = 0; + gboolean set_attr = TRUE; + guint cr, cg, cb; + + /* set a colorkey in the right format RGB565/RGB888 + * We only handle these 2 cases, because they're the only types of + * devices we've encountered. If we don't recognise it, leave it alone + */ + cr = (evaspixmapsink->colorkey >> 16); + cg = (evaspixmapsink->colorkey >> 8) & 0xFF; + cb = (evaspixmapsink->colorkey) & 0xFF; + switch (xcontext->depth) { + case 16: /* RGB 565 */ + cr >>= 3; + cg >>= 2; + cb >>= 3; + ckey = (cr << 11) | (cg << 5) | cb; + break; + case 24: + case 32: /* RGB 888 / ARGB 8888 */ + ckey = (cr << 16) | (cg << 8) | cb; + break; + default: + GST_DEBUG_OBJECT (evaspixmapsink,"Unknown bit depth %d for Xv Colorkey - not adjusting", xcontext->depth); + set_attr = FALSE; + break; + } + + if (set_attr) { + ckey = CLAMP (ckey, (guint32) attr[i].min_value, + (guint32) attr[i].max_value); + GST_LOG_OBJECT (evaspixmapsink,"Setting color key for display depth %d to 0x%x", xcontext->depth, ckey); + + XvSetPortAttribute (xcontext->disp, xcontext->xv_port_id, atom, + (gint) ckey); + } + todo--; + evaspixmapsink->have_colorkey = TRUE; + } + + XFree (attr); + } + + /* Get the list of encodings supported by the adapter and look for the + * XV_IMAGE encoding so we can determine the maximum width and height + * supported */ + XvQueryEncodings (xcontext->disp, xcontext->xv_port_id, &nb_encodings, + &encodings); + + for (i = 0; i < nb_encodings; i++) { + GST_LOG_OBJECT (evaspixmapsink, + "Encoding %d, name %s, max wxh %lux%lu rate %d/%d", + i, encodings[i].name, encodings[i].width, encodings[i].height, + encodings[i].rate.numerator, encodings[i].rate.denominator); + if (strcmp (encodings[i].name, "XV_IMAGE") == 0) { + max_w = encodings[i].width; + max_h = encodings[i].height; + evaspixmapsink->scr_w = max_w; + evaspixmapsink->scr_h = max_h; + } + } + + XvFreeEncodingInfo (encodings); + + /* We get all image formats supported by our port */ + formats = XvListImageFormats (xcontext->disp, + xcontext->xv_port_id, &nb_formats); + caps = gst_caps_new_empty (); + for (i = 0; i < nb_formats; i++) { + GstCaps *format_caps = NULL; + gboolean is_rgb_format = FALSE; + + /* We set the image format of the xcontext to an existing one. This + is just some valid image format for making our xshm calls check before + caps negotiation really happens. */ + xcontext->im_format = formats[i].id; + + switch (formats[i].type) { + case XvRGB: + { + XvImageFormatValues *fmt = &(formats[i]); + gint endianness = G_BIG_ENDIAN; + + if (fmt->byte_order == LSBFirst) { + /* our caps system handles 24/32bpp RGB as big-endian. */ + if (fmt->bits_per_pixel == 24 || fmt->bits_per_pixel == 32) { + fmt->red_mask = GUINT32_TO_BE (fmt->red_mask); + fmt->green_mask = GUINT32_TO_BE (fmt->green_mask); + fmt->blue_mask = GUINT32_TO_BE (fmt->blue_mask); + + if (fmt->bits_per_pixel == 24) { + fmt->red_mask >>= 8; + fmt->green_mask >>= 8; + fmt->blue_mask >>= 8; + } + } else + endianness = G_LITTLE_ENDIAN; + } + + format_caps = gst_caps_new_simple ("video/x-raw-rgb", + "format", GST_TYPE_FOURCC, formats[i].id, + "endianness", G_TYPE_INT, endianness, + "depth", G_TYPE_INT, fmt->depth, + "bpp", G_TYPE_INT, fmt->bits_per_pixel, + "red_mask", G_TYPE_INT, fmt->red_mask, + "green_mask", G_TYPE_INT, fmt->green_mask, + "blue_mask", G_TYPE_INT, fmt->blue_mask, + "width", GST_TYPE_INT_RANGE, 1, max_w, + "height", GST_TYPE_INT_RANGE, 1, max_h, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + + is_rgb_format = TRUE; + break; + } + case XvYUV: + format_caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, formats[i].id, + "width", GST_TYPE_INT_RANGE, 1, max_w, + "height", GST_TYPE_INT_RANGE, 1, max_h, + "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL); + break; + default: + g_assert_not_reached (); + break; + } + + if (format_caps) { + GstEvasPixmapFormat *format = NULL; + + format = g_new0 (GstEvasPixmapFormat, 1); + if (format) { + format->format = formats[i].id; + format->caps = gst_caps_copy (format_caps); + xcontext->formats_list = g_list_append (xcontext->formats_list, format); + } + + if (is_rgb_format) { + if (rgb_caps == NULL) + rgb_caps = format_caps; + else + gst_caps_append (rgb_caps, format_caps); + } else + gst_caps_append (caps, format_caps); + } + } + + /* Collected all caps into either the caps or rgb_caps structures. + * Append rgb_caps on the end of YUV, so that YUV is always preferred */ + if (rgb_caps) + gst_caps_append (caps, rgb_caps); + + if (formats) + XFree (formats); + + GST_DEBUG_OBJECT (evaspixmapsink,"Generated the following caps: %" GST_PTR_FORMAT, caps); + + if (gst_caps_is_empty (caps)) { + gst_caps_unref (caps); + XvUngrabPort (xcontext->disp, xcontext->xv_port_id, 0); + GST_ELEMENT_ERROR (evaspixmapsink, STREAM, WRONG_TYPE, (NULL), + ("No supported format found")); + return NULL; + } + + return caps; +} + +static gpointer +gst_evaspixmapsink_event_thread (GstEvasPixmapSink * evaspixmapsink) +{ + g_return_val_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink), NULL); + int damage_base = 0; + int damage_err_base = 0; + int damage_case = 0; + XEvent e; + int i = 0; + Display *disp = NULL; + + GST_OBJECT_LOCK (evaspixmapsink); + + if (evaspixmapsink->xcontext && evaspixmapsink->xcontext->disp) { + disp = evaspixmapsink->xcontext->disp; + } else { + GST_ERROR_OBJECT (evaspixmapsink,"evaspixmapsink->xcontext(->disp) is not ready"); + return NULL; + } + + if (!XDamageQueryExtension(evaspixmapsink->xcontext->disp, &damage_base, &damage_err_base)) { + GST_ERROR_OBJECT (evaspixmapsink,"XDamageQueryExtension() failed"); + return NULL; + } + damage_case = (int)damage_base + XDamageNotify; + + while (evaspixmapsink->running) { + GST_OBJECT_UNLOCK (evaspixmapsink); + + g_mutex_lock (evaspixmapsink->x_lock); + while (XPending (disp)) { + XNextEvent (disp, &e); + g_mutex_unlock (evaspixmapsink->x_lock); + if (e.type == damage_case ) { + XDamageNotifyEvent *damage_ev = (XDamageNotifyEvent *)&e; + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + GstXPixmap *xpixmap = evaspixmapsink->xpixmap[i]; + if (xpixmap && damage_ev->drawable == xpixmap->pixmap) { + g_mutex_lock(evaspixmapsink->pixmap_ref_lock); + if (xpixmap->ref) { + /* set it only if damage event comes from _buffer_put() */ + xpixmap->damaged_time = (gint)get_millis_time(); + } + g_mutex_unlock(evaspixmapsink->pixmap_ref_lock); + GST_DEBUG_OBJECT (evaspixmapsink,"event_handler : got a damage event for pixmap(%d), refcount(%d), damaged_time(%d)", + xpixmap->pixmap, xpixmap->ref, xpixmap->damaged_time); + if (evaspixmapsink->epipe_request_count > EPIPE_REQUEST_LIMIT) { + GST_WARNING_OBJECT (evaspixmapsink,"event_handler : epipe_request_count(%d), skip ecore_pipe_write()", evaspixmapsink->epipe_request_count); + } else { + __ta__("evaspixmapsink ecore_pipe_write", ecore_pipe_write(evaspixmapsink->epipe, evaspixmapsink, sizeof(GstEvasPixmapSink));); + evaspixmapsink->epipe_request_count++; + GST_DEBUG_OBJECT (evaspixmapsink,"event_handler : after call ecore_pipe_write() for pixmap(%d)", xpixmap->pixmap); + } + g_mutex_lock (evaspixmapsink->x_lock); + XDamageSubtract (evaspixmapsink->xcontext->disp, evaspixmapsink->damage[i], None, None ); + g_mutex_unlock (evaspixmapsink->x_lock); + + if (evaspixmapsink->buf_shared_type == BUF_SHARE_METHOD_FD) { + if (GST_STATE(evaspixmapsink) == GST_STATE_PLAYING) { + drm_fini_close_gem_handle(evaspixmapsink, xpixmap->pixmap); + } + } + break; + } + } + if (i == evaspixmapsink->num_of_pixmaps) { + GST_WARNING_OBJECT (evaspixmapsink,"event_handler : could not find corresponding pixmap with this damage event(%d)", damage_ev->drawable); + } + } else { + GST_LOG_OBJECT (evaspixmapsink,"event_handler : unidentified event(%d)", e.type); + g_mutex_lock (evaspixmapsink->x_lock); + continue; + } + g_mutex_lock (evaspixmapsink->x_lock); + } + //XSync (disp, FALSE); + g_mutex_unlock (evaspixmapsink->x_lock); + + g_usleep (G_USEC_PER_SEC / 40); + GST_OBJECT_LOCK (evaspixmapsink); + } + GST_OBJECT_UNLOCK (evaspixmapsink); + return NULL; +} + +static void +gst_evaspixmapsink_manage_event_thread (GstEvasPixmapSink *evaspixmapsink) +{ + /* don't start the thread too early */ + if (evaspixmapsink->xcontext == NULL) { + GST_ERROR_OBJECT (evaspixmapsink,"xcontext is NULL.."); + return; + } + + GST_OBJECT_LOCK (evaspixmapsink); + + if (!evaspixmapsink->event_thread) { + /* Setup our event listening thread */ + GST_DEBUG_OBJECT (evaspixmapsink,"run xevent thread"); + evaspixmapsink->running = TRUE; + evaspixmapsink->event_thread = g_thread_create ( (GThreadFunc) gst_evaspixmapsink_event_thread, evaspixmapsink, TRUE, NULL); + } else { + GST_WARNING_OBJECT (evaspixmapsink,"there already existed the event_thread.. keep going"); + /* Do not finalize the thread in here, Only finalize the thread by calling gst_evaspixmapsink_reset() */ + } + + GST_OBJECT_UNLOCK (evaspixmapsink); +} + + +/* This function calculates the pixel aspect ratio based on the properties + * in the xcontext structure and stores it there. */ +static void +gst_evaspixmapsink_calculate_pixel_aspect_ratio (GstXContext *xcontext) +{ + static const gint par[][2] = { + {1, 1}, /* regular screen */ + {16, 15}, /* PAL TV */ + {11, 10}, /* 525 line Rec.601 video */ + {54, 59}, /* 625 line Rec.601 video */ + {64, 45}, /* 1280x1024 on 16:9 display */ + {5, 3}, /* 1280x1024 on 4:3 display */ + {4, 3} /* 800x600 on 16:9 display */ + }; + gint i; + gint index; + gdouble ratio; + gdouble delta; + +#define DELTA(idx) (ABS (ratio - ((gdouble) par[idx][0] / par[idx][1]))) + + /* first calculate the "real" ratio based on the X values; + * which is the "physical" w/h divided by the w/h in pixels of the display */ + ratio = (gdouble) (xcontext->widthmm * xcontext->height) + / (xcontext->heightmm * xcontext->width); + + /* DirectFB's X in 720x576 reports the physical dimensions wrong, so + * override here */ + if (xcontext->width == 720 && xcontext->height == 576) { + ratio = 4.0 * 576 / (3.0 * 720); + } + GST_DEBUG ("calculated pixel aspect ratio: %f", ratio); + /* now find the one from par[][2] with the lowest delta to the real one */ + delta = DELTA (0); + index = 0; + + for (i = 1; i < sizeof (par) / (sizeof (gint) * 2); ++i) { + gdouble this_delta = DELTA (i); + + if (this_delta < delta) { + index = i; + delta = this_delta; + } + } + + GST_DEBUG ("Decided on index %d (%d/%d)", index, + par[index][0], par[index][1]); + + g_free (xcontext->par); + xcontext->par = g_new0 (GValue, 1); + g_value_init (xcontext->par, GST_TYPE_FRACTION); + gst_value_set_fraction (xcontext->par, par[index][0], par[index][1]); + GST_DEBUG ("set xcontext PAR to %d/%d", + gst_value_get_fraction_numerator (xcontext->par), + gst_value_get_fraction_denominator (xcontext->par)); +} + +/* This function gets the X Display and global info about it. Everything is + stored in our object and will be cleaned when the object is disposed. Note + here that caps for supported format are generated without any window or + image creation */ +static GstXContext* +gst_evaspixmapsink_xcontext_get (GstEvasPixmapSink *evaspixmapsink) +{ + GstXContext *xcontext = NULL; + XPixmapFormatValues *px_formats = NULL; + gint nb_formats = 0, i, j, N_attr; + XvAttribute *xv_attr; + Atom prop_atom; + const char *channels[4] = { "XV_HUE", "XV_SATURATION", "XV_BRIGHTNESS", "XV_CONTRAST"}; + + g_return_val_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink), NULL); + + xcontext = g_new0 (GstXContext, 1); + xcontext->im_format = 0; + + g_mutex_lock (evaspixmapsink->x_lock); + + xcontext->disp = XOpenDisplay (evaspixmapsink->display_name); + + if (!xcontext->disp) { + g_mutex_unlock (evaspixmapsink->x_lock); + g_free (xcontext); + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE, ("Could not initialise Xv output"), ("Could not open display")); + return NULL; + } + + xcontext->screen = DefaultScreenOfDisplay (xcontext->disp); + xcontext->screen_num = DefaultScreen (xcontext->disp); + xcontext->visual = DefaultVisual (xcontext->disp, xcontext->screen_num); + xcontext->root = DefaultRootWindow (xcontext->disp); + xcontext->white = XWhitePixel (xcontext->disp, xcontext->screen_num); + xcontext->black = XBlackPixel (xcontext->disp, xcontext->screen_num); + xcontext->depth = DefaultDepthOfScreen (xcontext->screen); + + xcontext->width = DisplayWidth (xcontext->disp, xcontext->screen_num); + xcontext->height = DisplayHeight (xcontext->disp, xcontext->screen_num); + xcontext->widthmm = DisplayWidthMM (xcontext->disp, xcontext->screen_num); + xcontext->heightmm = DisplayHeightMM (xcontext->disp, xcontext->screen_num); + + GST_DEBUG_OBJECT (evaspixmapsink,"X reports %dx%d pixels and %d mm x %d mm", xcontext->width, xcontext->height, xcontext->widthmm, xcontext->heightmm); + + gst_evaspixmapsink_calculate_pixel_aspect_ratio (xcontext); + /* We get supported pixmap formats at supported depth */ + px_formats = XListPixmapFormats (xcontext->disp, &nb_formats); + + if (!px_formats) { + XCloseDisplay (xcontext->disp); + g_mutex_unlock (evaspixmapsink->x_lock); + g_free (xcontext->par); + g_free (xcontext); + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, SETTINGS, + ("Could not initialise Xv output"), ("Could not get pixel formats")); + return NULL; + } + + /* We get bpp value corresponding to our running depth */ + for (i = 0; i < nb_formats; i++) { + if (px_formats[i].depth == xcontext->depth) + xcontext->bpp = px_formats[i].bits_per_pixel; + } + + XFree (px_formats); + + xcontext->endianness = (ImageByteOrder (xcontext->disp) == LSBFirst) ? G_LITTLE_ENDIAN : G_BIG_ENDIAN; + + /* our caps system handles 24/32bpp RGB as big-endian. */ + if ((xcontext->bpp == 24 || xcontext->bpp == 32) && xcontext->endianness == G_LITTLE_ENDIAN) { + xcontext->endianness = G_BIG_ENDIAN; + xcontext->visual->red_mask = GUINT32_TO_BE (xcontext->visual->red_mask); + xcontext->visual->green_mask = GUINT32_TO_BE (xcontext->visual->green_mask); + xcontext->visual->blue_mask = GUINT32_TO_BE (xcontext->visual->blue_mask); + if (xcontext->bpp == 24) { + xcontext->visual->red_mask >>= 8; + xcontext->visual->green_mask >>= 8; + xcontext->visual->blue_mask >>= 8; + } + } + + xcontext->caps = gst_evaspixmapsink_get_xv_support (evaspixmapsink, xcontext); + + if (!xcontext->caps) { + XCloseDisplay (xcontext->disp); + g_mutex_unlock (evaspixmapsink->x_lock); + g_free (xcontext->par); + g_free (xcontext); + /* GST_ELEMENT_ERROR is thrown by gst_evaspixmapsink_get_xv_support */ + return NULL; + } +#ifdef HAVE_XSHM + /* Search for XShm extension support */ + if (XShmQueryExtension (xcontext->disp) && gst_evaspixmapsink_check_xshm_calls (xcontext)) { + xcontext->use_xshm = TRUE; + GST_DEBUG_OBJECT (evaspixmapsink,"evaspixmapsink is using XShm extension"); + } else +#endif /* HAVE_XSHM */ + { + xcontext->use_xshm = FALSE; + GST_DEBUG_OBJECT (evaspixmapsink,"evaspixmapsink is not using XShm extension"); + } + + xv_attr = XvQueryPortAttributes (xcontext->disp, xcontext->xv_port_id, &N_attr); + + /* Generate the channels list */ + for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) { + XvAttribute *matching_attr = NULL; + + /* Retrieve the property atom if it exists. If it doesn't exist, + * the attribute itself must not either, so we can skip */ + prop_atom = XInternAtom (xcontext->disp, channels[i], True); + if (prop_atom == None) { + continue; + } + + if (xv_attr != NULL) { + for (j = 0; j < N_attr && matching_attr == NULL; ++j) { + if (!g_ascii_strcasecmp (channels[i], xv_attr[j].name)) { + matching_attr = xv_attr + j; + } + } + } + + if (matching_attr) { + GstColorBalanceChannel *channel; + channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); + channel->label = g_strdup (channels[i]); + channel->min_value = matching_attr->min_value; + channel->max_value = matching_attr->max_value; + + xcontext->channels_list = g_list_append (xcontext->channels_list, channel); + + /* If the colorbalance settings have not been touched we get Xv values + as defaults and update our internal variables */ + if (!evaspixmapsink->cb_changed) { + gint val; + XvGetPortAttribute (xcontext->disp, xcontext->xv_port_id, prop_atom, &val); + /* Normalize val to [-1000, 1000] */ + val = floor (0.5 + -1000 + 2000 * (val - channel->min_value) / (double) (channel->max_value - channel->min_value)); + + if (!g_ascii_strcasecmp (channels[i], "XV_HUE")) { + evaspixmapsink->hue = val; + } else if (!g_ascii_strcasecmp (channels[i], "XV_SATURATION")) { + evaspixmapsink->saturation = val; + } else if (!g_ascii_strcasecmp (channels[i], "XV_BRIGHTNESS")) { + evaspixmapsink->brightness = val; + } else if (!g_ascii_strcasecmp (channels[i], "XV_CONTRAST")) { + evaspixmapsink->contrast = val; + } + } + } + } + + if (xv_attr) { + XFree (xv_attr); + } + + g_mutex_unlock (evaspixmapsink->x_lock); + + return xcontext; +} + +/* This function cleans the X context. Closing the Display, releasing the XV + port and unrefing the caps for supported formats. */ +static void +gst_evaspixmapsink_xcontext_clear (GstEvasPixmapSink *evaspixmapsink) +{ + GList *formats_list, *channels_list; + GstXContext *xcontext; + gint i = 0; + + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + + GST_OBJECT_LOCK (evaspixmapsink); + if (evaspixmapsink->xcontext == NULL) { + GST_OBJECT_UNLOCK (evaspixmapsink); + return; + } + + /* Take the XContext from the sink and clean it up */ + xcontext = evaspixmapsink->xcontext; + evaspixmapsink->xcontext = NULL; + + GST_OBJECT_UNLOCK (evaspixmapsink); + + formats_list = xcontext->formats_list; + + while (formats_list) { + GstEvasPixmapFormat *format = formats_list->data; + + gst_caps_unref (format->caps); + g_free (format); + formats_list = g_list_next (formats_list); + } + + if (xcontext->formats_list) + g_list_free (xcontext->formats_list); + + channels_list = xcontext->channels_list; + + while (channels_list) { + GstColorBalanceChannel *channel = channels_list->data; + + g_object_unref (channel); + channels_list = g_list_next (channels_list); + } + + if (xcontext->channels_list) + g_list_free (xcontext->channels_list); + + gst_caps_unref (xcontext->caps); + + for (i = 0; i < xcontext->nb_adaptors; i++) { + g_free (xcontext->adaptors[i]); + } + + g_free (xcontext->adaptors); + + g_free (xcontext->par); + + g_mutex_lock (evaspixmapsink->x_lock); + + GST_DEBUG_OBJECT (evaspixmapsink,"Closing display and freeing X Context"); + + XvUngrabPort (xcontext->disp, xcontext->xv_port_id, 0); + + XCloseDisplay (xcontext->disp); + + g_mutex_unlock (evaspixmapsink->x_lock); + + g_free (xcontext); +} + +/* Element stuff */ + +/* This function tries to get a format matching with a given caps in the + supported list of formats we generated in gst_evaspixmapsink_get_xv_support */ +static gint +gst_evaspixmapsink_get_format_from_caps (GstEvasPixmapSink *evaspixmapsink, GstCaps *caps) +{ + GList *list = NULL; + + g_return_val_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink), 0); + + list = evaspixmapsink->xcontext->formats_list; + + while (list) { + GstEvasPixmapFormat *format = list->data; + + if (format) { + if (gst_caps_can_intersect (caps, format->caps)) { + return format->format; + } + } + list = g_list_next (list); + } + + return -1; +} + +static GstCaps * +gst_evaspixmapsink_getcaps (GstBaseSink *bsink) +{ + GstEvasPixmapSink *evaspixmapsink; + + evaspixmapsink = GST_EVASPIXMAPSINK (bsink); + + if (evaspixmapsink->xcontext) + return gst_caps_ref (evaspixmapsink->xcontext->caps); + + return + gst_caps_copy (gst_pad_get_pad_template_caps (GST_VIDEO_SINK_PAD + (evaspixmapsink))); +} + +static gboolean +gst_evaspixmapsink_setcaps (GstBaseSink *bsink, GstCaps *caps) +{ + GstEvasPixmapSink *evaspixmapsink; + GstStructure *structure; + guint32 im_format = 0; + gboolean ret; + gint video_width, video_height; + gint disp_x, disp_y; + gint disp_width, disp_height; + gint video_par_n, video_par_d; /* video's PAR */ + gint display_par_n, display_par_d; /* display's PAR */ + const GValue *caps_par; + const GValue *caps_disp_reg; + const GValue *fps; + guint num, den; + gboolean enable_last_buffer; + + evaspixmapsink = GST_EVASPIXMAPSINK (bsink); + + GST_DEBUG_OBJECT (evaspixmapsink,"In setcaps. Possible caps %" GST_PTR_FORMAT ", setting caps %" GST_PTR_FORMAT, evaspixmapsink->xcontext->caps, caps); + + if (!gst_caps_can_intersect (evaspixmapsink->xcontext->caps, caps)) { + goto incompatible_caps; + } + + structure = gst_caps_get_structure (caps, 0); + ret = gst_structure_get_int (structure, "width", &video_width); + ret &= gst_structure_get_int (structure, "height", &video_height); + fps = gst_structure_get_value (structure, "framerate"); + ret &= (fps != NULL); + + if (!ret) { + goto incomplete_caps; + } + + evaspixmapsink->aligned_width = video_width; + evaspixmapsink->aligned_height = video_height; + + /* get enable-last-buffer */ + g_object_get(G_OBJECT(evaspixmapsink), "enable-last-buffer", &enable_last_buffer, NULL); + GST_INFO_OBJECT (evaspixmapsink,"current enable-last-buffer : %d", enable_last_buffer); + /* flush if enable-last-buffer is TRUE */ + if (enable_last_buffer) { + GST_INFO_OBJECT (evaspixmapsink,"flush last-buffer"); + g_object_set(G_OBJECT(evaspixmapsink), "enable-last-buffer", FALSE, NULL); + g_object_set(G_OBJECT(evaspixmapsink), "enable-last-buffer", TRUE, NULL); + } + + evaspixmapsink->fps_n = gst_value_get_fraction_numerator (fps); + evaspixmapsink->fps_d = gst_value_get_fraction_denominator (fps); + + evaspixmapsink->video_width = video_width; + evaspixmapsink->video_height = video_height; + + im_format = gst_evaspixmapsink_get_format_from_caps (evaspixmapsink, caps); + if (im_format == -1) { + goto invalid_format; + } + + /* get aspect ratio from caps if it's present, and + * convert video width and height to a display width and height + * using wd / hd = wv / hv * PARv / PARd */ + + /* get video's PAR */ + caps_par = gst_structure_get_value (structure, "pixel-aspect-ratio"); + if (caps_par) { + video_par_n = gst_value_get_fraction_numerator (caps_par); + video_par_d = gst_value_get_fraction_denominator (caps_par); + } else { + video_par_n = 1; + video_par_d = 1; + } + /* get display's PAR */ + if (evaspixmapsink->par) { + display_par_n = gst_value_get_fraction_numerator (evaspixmapsink->par); + display_par_d = gst_value_get_fraction_denominator (evaspixmapsink->par); + } else { + display_par_n = 1; + display_par_d = 1; + } + + /* get the display region */ + caps_disp_reg = gst_structure_get_value (structure, "display-region"); + if (caps_disp_reg) { + disp_x = g_value_get_int (gst_value_array_get_value (caps_disp_reg, 0)); + disp_y = g_value_get_int (gst_value_array_get_value (caps_disp_reg, 1)); + disp_width = g_value_get_int (gst_value_array_get_value (caps_disp_reg, 2)); + disp_height = g_value_get_int (gst_value_array_get_value (caps_disp_reg, 3)); + } else { + disp_x = disp_y = 0; + disp_width = video_width; + disp_height = video_height; + } + + if (!gst_video_calculate_display_ratio (&num, &den, video_width, video_height, video_par_n, video_par_d, display_par_n, display_par_d)) { + goto no_disp_ratio; + } + + evaspixmapsink->disp_x = disp_x; + evaspixmapsink->disp_y = disp_y; + evaspixmapsink->disp_width = disp_width; + evaspixmapsink->disp_height = disp_height; + + GST_DEBUG_OBJECT (evaspixmapsink,"video width/height: %dx%d, calculated display ratio: %d/%d", video_width, video_height, num, den); + + /* now find a width x height that respects this display ratio. + * prefer those that have one of w/h the same as the incoming video + * using wd / hd = num / den */ + + /* start with same height, because of interlaced video */ + /* check hd / den is an integer scale factor, and scale wd with the PAR */ + if (video_height % den == 0) { + GST_DEBUG_OBJECT (evaspixmapsink,"keeping video height"); + GST_VIDEO_SINK_WIDTH (evaspixmapsink) = (guint) gst_util_uint64_scale_int (video_height, num, den); + GST_VIDEO_SINK_HEIGHT (evaspixmapsink) = video_height; + } else if (video_width % num == 0) { + GST_DEBUG_OBJECT (evaspixmapsink,"keeping video width"); + GST_VIDEO_SINK_WIDTH (evaspixmapsink) = video_width; + GST_VIDEO_SINK_HEIGHT (evaspixmapsink) = (guint) gst_util_uint64_scale_int (video_width, den, num); + } else { + GST_DEBUG_OBJECT (evaspixmapsink,"approximating while keeping video height"); + GST_VIDEO_SINK_WIDTH (evaspixmapsink) = (guint) gst_util_uint64_scale_int (video_height, num, den); + GST_VIDEO_SINK_HEIGHT (evaspixmapsink) = video_height; + } + GST_DEBUG_OBJECT (evaspixmapsink,"scaling to %dx%d", GST_VIDEO_SINK_WIDTH (evaspixmapsink), GST_VIDEO_SINK_HEIGHT (evaspixmapsink)); + + /* Creating our window and our image with the display size in pixels */ + if (GST_VIDEO_SINK_WIDTH (evaspixmapsink) <= 0 || GST_VIDEO_SINK_HEIGHT (evaspixmapsink) <= 0) { + goto no_display_size; + } + + g_mutex_lock (evaspixmapsink->flow_lock); + + /* We renew our evaspixmap buffer only if size or format changed; + * the evaspixmap buffer is the same size as the video pixel size */ + if ((evaspixmapsink->evas_pixmap_buf) && ((im_format != evaspixmapsink->evas_pixmap_buf->im_format) + || (video_width != evaspixmapsink->evas_pixmap_buf->width) || (video_height != evaspixmapsink->evas_pixmap_buf->height))) { + GST_DEBUG_OBJECT (evaspixmapsink,"old format %" GST_FOURCC_FORMAT ", new format %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (evaspixmapsink->evas_pixmap_buf->im_format), GST_FOURCC_ARGS (im_format)); + GST_DEBUG_OBJECT (evaspixmapsink,"renewing evaspixmap buffer"); + gst_buffer_unref (GST_BUFFER (evaspixmapsink->evas_pixmap_buf)); + evaspixmapsink->evas_pixmap_buf = NULL; + } + + g_mutex_unlock (evaspixmapsink->flow_lock); + + if (evaspixmapsink->eo) { + if (!gst_evaspixmapsink_xpixmap_link (evaspixmapsink)) { + GST_ERROR_OBJECT (evaspixmapsink,"link evas image object with pixmap failed..."); + return FALSE; + } else { + gst_evaspixmapsink_manage_event_thread (evaspixmapsink); + } + } else { + GST_ERROR_OBJECT (evaspixmapsink,"setcaps success, but there is no evas image object.."); + return FALSE; + } + + return TRUE; + + /* ERRORS */ + incompatible_caps: + { + GST_ERROR_OBJECT (evaspixmapsink,"caps incompatible"); + return FALSE; + } + incomplete_caps: + { + GST_DEBUG_OBJECT (evaspixmapsink,"Failed to retrieve either width, ""height or framerate from intersected caps"); + return FALSE; + } + invalid_format: + { + GST_DEBUG_OBJECT (evaspixmapsink,"Could not locate image format from caps %" GST_PTR_FORMAT, caps); + return FALSE; + } + no_disp_ratio: + { + GST_ELEMENT_ERROR (evaspixmapsink, CORE, NEGOTIATION, (NULL), ("Error calculating the output display ratio of the video.")); + return FALSE; + } + no_display_size: + { + GST_ELEMENT_ERROR (evaspixmapsink, CORE, NEGOTIATION, (NULL), ("Error calculating the output display ratio of the video.")); + return FALSE; + } +} + +static GstStateChangeReturn +gst_evaspixmapsink_change_state (GstElement *element, GstStateChange transition) +{ + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + GstEvasPixmapSink *evaspixmapsink; + + evaspixmapsink = GST_EVASPIXMAPSINK (element); + + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + g_mutex_lock (evaspixmapsink->flow_lock); + GST_WARNING_OBJECT (evaspixmapsink,"GST_STATE_CHANGE_NULL_TO_READY"); + + /* open drm to use gem */ + if (drm_init(evaspixmapsink)) { + GST_ERROR_OBJECT (evaspixmapsink,"drm_init() failure"); + g_mutex_unlock (evaspixmapsink->flow_lock); + return GST_STATE_CHANGE_FAILURE; + } + + /* check if there exist evas image object, need to write code related to making internal evas image object */ + if (!is_evas_image_object (evaspixmapsink->eo)) { + GST_ERROR_OBJECT (evaspixmapsink,"There is no evas image object.."); + g_mutex_unlock (evaspixmapsink->flow_lock); + return GST_STATE_CHANGE_FAILURE; + } + + /* Set xcontext and display */ + if (!evaspixmapsink->xcontext) { + evaspixmapsink->xcontext = gst_evaspixmapsink_xcontext_get (evaspixmapsink); + if (!evaspixmapsink->xcontext) { + GST_ERROR_OBJECT (evaspixmapsink,"could not get xcontext.."); + g_mutex_unlock (evaspixmapsink->flow_lock); + return GST_STATE_CHANGE_FAILURE; + } + } + + /* update object's par with calculated one if not set yet */ + if (!evaspixmapsink->par) { + evaspixmapsink->par = g_new0 (GValue, 1); + gst_value_init_and_copy (evaspixmapsink->par, evaspixmapsink->xcontext->par); + GST_DEBUG_OBJECT (evaspixmapsink,"set calculated PAR on object's PAR"); + } + + /* call XSynchronize with the current value of synchronous */ + GST_DEBUG_OBJECT (evaspixmapsink,"XSynchronize called with %s", evaspixmapsink->synchronous ? "TRUE" : "FALSE"); + XSynchronize (evaspixmapsink->xcontext->disp, evaspixmapsink->synchronous); + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); + + g_mutex_unlock (evaspixmapsink->flow_lock); + break; + + case GST_STATE_CHANGE_READY_TO_PAUSED: + GST_WARNING_OBJECT (evaspixmapsink,"GST_STATE_CHANGE_READY_TO_PAUSED"); + break; + + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + GST_WARNING_OBJECT (evaspixmapsink,"GST_STATE_CHANGE_PAUSED_TO_PLAYING"); + break; + + default: + break; + } + + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + GST_WARNING_OBJECT (evaspixmapsink,"GST_STATE_CHANGE_PLAYING_TO_PAUSED"); + break; + + case GST_STATE_CHANGE_PAUSED_TO_READY: + { + int i = 0; + GST_WARNING_OBJECT (evaspixmapsink,"GST_STATE_CHANGE_PAUSED_TO_READY"); + evaspixmapsink->fps_n = 0; + evaspixmapsink->fps_d = 1; + GST_VIDEO_SINK_WIDTH (evaspixmapsink) = 0; + GST_VIDEO_SINK_HEIGHT (evaspixmapsink) = 0; + drm_fini_close_gem_handle(evaspixmapsink, 0); + } + break; + + case GST_STATE_CHANGE_READY_TO_NULL: + GST_WARNING_OBJECT (evaspixmapsink,"GST_STATE_CHANGE_READY_TO_NULL"); + gst_evaspixmapsink_reset(evaspixmapsink); + /* close drm */ + drm_fini(evaspixmapsink); + break; + + default: + break; + } + return ret; +} + +static void +gst_evaspixmapsink_get_times (GstBaseSink *bsink, GstBuffer *buf, GstClockTime *start, GstClockTime *end) +{ + GstEvasPixmapSink *evaspixmapsink; + + evaspixmapsink = GST_EVASPIXMAPSINK (bsink); + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + *start = GST_BUFFER_TIMESTAMP (buf); + if (GST_BUFFER_DURATION_IS_VALID (buf)) { + *end = *start + GST_BUFFER_DURATION (buf); + } else { + if (evaspixmapsink->fps_n > 0) { + *end = *start + + gst_util_uint64_scale_int (GST_SECOND, evaspixmapsink->fps_d, + evaspixmapsink->fps_n); + } + } + } +} + +static GstFlowReturn +gst_evaspixmapsink_show_frame (GstVideoSink *vsink, GstBuffer *buf) +{ + GstEvasPixmapSink *evaspixmapsink; + XV_DATA_PTR img_data = NULL; + SCMN_IMGB *scmn_imgb = NULL; + gint format = 0; + + MMTA_ACUM_ITEM_BEGIN("evaspixmapsink gst_evaspixmapsink_show_frame()", FALSE); + + evaspixmapsink = GST_EVASPIXMAPSINK (vsink); + + if( evaspixmapsink->stop_video ) { + GST_INFO_OBJECT (evaspixmapsink, "Stop video is TRUE. so skip show frame..." ); + return GST_FLOW_OK; + } + + if (!evaspixmapsink->evas_pixmap_buf) { + GST_DEBUG_OBJECT (evaspixmapsink,"creating our evaspixmap buffer"); + format = gst_evaspixmapsink_get_format_from_caps(evaspixmapsink, GST_BUFFER_CAPS(buf)); + switch (format) { + case GST_MAKE_FOURCC('S', 'T', '1', '2'): + case GST_MAKE_FOURCC('S', 'N', '1', '2'): + case GST_MAKE_FOURCC('S', '4', '2', '0'): + case GST_MAKE_FOURCC('S', 'U', 'Y', '2'): + case GST_MAKE_FOURCC('S', 'U', 'Y', 'V'): + case GST_MAKE_FOURCC('S', 'Y', 'V', 'Y'): + case GST_MAKE_FOURCC('I', 'T', 'L', 'V'): + case GST_MAKE_FOURCC('S', 'R', '3', '2'): + scmn_imgb = (SCMN_IMGB *)GST_BUFFER_MALLOCDATA(buf); + if(scmn_imgb == NULL) { + GST_DEBUG_OBJECT (evaspixmapsink, "scmn_imgb is NULL. Skip buffer put..." ); + return GST_FLOW_OK; + } + /* skip buffer if aligned size is smaller than size of caps */ + if (scmn_imgb->s[0] < evaspixmapsink->video_width || scmn_imgb->e[0] < evaspixmapsink->video_height) { + GST_WARNING_OBJECT (evaspixmapsink,"invalid size[caps:%dx%d,aligned:%dx%d]. Skip this buffer...", + evaspixmapsink->video_width, evaspixmapsink->video_height, scmn_imgb->s[0], scmn_imgb->e[0]); + return GST_FLOW_OK; + } + evaspixmapsink->aligned_width = scmn_imgb->s[0]; + evaspixmapsink->aligned_height = scmn_imgb->e[0]; + GST_DEBUG_OBJECT (evaspixmapsink,"video width,height[%dx%d]",evaspixmapsink->video_width, evaspixmapsink->video_height); + GST_INFO_OBJECT (evaspixmapsink,"Use aligned width,height[%dx%d]",evaspixmapsink->aligned_width, evaspixmapsink->aligned_height); + break; + default: + GST_INFO_OBJECT (evaspixmapsink,"Use original width,height of caps"); + break; + } + evaspixmapsink->evas_pixmap_buf = gst_evaspixmap_buffer_new (evaspixmapsink, GST_BUFFER_CAPS (buf)); + if (!evaspixmapsink->evas_pixmap_buf) { + /* The create method should have posted an informative error */ + goto no_image; + } + if (evaspixmapsink->evas_pixmap_buf->size < GST_BUFFER_SIZE (buf)) { + GST_ELEMENT_ERROR (evaspixmapsink, RESOURCE, WRITE, ("Failed to create output image buffer of %dx%d pixels", evaspixmapsink->evas_pixmap_buf->width, evaspixmapsink->evas_pixmap_buf->height),("XServer allocated buffer size did not match input buffer")); + gst_evaspixmap_buffer_destroy (evaspixmapsink->evas_pixmap_buf); + evaspixmapsink->evas_pixmap_buf = NULL; + goto no_image; + } + } + + switch (evaspixmapsink->evas_pixmap_buf->im_format) { + /* Cases for specified formats of Samsung extension */ + case GST_MAKE_FOURCC('S', 'T', '1', '2'): + case GST_MAKE_FOURCC('S', 'N', '1', '2'): + case GST_MAKE_FOURCC('S', '4', '2', '0'): + case GST_MAKE_FOURCC('S', 'U', 'Y', '2'): + case GST_MAKE_FOURCC('S', 'U', 'Y', 'V'): + case GST_MAKE_FOURCC('S', 'Y', 'V', 'Y'): + case GST_MAKE_FOURCC('I', 'T', 'L', 'V'): + case GST_MAKE_FOURCC('S', 'R', '3', '2'): + { + GST_DEBUG_OBJECT (evaspixmapsink,"Samsung extension display format activated. fourcc:%d", evaspixmapsink->evas_pixmap_buf->im_format); + + if (evaspixmapsink->evas_pixmap_buf->xvimage->data) { + img_data = (XV_DATA_PTR) evaspixmapsink->evas_pixmap_buf->xvimage->data; + XV_INIT_DATA(img_data); + scmn_imgb = (SCMN_IMGB *)GST_BUFFER_MALLOCDATA(buf); + if (scmn_imgb == NULL) { + GST_DEBUG_OBJECT (evaspixmapsink, "scmn_imgb is NULL. Skip buffer put..." ); + return GST_FLOW_OK; + } + + if (scmn_imgb->buf_share_method == BUF_SHARE_METHOD_PADDR) { + img_data->YBuf = (unsigned int)scmn_imgb->p[0]; + img_data->CbBuf = (unsigned int)scmn_imgb->p[1]; + img_data->CrBuf = (unsigned int)scmn_imgb->p[2]; + img_data->BufType = XV_BUF_TYPE_LEGACY; + + } else if (scmn_imgb->buf_share_method == BUF_SHARE_METHOD_FD) { + /* set gem information to gem_info structure of handle and convert dma-buf fd into drm gem name */ + img_data->YBuf = drm_init_convert_dmabuf_gemname(evaspixmapsink, (int)scmn_imgb->dma_buf_fd[0]); + img_data->CbBuf = drm_init_convert_dmabuf_gemname(evaspixmapsink, (int)scmn_imgb->dma_buf_fd[1]); + img_data->CrBuf = drm_init_convert_dmabuf_gemname(evaspixmapsink, (int)scmn_imgb->dma_buf_fd[2]); + img_data->BufType = XV_BUF_TYPE_DMABUF; + if (evaspixmapsink->buf_shared_type != BUF_SHARE_METHOD_FD) { + evaspixmapsink->buf_shared_type = BUF_SHARE_METHOD_FD; + GST_WARNING_OBJECT (evaspixmapsink, "BUF SHARED TYPE : FD"); + } + + } else if (scmn_imgb->buf_share_method == BUF_SHARE_METHOD_TIZEN_BUFFER) { + img_data->bo[0] = scmn_imgb->bo[0]; + img_data->bo[1] = scmn_imgb->bo[1]; + img_data->bo[2] = scmn_imgb->bo[2]; + GST_DEBUG("TBM bo %p %p %p", img_data->bo[0], img_data->bo[1], img_data->bo[2]); + /* export bo */ + if (img_data->bo[0]) { + img_data->YBuf = tbm_init_convert_bo_gemname(evaspixmapsink, (tbm_bo)img_data->bo[0]); + } + if (img_data->bo[1]) { + img_data->CbBuf = tbm_init_convert_bo_gemname(evaspixmapsink, (tbm_bo)img_data->bo[1]); + } + if (img_data->bo[2]) { + img_data->CrBuf = tbm_init_convert_bo_gemname(evaspixmapsink, (tbm_bo)img_data->bo[2]); + } + if (evaspixmapsink->buf_shared_type != BUF_SHARE_METHOD_TIZEN_BUFFER) { + evaspixmapsink->buf_shared_type = BUF_SHARE_METHOD_TIZEN_BUFFER; + GST_WARNING_OBJECT (evaspixmapsink, "BUF SHARED TYPE : TIZEN BUFFER"); + } + } else { + GST_WARNING_OBJECT (evaspixmapsink, "Not supported, buf_share_method(%d)", scmn_imgb->buf_share_method); + return GST_FLOW_OK; + } + if (!img_data->YBuf) { + GST_WARNING_OBJECT (evaspixmapsink, "img_data->YBuf is NULL. skip buffer put..." ); + return GST_FLOW_OK; + } + GST_LOG_OBJECT(evaspixmapsink, "YBuf[%d], CbBuf[%d], CrBuf[%d]", + img_data->YBuf, img_data->CbBuf, img_data->CrBuf ); + } else { + GST_WARNING_OBJECT (evaspixmapsink, "xvimage->data is NULL. skip buffer put..." ); + return GST_FLOW_OK; + } + break; + } + default: + { + if (evaspixmapsink->buf_shared_type != BUF_SHARE_METHOD_NONE) { + evaspixmapsink->buf_shared_type = BUF_SHARE_METHOD_NONE; + } + GST_DEBUG_OBJECT (evaspixmapsink,"Normal format activated. fourcc = %d", evaspixmapsink->evas_pixmap_buf->im_format); + __ta__("evaspixmapsink memcpy in _show_frame", memcpy (evaspixmapsink->evas_pixmap_buf->xvimage->data, GST_BUFFER_DATA (buf), + MIN (GST_BUFFER_SIZE (buf), evaspixmapsink->evas_pixmap_buf->size));); + break; + } + } + if (!gst_evaspixmap_buffer_put (evaspixmapsink, evaspixmapsink->evas_pixmap_buf)) { + MMTA_ACUM_ITEM_END("evaspixmapsink gst_evaspixmapsink_show_frame()", FALSE); + return GST_FLOW_OK; + } + + MMTA_ACUM_ITEM_END("evaspixmapsink gst_evaspixmapsink_show_frame()", FALSE); + + return GST_FLOW_OK; + + /* ERRORS */ + no_image: + { + /* No image available. That's very bad ! */ + GST_WARNING_OBJECT (evaspixmapsink,"could not create image"); + return GST_FLOW_ERROR; + } +} + +static gboolean +gst_evaspixmapsink_event (GstBaseSink *sink, GstEvent *event) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (sink); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_FLUSH_START: + GST_DEBUG_OBJECT (evaspixmapsink,"GST_EVENT_FLUSH_START"); + break; + case GST_EVENT_FLUSH_STOP: + GST_DEBUG_OBJECT (evaspixmapsink,"GST_EVENT_FLUSH_STOP"); + break; + default: + break; + } + if (GST_BASE_SINK_CLASS (parent_class)->event) { + return GST_BASE_SINK_CLASS (parent_class)->event (sink, event); + } else { + return TRUE; + } +} + +/* Interfaces stuff */ + +static gboolean +gst_evaspixmapsink_interface_supported (GstImplementsInterface *iface, GType type) +{ + g_assert (type == GST_TYPE_NAVIGATION || type == GST_TYPE_COLOR_BALANCE || type == GST_TYPE_PROPERTY_PROBE); + return TRUE; +} + +static void +gst_evaspixmapsink_interface_init (GstImplementsInterfaceClass *klass) +{ + klass->supported = gst_evaspixmapsink_interface_supported; +} + +static void +gst_evaspixmapsink_navigation_send_event (GstNavigation *navigation, GstStructure *structure) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (navigation); + GstPad *peer; + int i = 0; + + if ((peer = gst_pad_get_peer (GST_VIDEO_SINK_PAD (evaspixmapsink)))) { + GstEvent *event; + GstVideoRectangle result; + gdouble x, y, xscale = 1.0, yscale = 1.0; + + event = gst_event_new_navigation (structure); + + /* We take the flow_lock while we look at the window */ + g_mutex_lock (evaspixmapsink->flow_lock); + + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i ++) { + if (!evaspixmapsink->xpixmap[i]) { + g_mutex_unlock (evaspixmapsink->flow_lock); + return; + } + } + + memcpy (&result, &evaspixmapsink->render_rect, sizeof (GstVideoRectangle)); + + g_mutex_unlock (evaspixmapsink->flow_lock); + + /* We calculate scaling using the original video frames geometry to include + pixel aspect ratio scaling. */ + xscale = (gdouble) evaspixmapsink->video_width / result.w; + yscale = (gdouble) evaspixmapsink->video_height / result.h; + + /* Converting pointer coordinates to the non scaled geometry */ + if (gst_structure_get_double (structure, "pointer_x", &x)) { + x = MIN (x, result.x + result.w); + x = MAX (x - result.x, 0); + gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, + (gdouble) x * xscale, NULL); + } + if (gst_structure_get_double (structure, "pointer_y", &y)) { + y = MIN (y, result.y + result.h); + y = MAX (y - result.y, 0); + gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, + (gdouble) y * yscale, NULL); + } + + gst_pad_send_event (peer, event); + gst_object_unref (peer); + } +} + +static void +gst_evaspixmapsink_navigation_init (GstNavigationInterface *iface) +{ + iface->send_event = gst_evaspixmapsink_navigation_send_event; +} + +static const GList* +gst_evaspixmapsink_colorbalance_list_channels (GstColorBalance *balance) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (balance); + + g_return_val_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink), NULL); + + if (evaspixmapsink->xcontext) + return evaspixmapsink->xcontext->channels_list; + else + return NULL; +} + +static void +gst_evaspixmapsink_colorbalance_set_value (GstColorBalance *balance, GstColorBalanceChannel *channel, gint value) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (balance); + + g_return_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink)); + g_return_if_fail (channel->label != NULL); + + evaspixmapsink->cb_changed = TRUE; + + /* Normalize val to [-1000, 1000] */ + value = floor (0.5 + -1000 + 2000 * (value - channel->min_value) / + (double) (channel->max_value - channel->min_value)); + + if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0) { + evaspixmapsink->hue = value; + } else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0) { + evaspixmapsink->saturation = value; + } else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0) { + evaspixmapsink->contrast = value; + } else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0) { + evaspixmapsink->brightness = value; + } else { + g_warning ("got an unknown channel %s", channel->label); + return; + } + + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); +} + +static gint +gst_evaspixmapsink_colorbalance_get_value (GstColorBalance *balance, GstColorBalanceChannel *channel) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (balance); + gint value = 0; + + g_return_val_if_fail (GST_IS_EVASPIXMAPSINK (evaspixmapsink), 0); + g_return_val_if_fail (channel->label != NULL, 0); + + if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0) { + value = evaspixmapsink->hue; + } else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0) { + value = evaspixmapsink->saturation; + } else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0) { + value = evaspixmapsink->contrast; + } else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0) { + value = evaspixmapsink->brightness; + } else { + g_warning ("got an unknown channel %s", channel->label); + } + + /* Normalize val to [channel->min_value, channel->max_value] */ + value = channel->min_value + (channel->max_value - channel->min_value) * (value + 1000) / 2000; + + return value; +} + +static void +gst_evaspixmapsink_colorbalance_init (GstColorBalanceClass *iface) +{ + GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_HARDWARE; + iface->list_channels = gst_evaspixmapsink_colorbalance_list_channels; + iface->set_value = gst_evaspixmapsink_colorbalance_set_value; + iface->get_value = gst_evaspixmapsink_colorbalance_get_value; +} + +static const GList * +gst_evaspixmapsink_probe_get_properties (GstPropertyProbe *probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *list = NULL; + + if (!list) { + list = g_list_append (NULL, g_object_class_find_property (klass, "device")); + list = g_list_append (list, g_object_class_find_property (klass, "autopaint-colorkey")); + list = g_list_append (list, g_object_class_find_property (klass, "double-buffer")); + list = g_list_append (list, g_object_class_find_property (klass, "colorkey")); + } + + return list; +} + +static void +gst_evaspixmapsink_probe_probe_property (GstPropertyProbe *probe, guint prop_id, const GParamSpec *pspec) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (probe); + + switch (prop_id) { + case PROP_DEVICE: + case PROP_AUTOPAINT_COLORKEY: + case PROP_DOUBLE_BUFFER: + case PROP_COLORKEY: + GST_DEBUG_OBJECT (evaspixmapsink,"probing device list and get capabilities"); + if (!evaspixmapsink->xcontext) { + GST_DEBUG_OBJECT (evaspixmapsink,"generating xcontext"); + evaspixmapsink->xcontext = gst_evaspixmapsink_xcontext_get (evaspixmapsink); + if (!evaspixmapsink->xcontext) { + GST_ERROR_OBJECT (evaspixmapsink,"could not get xcontext.."); + } + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } +} + +static gboolean +gst_evaspixmapsink_probe_needs_probe (GstPropertyProbe *probe, guint prop_id, const GParamSpec *pspec) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (probe); + gboolean ret = FALSE; + + switch (prop_id) { + case PROP_DEVICE: + case PROP_AUTOPAINT_COLORKEY: + case PROP_DOUBLE_BUFFER: + case PROP_COLORKEY: + if (evaspixmapsink->xcontext != NULL) { + ret = FALSE; + } else { + ret = TRUE; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return ret; +} + +static GValueArray * +gst_evaspixmapsink_probe_get_values (GstPropertyProbe *probe, guint prop_id, const GParamSpec *pspec) +{ + GstEvasPixmapSink *evaspixmapsink = GST_EVASPIXMAPSINK (probe); + GValueArray *array = NULL; + + if (G_UNLIKELY (!evaspixmapsink->xcontext)) { + GST_WARNING_OBJECT (evaspixmapsink,"we don't have any xcontext, can't " + "get values"); + goto beach; + } + + switch (prop_id) { + case PROP_DEVICE: + { + guint i; + GValue value = { 0 }; + + array = g_value_array_new (evaspixmapsink->xcontext->nb_adaptors); + g_value_init (&value, G_TYPE_STRING); + + for (i = 0; i < evaspixmapsink->xcontext->nb_adaptors; i++) { + gchar *adaptor_id_s = g_strdup_printf ("%u", i); + + g_value_set_string (&value, adaptor_id_s); + g_value_array_append (array, &value); + g_free (adaptor_id_s); + } + g_value_unset (&value); + break; + } + case PROP_AUTOPAINT_COLORKEY: + if (evaspixmapsink->have_autopaint_colorkey) { + GValue value = { 0 }; + + array = g_value_array_new (2); + g_value_init (&value, G_TYPE_BOOLEAN); + g_value_set_boolean (&value, FALSE); + g_value_array_append (array, &value); + g_value_set_boolean (&value, TRUE); + g_value_array_append (array, &value); + g_value_unset (&value); + } + break; + case PROP_DOUBLE_BUFFER: + if (evaspixmapsink->have_double_buffer) { + GValue value = { 0 }; + + array = g_value_array_new (2); + g_value_init (&value, G_TYPE_BOOLEAN); + g_value_set_boolean (&value, FALSE); + g_value_array_append (array, &value); + g_value_set_boolean (&value, TRUE); + g_value_array_append (array, &value); + g_value_unset (&value); + } + break; + case PROP_COLORKEY: + if (evaspixmapsink->have_colorkey) { + GValue value = { 0 }; + + array = g_value_array_new (1); + g_value_init (&value, GST_TYPE_INT_RANGE); + gst_value_set_int_range (&value, 0, 0xffffff); + g_value_array_append (array, &value); + g_value_unset (&value); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + +beach: + return array; +} + +static void +gst_evaspixmapsink_property_probe_interface_init (GstPropertyProbeInterface *iface) +{ + iface->get_properties = gst_evaspixmapsink_probe_get_properties; + iface->probe_property = gst_evaspixmapsink_probe_probe_property; + iface->needs_probe = gst_evaspixmapsink_probe_needs_probe; + iface->get_values = gst_evaspixmapsink_probe_get_values; +} + +static gboolean +gst_evaspixmapsink_xpixmap_link (GstEvasPixmapSink *evaspixmapsink) +{ + Display *dpy; + Pixmap *pixmap_id[NUM_OF_PIXMAP]; + int evas_object_width = 0; + int evas_object_height = 0; + int pixmap_width = 0; + int pixmap_height = 0; + unsigned int xw = 0; + unsigned int xh = 0; + int i = 0; + + GST_DEBUG_OBJECT (evaspixmapsink,"[START]"); + + if (!evaspixmapsink) { + GST_ERROR_OBJECT (evaspixmapsink,"could not get evaspixmapsink.."); + return FALSE; + } + g_mutex_lock (evaspixmapsink->flow_lock); + + /* Set xcontext and display */ + if (!evaspixmapsink->xcontext) { + GST_WARNING_OBJECT (evaspixmapsink,"there's no xcontext, try to get one.."); + evaspixmapsink->xcontext = gst_evaspixmapsink_xcontext_get (evaspixmapsink); + if (!evaspixmapsink->xcontext) { + GST_ERROR_OBJECT (evaspixmapsink,"could not get xcontext.."); + return FALSE; + } + } + + /* Set evas image object size */ + evas_object_geometry_get(evaspixmapsink->eo, NULL, NULL, &evas_object_width, &evas_object_height); + + /* check if it is redundant request */ + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->xpixmap[i]) { + if (!evaspixmapsink->use_origin_size && evaspixmapsink->xpixmap[i]->width && evaspixmapsink->xpixmap[i]->height) { + if (evaspixmapsink->xpixmap[i]->width == evas_object_width && evaspixmapsink->xpixmap[i]->height == evas_object_height) { + GST_WARNING_OBJECT (evaspixmapsink,"pixmap was already created(w:%d, h:%d), skip it..", + evaspixmapsink->xpixmap[i]->width, evaspixmapsink->xpixmap[i]->height); + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + XSetForeground (evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[i]->gc, evaspixmapsink->xcontext->black); + XFillRectangle (evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[i]->pixmap, evaspixmapsink->xpixmap[i]->gc, + 0, 0, evaspixmapsink->xpixmap[i]->width, evaspixmapsink->xpixmap[i]->height); + GST_LOG_OBJECT (evaspixmapsink,"fill black to xpixmap[%d] with size(w:%d,h:%d)", evaspixmapsink->xpixmap[i]->pixmap, + evaspixmapsink->xpixmap[i]->width, evaspixmapsink->xpixmap[i]->height); + } + goto SKIP_LINK; + } + } + } + } + + dpy = evaspixmapsink->xcontext->disp; + + if (evaspixmapsink->use_origin_size || !evas_object_width || !evas_object_height) { + pixmap_width = evaspixmapsink->video_width; + pixmap_height = evaspixmapsink->video_height; + GST_INFO_OBJECT (evaspixmapsink,"set size to media src size(%dx%d)", pixmap_width, pixmap_height); + } + + g_mutex_lock (evaspixmapsink->x_lock); + evaspixmapsink->sizediff_width = 0; + evaspixmapsink->sizediff_height = 0; + if (evaspixmapsink->use_origin_size || !evas_object_width || !evas_object_height) { + XvQueryBestSize(dpy, evaspixmapsink->xcontext->xv_port_id,0,0,0, pixmap_width, pixmap_height, &xw, &xh); + if (!evas_object_width || !evas_object_height) { + evaspixmapsink->w = xw; + evaspixmapsink->h = xh; + } else { + evaspixmapsink->w = evas_object_width; + evaspixmapsink->h = evas_object_height; + } + GST_DEBUG_OBJECT (evaspixmapsink,"XvQueryBestSize : xv_port_id(%d), w(%d),h(%d) => xw(%d),xh(%d)", evaspixmapsink->xcontext->xv_port_id, pixmap_width, pixmap_height, xw, xh); + } else { + XvQueryBestSize(dpy, evaspixmapsink->xcontext->xv_port_id,0,0,0, evas_object_width, evas_object_height, &xw, &xh); + GST_DEBUG_OBJECT (evaspixmapsink,"XvQueryBestSize : xv_port_id(%d), w(%d),h(%d) => xw(%d),xh(%d)", evaspixmapsink->xcontext->xv_port_id, evas_object_width, evas_object_height, xw, xh); + evaspixmapsink->w = xw; + evaspixmapsink->h = xh; + /* update difference of size information (between evas image object's and pixmap's) */ + evaspixmapsink->sizediff_width = xw - evas_object_width; + evaspixmapsink->sizediff_height = xh - evas_object_height; + } + + /* create xpixmap structure */ + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (!evaspixmapsink->xpixmap[i]) { + /* xpixmap can be created in this function only */ + evaspixmapsink->xpixmap[i] = g_new0 (GstXPixmap, 1); + if(!evaspixmapsink->xpixmap[i]) { + GST_ERROR_OBJECT (evaspixmapsink,"xpixmap is not valid.."); + int j = 0; + for (j = 0; j < i; j++) { + g_free(evaspixmapsink->xpixmap[j]); + } + goto GO_OUT_OF_FUNC; + } + } + } + + /* create pixmap */ + if (!xw || !xh) { + GST_WARNING_OBJECT (evaspixmapsink,"skip creating pixmap..xw(%d),xh(%d)",xw,xh); + goto GO_OUT_OF_FUNC; + } else { + /* multiple pixmaps creation */ + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + pixmap_id[i] = XCreatePixmap(dpy, DefaultRootWindow(dpy), xw, xh, DefaultDepth(dpy, DefaultScreen(dpy))); + if ( (int)pixmap_id[i] == BadAlloc || (int)pixmap_id[i] == BadDrawable || (int)pixmap_id[i] == BadValue ) { + GST_ERROR_OBJECT (evaspixmapsink,"pixmap[%d] allocation error..", i); + int j = 0; + for (j = 0; j < i; j++) { + XFreePixmap(dpy, pixmap_id[j]); + } + goto GO_OUT_OF_FUNC; + } + GST_INFO_OBJECT (evaspixmapsink,"creation pixmap_id[%d]:%d success", i, pixmap_id[i]); + GST_DEBUG_OBJECT (evaspixmapsink,"evas_object_width(%d),evas_object_height(%d),pixmap:%d,depth:%d", + evas_object_width,evas_object_height,pixmap_id[i],DefaultDepth(dpy, DefaultScreen(dpy))); + } + } + + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->xpixmap[i]->pixmap && pixmap_id[i] != evaspixmapsink->xpixmap[i]->pixmap) { + g_mutex_unlock (evaspixmapsink->x_lock); + g_mutex_lock (evaspixmapsink->pixmap_ref_lock); + /* If we reset another pixmap, do below */ + evaspixmapsink->xpixmap[i]->prev_pixmap = evaspixmapsink->xpixmap[i]->pixmap; + evaspixmapsink->xpixmap[i]->prev_gc = evaspixmapsink->xpixmap[i]->gc; + evaspixmapsink->xpixmap[i]->pixmap = 0; + evaspixmapsink->xpixmap[i]->ref = 0; + evaspixmapsink->xpixmap[i]->damaged_time = 0; + g_mutex_unlock (evaspixmapsink->pixmap_ref_lock); + g_mutex_lock (evaspixmapsink->x_lock); + } + } + + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + /* Set pixmap id and create GC */ + evaspixmapsink->xpixmap[i]->pixmap = pixmap_id[i]; + evaspixmapsink->xpixmap[i]->gc = XCreateGC(dpy, evaspixmapsink->xpixmap[i]->pixmap, 0,0); + evaspixmapsink->xpixmap[i]->width = xw; + evaspixmapsink->xpixmap[i]->height = xh; + + /* Create XDamage */ + if (evaspixmapsink->damage[i]) { + evaspixmapsink->prev_damage[i] = evaspixmapsink->damage[i]; + } + evaspixmapsink->damage[i] = XDamageCreate (dpy, evaspixmapsink->xpixmap[i]->pixmap, XDamageReportRawRectangles); + + GST_WARNING_OBJECT (evaspixmapsink,"xpixmap[%d]->(pixmap:%d,gc:%p), damage[%d]:%d", + i, evaspixmapsink->xpixmap[i]->pixmap, evaspixmapsink->xpixmap[i]->gc, i, evaspixmapsink->damage[i]); + + /* Fill blackcolor for the new pixmap */ + XSetForeground (evaspixmapsink->xcontext->disp, evaspixmapsink->xpixmap[i]->gc, evaspixmapsink->xcontext->black); + XFillRectangle (evaspixmapsink->xcontext->disp, pixmap_id[i], evaspixmapsink->xpixmap[i]->gc, + 0, 0, evaspixmapsink->w, evaspixmapsink->h); + GST_LOG_OBJECT (evaspixmapsink,"fill black to xpixmap[%d] with size(w:%d,h:%d)", pixmap_id[i], + evaspixmapsink->w, evaspixmapsink->h); + } + + XSync(dpy, FALSE); + + /* Set flag for mapping evas object with xpixmap */ + evaspixmapsink->do_link = TRUE; + if (evaspixmapsink->epipe_request_count > EPIPE_REQUEST_LIMIT) { + GST_WARNING_OBJECT (evaspixmapsink,"epipe_request_count(%d), skip ecore_pipe_write()", evaspixmapsink->epipe_request_count); + } else { + ecore_pipe_write(evaspixmapsink->epipe, evaspixmapsink, sizeof(GstEvasPixmapSink)); + evaspixmapsink->epipe_request_count++; + } + + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); + + g_mutex_unlock (evaspixmapsink->x_lock); + + +SKIP_LINK: + g_mutex_lock (evaspixmapsink->pixmap_ref_lock); + evaspixmapsink->last_updated_idx = -1; + g_mutex_unlock (evaspixmapsink->pixmap_ref_lock); + + g_mutex_unlock (evaspixmapsink->flow_lock); + + GST_DEBUG_OBJECT (evaspixmapsink,"[END]"); + + return TRUE; + +GO_OUT_OF_FUNC: + g_mutex_unlock (evaspixmapsink->x_lock); + g_mutex_unlock (evaspixmapsink->flow_lock); + return FALSE; +} + +static void +gst_evaspixmapsink_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GstEvasPixmapSink *evaspixmapsink; + g_return_if_fail (GST_IS_EVASPIXMAPSINK (object)); + evaspixmapsink = GST_EVASPIXMAPSINK (object); + + switch (prop_id) { + case PROP_HUE: + evaspixmapsink->hue = g_value_get_int (value); + evaspixmapsink->cb_changed = TRUE; + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); + break; + case PROP_CONTRAST: + evaspixmapsink->contrast = g_value_get_int (value); + evaspixmapsink->cb_changed = TRUE; + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); + break; + case PROP_BRIGHTNESS: + evaspixmapsink->brightness = g_value_get_int (value); + evaspixmapsink->cb_changed = TRUE; + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); + break; + case PROP_SATURATION: + evaspixmapsink->saturation = g_value_get_int (value); + evaspixmapsink->cb_changed = TRUE; + gst_evaspixmapsink_update_colorbalance (evaspixmapsink); + break; + case PROP_DISPLAY: + evaspixmapsink->display_name = g_strdup (g_value_get_string (value)); + break; + case PROP_SYNCHRONOUS: + evaspixmapsink->synchronous = g_value_get_boolean (value); + if (evaspixmapsink->xcontext) { + XSynchronize (evaspixmapsink->xcontext->disp, evaspixmapsink->synchronous); + GST_DEBUG_OBJECT (evaspixmapsink,"XSynchronize called with %s", evaspixmapsink->synchronous ? "TRUE" : "FALSE"); + } + break; + case PROP_PIXEL_ASPECT_RATIO: + g_free (evaspixmapsink->par); + evaspixmapsink->par = g_new0 (GValue, 1); + g_value_init (evaspixmapsink->par, GST_TYPE_FRACTION); + if (!g_value_transform (value, evaspixmapsink->par)) { + g_warning ("Could not transform string to aspect ratio"); + gst_value_set_fraction (evaspixmapsink->par, 1, 1); + } + GST_DEBUG_OBJECT (evaspixmapsink,"set PAR to %d/%d", gst_value_get_fraction_numerator (evaspixmapsink->par), gst_value_get_fraction_denominator (evaspixmapsink->par)); + break; + case PROP_DEVICE: + evaspixmapsink->adaptor_no = atoi (g_value_get_string (value)); + break; + case PROP_DOUBLE_BUFFER: + evaspixmapsink->double_buffer = g_value_get_boolean (value); + break; + case PROP_AUTOPAINT_COLORKEY: + evaspixmapsink->autopaint_colorkey = g_value_get_boolean (value); + break; + case PROP_COLORKEY: + evaspixmapsink->colorkey = g_value_get_int (value); + break; + case PROP_PIXMAP_WIDTH: + { + /* To do : code related to pixmap re-link */ + GST_LOG_OBJECT (evaspixmapsink, "Not supported"); + break; + } + case PROP_PIXMAP_HEIGHT: + { + /* To do : code related to pixmap re-link */ + GST_LOG_OBJECT (evaspixmapsink, "Not supported"); + break; + } + case PROP_DISPLAY_GEOMETRY_METHOD: + { + guint new_val = g_value_get_enum (value); + if (evaspixmapsink->display_geometry_method != new_val) { + evaspixmapsink->display_geometry_method = new_val; + GST_INFO_OBJECT (evaspixmapsink,"Overlay geometry method update, display_geometry_method(%d)",evaspixmapsink->display_geometry_method); + if( evaspixmapsink->display_geometry_method != DISP_GEO_METHOD_FULL_SCREEN && + evaspixmapsink->display_geometry_method != DISP_GEO_METHOD_CROPPED_FULL_SCREEN ) { + if( evaspixmapsink->xcontext ) { + g_mutex_lock( evaspixmapsink->flow_lock ); + int i = 0; + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->xpixmap[i]) { + gst_evaspixmapsink_xpixmap_clear (evaspixmapsink, evaspixmapsink->xpixmap[i]); + } + } + g_mutex_unlock( evaspixmapsink->flow_lock ); + } + } + if (evaspixmapsink->xcontext) { + gst_evaspixmap_buffer_put (evaspixmapsink, evaspixmapsink->evas_pixmap_buf); + } + } + break; + } + case PROP_DST_ROI_X: + evaspixmapsink->dst_roi.x = g_value_get_int (value); + GST_INFO_OBJECT (evaspixmapsink, "ROI_X(%d)",evaspixmapsink->dst_roi.x ); + break; + case PROP_DST_ROI_Y: + evaspixmapsink->dst_roi.y = g_value_get_int (value); + GST_INFO_OBJECT (evaspixmapsink, "ROI_Y(%d)",evaspixmapsink->dst_roi.y ); + break; + case PROP_DST_ROI_W: + evaspixmapsink->dst_roi.w = g_value_get_int (value); + GST_INFO_OBJECT (evaspixmapsink, "ROI_W(%d)",evaspixmapsink->dst_roi.w ); + break; + case PROP_DST_ROI_H: + evaspixmapsink->dst_roi.h = g_value_get_int (value); + GST_INFO_OBJECT (evaspixmapsink, "ROI_H(%d)",evaspixmapsink->dst_roi.h ); + break; + case PROP_STOP_VIDEO: + evaspixmapsink->stop_video = g_value_get_int (value); + g_mutex_lock( evaspixmapsink->flow_lock ); + if( evaspixmapsink->stop_video ) { + GST_INFO_OBJECT (evaspixmapsink, "XPixmap CLEAR when set video-stop property" ); + int i = 0; + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->xpixmap[i]) { + gst_evaspixmapsink_xpixmap_clear (evaspixmapsink, evaspixmapsink->xpixmap[i]); + } + } + } + GST_INFO_OBJECT (evaspixmapsink, "video-stop property(%d)", evaspixmapsink->stop_video); + + g_mutex_unlock( evaspixmapsink->flow_lock ); + break; + case PROP_EVAS_OBJECT: + { + Evas_Object *eo = g_value_get_pointer (value); + if ( is_evas_image_object (eo)) { + if (!evaspixmapsink->epipe) { + evaspixmapsink->epipe = ecore_pipe_add (ecore_pipe_callback_handler, evaspixmapsink); + if (!evaspixmapsink->epipe) { + GST_ERROR_OBJECT (evaspixmapsink,"Cannot set evas-object property: ecore_pipe_add() failed"); + break; + } + } + if (evaspixmapsink->eo == NULL) { + evaspixmapsink->eo = eo; + /* add evas object callbacks on a new evas image object */ + EVASPIXMAPSINK_SET_EVAS_OBJECT_EVENT_CALLBACK (eo, evaspixmapsink); + if (GST_STATE(evaspixmapsink) < GST_STATE_PAUSED) { + GST_INFO_OBJECT (evaspixmapsink,"It's the first time the new evas image object(%x) is set, skip gst_evaspixmapsink_xpixmap_link()..", eo); + break; + } else { + if (!gst_evaspixmapsink_xpixmap_link(evaspixmapsink)) { + GST_WARNING_OBJECT (evaspixmapsink,"link evas image object with pixmap failed..."); + evaspixmapsink->eo = NULL; + break; + } + } + } + if (eo == evaspixmapsink->eo) { + GST_LOG_OBJECT (evaspixmapsink,"new evas image object(%x) is same as the previous one(%x)", eo, evaspixmapsink->eo); + } else { + GST_INFO_OBJECT (evaspixmapsink,"new evas image object(%x), previous one(%x)", eo, evaspixmapsink->eo); + /* delete evas object callbacks registrated on a former evas image object */ + EVASPIXMAPSINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK (evaspixmapsink->eo); + evaspixmapsink->eo = eo; + if (!gst_evaspixmapsink_xpixmap_link(evaspixmapsink)) { + GST_WARNING_OBJECT (evaspixmapsink,"link evas image object with pixmap failed..."); + evaspixmapsink->eo = NULL; + break; + } + /* add evas object callbacks on a new evas image object */ + EVASPIXMAPSINK_SET_EVAS_OBJECT_EVENT_CALLBACK (eo, evaspixmapsink); + } + GST_INFO_OBJECT (evaspixmapsink,"Evas image object(%x) is set", evaspixmapsink->eo); + } else { + GST_ERROR_OBJECT (evaspixmapsink,"Cannot set evas-object property: value is not an evas image object"); + } + break; + } + case PROP_FLIP: + evaspixmapsink->flip = g_value_get_enum(value); + break; + case PROP_ROTATE_ANGLE: + evaspixmapsink->rotate_angle = g_value_get_enum (value); + break; + case PROP_VISIBLE: + { + Eina_Bool r; + gboolean visible = g_value_get_boolean (value); + GST_INFO_OBJECT (evaspixmapsink,"evaspixmapsink->visible(%d), new value of visible(%d)", evaspixmapsink->visible, visible); + if (evaspixmapsink->visible != visible) { + evaspixmapsink->visible = visible; + if (evaspixmapsink->eo) { + evaspixmapsink->update_visibility = UPDATE_TRUE; + if (evaspixmapsink->epipe_request_count > EPIPE_REQUEST_LIMIT) { + GST_WARNING_OBJECT (evaspixmapsink,"skip ecore_pipe_write()", evaspixmapsink->epipe_request_count); + if (visible) { + evas_object_show(evaspixmapsink->eo); + GST_WARNING_OBJECT (evaspixmapsink, "object show (forcely)"); + } + } else { + r = ecore_pipe_write (evaspixmapsink->epipe, &evaspixmapsink->update_visibility, SIZE_FOR_UPDATE_VISIBILITY); + evaspixmapsink->epipe_request_count++; + } + if (r == EINA_FALSE) { + GST_WARNING ("Failed to ecore_pipe_write() for updating visibility)\n"); + } + if (!visible) { + int i = 0; + g_mutex_lock( evaspixmapsink->flow_lock ); + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if (evaspixmapsink->xpixmap[i]) { + gst_evaspixmapsink_xpixmap_clear (evaspixmapsink, evaspixmapsink->xpixmap[i]); + } + } + evas_object_hide(evaspixmapsink->eo); + GST_INFO_OBJECT (evaspixmapsink, "object hide (forcely)"); + g_mutex_unlock( evaspixmapsink->flow_lock ); + } else { + gst_evaspixmap_buffer_put (evaspixmapsink, evaspixmapsink->evas_pixmap_buf); + } + } else { + GST_WARNING_OBJECT (evaspixmapsink,"evas image object was not set"); + } + } + break; + } + case PROP_ORIGIN_SIZE: + evaspixmapsink->use_origin_size = g_value_get_boolean (value); + GST_INFO_OBJECT (evaspixmapsink,"set origin-size (%d)",evaspixmapsink->use_origin_size); + if (evaspixmapsink->previous_origin_size != evaspixmapsink->use_origin_size) { + if (!gst_evaspixmapsink_xpixmap_link(evaspixmapsink)) { + GST_WARNING_OBJECT (evaspixmapsink,"link evas image object with pixmap failed..."); + } + evaspixmapsink->previous_origin_size = evaspixmapsink->use_origin_size; + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_evaspixmapsink_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GstEvasPixmapSink *evaspixmapsink; + + g_return_if_fail (GST_IS_EVASPIXMAPSINK (object)); + + evaspixmapsink = GST_EVASPIXMAPSINK (object); + + switch (prop_id) { + case PROP_HUE: + g_value_set_int (value, evaspixmapsink->hue); + break; + case PROP_CONTRAST: + g_value_set_int (value, evaspixmapsink->contrast); + break; + case PROP_BRIGHTNESS: + g_value_set_int (value, evaspixmapsink->brightness); + break; + case PROP_SATURATION: + g_value_set_int (value, evaspixmapsink->saturation); + break; + case PROP_DISPLAY: + g_value_set_string (value, evaspixmapsink->display_name); + break; + case PROP_SYNCHRONOUS: + g_value_set_boolean (value, evaspixmapsink->synchronous); + break; + case PROP_PIXEL_ASPECT_RATIO: + if (evaspixmapsink->par) { + if (!g_value_transform (evaspixmapsink->par, value)) { + g_warning ("g_value_transform() failure"); + } + } + break; + case PROP_DEVICE: + { + char *adaptor_no_s = g_strdup_printf ("%u", evaspixmapsink->adaptor_no); + g_value_set_string (value, adaptor_no_s); + g_free (adaptor_no_s); + break; + } + case PROP_DEVICE_NAME: + if (evaspixmapsink->xcontext && evaspixmapsink->xcontext->adaptors) { + g_value_set_string (value, + evaspixmapsink->xcontext->adaptors[evaspixmapsink->adaptor_no]); + } else { + g_value_set_string (value, NULL); + } + break; + case PROP_DOUBLE_BUFFER: + g_value_set_boolean (value, evaspixmapsink->double_buffer); + break; + case PROP_AUTOPAINT_COLORKEY: + g_value_set_boolean (value, evaspixmapsink->autopaint_colorkey); + break; + case PROP_COLORKEY: + g_value_set_int (value, evaspixmapsink->colorkey); + break; + case PROP_PIXMAP_WIDTH: + { + GST_LOG_OBJECT (evaspixmapsink, "Not supported"); + break; + } + case PROP_PIXMAP_HEIGHT: + { + GST_LOG_OBJECT (evaspixmapsink, "Not supported"); + break; + } + case PROP_DISPLAY_GEOMETRY_METHOD: + g_value_set_enum (value, evaspixmapsink->display_geometry_method); + break; + case PROP_DST_ROI_X: + g_value_set_int (value, evaspixmapsink->dst_roi.x); + break; + case PROP_DST_ROI_Y: + g_value_set_int (value, evaspixmapsink->dst_roi.y); + break; + case PROP_DST_ROI_W: + g_value_set_int (value, evaspixmapsink->dst_roi.w); + break; + case PROP_DST_ROI_H: + g_value_set_int (value, evaspixmapsink->dst_roi.h); + break; + case PROP_STOP_VIDEO: + g_value_set_int (value, evaspixmapsink->stop_video); + break; + case PROP_EVAS_OBJECT: + g_value_set_pointer (value, evaspixmapsink->eo); + break; + case PROP_FLIP: + g_value_set_enum(value, evaspixmapsink->flip); + break; + case PROP_ROTATE_ANGLE: + g_value_set_enum (value, evaspixmapsink->rotate_angle); + break; + case PROP_VISIBLE: + g_value_set_boolean (value, evaspixmapsink->visible); + break; + case PROP_ORIGIN_SIZE: + g_value_set_boolean (value, evaspixmapsink->use_origin_size); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_evaspixmapsink_reset (GstEvasPixmapSink *evaspixmapsink) +{ + GST_WARNING_OBJECT (evaspixmapsink,"[START]"); + + GThread *thread; + GST_OBJECT_LOCK (evaspixmapsink); + evaspixmapsink->running = FALSE; + int i = 0; + + /* grab thread and mark it as NULL */ + thread = evaspixmapsink->event_thread; + evaspixmapsink->event_thread = NULL; + GST_OBJECT_UNLOCK (evaspixmapsink); + + /* Wait for our event thread to finish before we clean up our stuff. */ + if (thread) { + g_thread_join (thread); + } + + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + if(evaspixmapsink->damage[i]) { + XDamageDestroy(evaspixmapsink->xcontext->disp, evaspixmapsink->damage[i]); + evaspixmapsink->damage[i] = NULL; + } + } + EVASPIXMAPSINK_UNSET_EVAS_OBJECT_EVENT_CALLBACK( evaspixmapsink->eo ); + + if (evaspixmapsink->evas_pixmap_buf) { + gst_buffer_unref (GST_BUFFER_CAST (evaspixmapsink->evas_pixmap_buf)); + evaspixmapsink->evas_pixmap_buf = NULL; + } + + for (i = 0; i < evaspixmapsink->num_of_pixmaps; i++) { + gst_evaspixmapsink_xpixmap_clear (evaspixmapsink, evaspixmapsink->xpixmap[i]); + gst_evaspixmapsink_xpixmap_destroy (evaspixmapsink, evaspixmapsink->xpixmap[i]); + evaspixmapsink->xpixmap[i] = NULL; + } + if (evaspixmapsink->eo) { + evas_object_image_native_surface_set(evaspixmapsink->eo, NULL); + evaspixmapsink->eo = NULL; + } + + evaspixmapsink->render_rect.x = evaspixmapsink->render_rect.y = + evaspixmapsink->render_rect.w = evaspixmapsink->render_rect.h = 0; + evaspixmapsink->have_render_rect = FALSE; + + evaspixmapsink->epipe_request_count = 0; + + gst_evaspixmapsink_xcontext_clear (evaspixmapsink); + + GST_WARNING_OBJECT (evaspixmapsink,"[END]"); +} + +/* Finalize is called only once, dispose can be called multiple times. + * We use mutexes and don't reset stuff to NULL here so let's register + * as a finalize. */ +static void +gst_evaspixmapsink_finalize (GObject *object) +{ + GstEvasPixmapSink *evaspixmapsink; + evaspixmapsink = GST_EVASPIXMAPSINK (object); + GST_DEBUG_OBJECT (evaspixmapsink,"[START]"); + + if (evaspixmapsink->display_name) { + g_free (evaspixmapsink->display_name); + evaspixmapsink->display_name = NULL; + } + if (evaspixmapsink->par) { + g_free (evaspixmapsink->par); + evaspixmapsink->par = NULL; + } + if (evaspixmapsink->x_lock) { + g_mutex_free (evaspixmapsink->x_lock); + evaspixmapsink->x_lock = NULL; + } + if (evaspixmapsink->flow_lock) { + g_mutex_free (evaspixmapsink->flow_lock); + evaspixmapsink->flow_lock = NULL; + } + if (evaspixmapsink->pixmap_ref_lock) { + g_mutex_free (evaspixmapsink->pixmap_ref_lock); + evaspixmapsink->pixmap_ref_lock = NULL; + } + if (evaspixmapsink->epipe) { + ecore_pipe_del (evaspixmapsink->epipe); + evaspixmapsink->epipe = NULL; + } + + GST_DEBUG_OBJECT (evaspixmapsink,"[END]"); + + G_OBJECT_CLASS (parent_class)->finalize (object); + + MMTA_ACUM_ITEM_SHOW_RESULT_TO(MMTA_SHOW_FILE); + MMTA_RELEASE(); +} + +static void +gst_evaspixmapsink_init (GstEvasPixmapSink *evaspixmapsink) +{ + int i = 0; + + GST_DEBUG_OBJECT (evaspixmapsink,"[START]"); + + evaspixmapsink->display_name = NULL; + evaspixmapsink->adaptor_no = 0; + evaspixmapsink->xcontext = NULL; + + for (i = 0; i < NUM_OF_PIXMAP; i++) { + evaspixmapsink->xpixmap[i] = NULL; + evaspixmapsink->damage[i] = 0; + } + + evaspixmapsink->evas_pixmap_buf = NULL; + + evaspixmapsink->hue = evaspixmapsink->saturation = 0; + evaspixmapsink->contrast = evaspixmapsink->brightness = 0; + evaspixmapsink->cb_changed = FALSE; + + evaspixmapsink->fps_n = 0; + evaspixmapsink->fps_d = 0; + evaspixmapsink->video_width = 0; + evaspixmapsink->video_height = 0; + + evaspixmapsink->x_lock = g_mutex_new (); + evaspixmapsink->flow_lock = g_mutex_new (); + evaspixmapsink->pixmap_ref_lock = g_mutex_new(); + + evaspixmapsink->synchronous = FALSE; + evaspixmapsink->double_buffer = TRUE; + evaspixmapsink->par = NULL; + evaspixmapsink->autopaint_colorkey = TRUE; + evaspixmapsink->running = FALSE; + + /* on 16bit displays this becomes r,g,b = 1,2,3 + * on 24bit displays this becomes r,g,b = 8,8,16 + * as a port atom value + */ + evaspixmapsink->colorkey = (8 << 16) | (8 << 8) | 16; + + evaspixmapsink->display_geometry_method = DEF_DISPLAY_GEOMETRY_METHOD; + evaspixmapsink->dst_roi.x = 0; + evaspixmapsink->dst_roi.y = 0; + evaspixmapsink->dst_roi.w = 0; + evaspixmapsink->dst_roi.h = 0; + evaspixmapsink->scr_w = 0; + evaspixmapsink->scr_h = 0; + evaspixmapsink->aligned_width = 0; + evaspixmapsink->aligned_height = 0; + evaspixmapsink->stop_video = FALSE; + evaspixmapsink->eo = NULL; + evaspixmapsink->epipe = NULL; + evaspixmapsink->epipe_request_count = 0; + evaspixmapsink->do_link = FALSE; + evaspixmapsink->flip = DEF_DISPLAY_FLIP; + evaspixmapsink->rotate_angle = DEGREE_0; + evaspixmapsink->visible = TRUE; + evaspixmapsink->update_visibility = UPDATE_FALSE; + evaspixmapsink->use_origin_size = FALSE; + evaspixmapsink->previous_origin_size = FALSE; + + evaspixmapsink->num_of_pixmaps = NUM_OF_PIXMAP; + + evaspixmapsink->buf_shared_type = BUF_SHARE_METHOD_NONE; + + MMTA_INIT(); + + GST_DEBUG_OBJECT (evaspixmapsink,"[END]"); + } + +static void +gst_evaspixmapsink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, + "EvasPixmapSink", "Sink/Video", + "evas image object videosink based on Xv extension", "Sangchul Lee "); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_evaspixmapsink_sink_template_factory)); +} + +static void +gst_evaspixmapsink_class_init (GstEvasPixmapSinkClass *klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + GstVideoSinkClass *videosink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + videosink_class = (GstVideoSinkClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_evaspixmapsink_set_property; + gobject_class->get_property = gst_evaspixmapsink_get_property; + + g_object_class_install_property (gobject_class, PROP_CONTRAST, + g_param_spec_int ("contrast", "Contrast", "The contrast of the video", + -1000, 1000, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_BRIGHTNESS, + g_param_spec_int ("brightness", "Brightness", + "The brightness of the video", -1000, 1000, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_HUE, + g_param_spec_int ("hue", "Hue", "The hue of the video", -1000, 1000, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SATURATION, + g_param_spec_int ("saturation", "Saturation", + "The saturation of the video", -1000, 1000, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DISPLAY, + g_param_spec_string ("display", "Display", "X Display name", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_SYNCHRONOUS, + g_param_spec_boolean ("synchronous", "Synchronous", + "When enabled, runs " + "the X display in synchronous mode. (used only for debugging)", FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_PIXEL_ASPECT_RATIO, + g_param_spec_string ("pixel-aspect-ratio", "Pixel Aspect Ratio", + "The pixel aspect ratio of the device", "1/1", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_string ("device", "Adaptor number", + "The number of the video adaptor", "0", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_DEVICE_NAME, + g_param_spec_string ("device-name", "Adaptor name", + "The name of the video adaptor", NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:double-buffer + * + * Whether to double-buffer the output. + * + * Since: 0.10.14 + */ + g_object_class_install_property (gobject_class, PROP_DOUBLE_BUFFER, + g_param_spec_boolean ("double-buffer", "Double-buffer", + "Whether to double-buffer the output", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstEvasPixmapSink:autopaint-colorkey + * + * Whether to autofill overlay with colorkey + * + * Since: 0.10.21 + */ + g_object_class_install_property (gobject_class, PROP_AUTOPAINT_COLORKEY, + g_param_spec_boolean ("autopaint-colorkey", "Autofill with colorkey", + "Whether to autofill overlay with colorkey", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstEvasPixmapSink:colorkey + * + * Color to use for the overlay mask. + * + * Since: 0.10.21 + */ + g_object_class_install_property (gobject_class, PROP_COLORKEY, + g_param_spec_int ("colorkey", "Colorkey", + "Color to use for the overlay mask", G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:pixmap-width + * + * Actual width of the pixmap. + */ + g_object_class_install_property (gobject_class, PROP_PIXMAP_WIDTH, + g_param_spec_uint64 ("pixmap-width", "pixmap-width", "Width of the pixmap", 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:pixmap-height + * + * Actual height of the pixmap. + */ + g_object_class_install_property (gobject_class, PROP_PIXMAP_HEIGHT, + g_param_spec_uint64 ("pixmap-height", "pixmap-height", "Height of the pixmap", 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:display-geometry-method + * + * Display geometrical method setting + */ + g_object_class_install_property(gobject_class, PROP_DISPLAY_GEOMETRY_METHOD, + g_param_spec_enum("display-geometry-method", "Display geometry method", + "Geometrical method for display", + GST_TYPE_EVASPIXMAPSINK_DISPLAY_GEOMETRY_METHOD, DEF_DISPLAY_GEOMETRY_METHOD, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:dst-roi-x + * + * X value of Destination ROI + */ + g_object_class_install_property (gobject_class, PROP_DST_ROI_X, + g_param_spec_int ("dst-roi-x", "Dst-ROI-X", + "X value of Destination ROI(only effective \"CUSTOM_ROI\")", 0, XV_SCREEN_SIZE_WIDTH, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:dst-roi-y + * + * Y value of Destination ROI + */ + g_object_class_install_property (gobject_class, PROP_DST_ROI_Y, + g_param_spec_int ("dst-roi-y", "Dst-ROI-Y", + "Y value of Destination ROI(only effective \"CUSTOM_ROI\")", 0, XV_SCREEN_SIZE_HEIGHT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:dst-roi-w + * + * W value of Destination ROI + */ + g_object_class_install_property (gobject_class, PROP_DST_ROI_W, + g_param_spec_int ("dst-roi-w", "Dst-ROI-W", + "W value of Destination ROI(only effective \"CUSTOM_ROI\")", 0, XV_SCREEN_SIZE_WIDTH, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:dst-roi-h + * + * H value of Destination ROI + */ + g_object_class_install_property (gobject_class, PROP_DST_ROI_H, + g_param_spec_int ("dst-roi-h", "Dst-ROI-H", + "H value of Destination ROI(only effective \"CUSTOM_ROI\")", 0, XV_SCREEN_SIZE_HEIGHT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:stop-video + * + * Stop video for releasing video source buffer + */ + g_object_class_install_property (gobject_class, PROP_STOP_VIDEO, + g_param_spec_int ("stop-video", "Stop-Video", "Stop video for releasing video source buffer", 0, 1, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:evas-object + * + * Evas image object for rendering + */ + g_object_class_install_property (gobject_class, PROP_EVAS_OBJECT, + g_param_spec_pointer ("evas-object", "Destination Evas Object", "Destination evas image object", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:display-flip + * + * Display flip setting + */ + g_object_class_install_property(gobject_class, PROP_FLIP, + g_param_spec_enum("flip", "Display flip", + "Flip for display", + GST_TYPE_EVASPIXMAPSINK_FLIP, DEF_DISPLAY_FLIP, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:rotate + * + * draw rotation angle setting + */ + g_object_class_install_property(gobject_class, PROP_ROTATE_ANGLE, + g_param_spec_enum("rotate", "Rotate angle", "Rotate angle of display output",GST_TYPE_EVASPIXMAPSINK_ROTATE_ANGLE, DEGREE_0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:visible + * + * visible setting for a evas image object + */ + g_object_class_install_property (gobject_class, PROP_VISIBLE, + g_param_spec_boolean ("visible", "Visible", "When setting it false, evas image object does not show", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GstEvasPixmapSink:origin-size + * + * Set pixmap size with media source's width and height + */ + g_object_class_install_property (gobject_class, PROP_ORIGIN_SIZE, + g_param_spec_boolean ("origin-size", "Origin-Size", "When setting it true, pixmap will be created with media source's width and height", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + gobject_class->finalize = gst_evaspixmapsink_finalize; + + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_evaspixmapsink_change_state); + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_evaspixmapsink_getcaps); + gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_evaspixmapsink_setcaps); + gstbasesink_class->get_times = GST_DEBUG_FUNCPTR (gst_evaspixmapsink_get_times); + gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_evaspixmapsink_event); + videosink_class->show_frame = GST_DEBUG_FUNCPTR (gst_evaspixmapsink_show_frame); +} + +/* Object typing & Creation */ +GType +gst_evaspixmapsink_get_type (void) +{ + static GType evaspixmapsink_type = 0; + + if (!evaspixmapsink_type) { + static const GTypeInfo evaspixmapsink_info = { + sizeof (GstEvasPixmapSinkClass), + gst_evaspixmapsink_base_init, + NULL, + (GClassInitFunc) gst_evaspixmapsink_class_init, + NULL, + NULL, + sizeof (GstEvasPixmapSink), + 0, + (GInstanceInitFunc) gst_evaspixmapsink_init, + }; + static const GInterfaceInfo iface_info = { + (GInterfaceInitFunc) gst_evaspixmapsink_interface_init, + NULL, + NULL, + }; + static const GInterfaceInfo navigation_info = { + (GInterfaceInitFunc) gst_evaspixmapsink_navigation_init, + NULL, + NULL, + }; + static const GInterfaceInfo colorbalance_info = { + (GInterfaceInitFunc) gst_evaspixmapsink_colorbalance_init, + NULL, + NULL, + }; + static const GInterfaceInfo propertyprobe_info = { + (GInterfaceInitFunc) gst_evaspixmapsink_property_probe_interface_init, + NULL, + NULL, + }; + evaspixmapsink_type = g_type_register_static (GST_TYPE_VIDEO_SINK, "GstEvasPixmapSink", &evaspixmapsink_info, 0); + + g_type_add_interface_static (evaspixmapsink_type, GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info); + g_type_add_interface_static (evaspixmapsink_type, GST_TYPE_NAVIGATION, &navigation_info); + g_type_add_interface_static (evaspixmapsink_type, GST_TYPE_COLOR_BALANCE, &colorbalance_info); + g_type_add_interface_static (evaspixmapsink_type, GST_TYPE_PROPERTY_PROBE, &propertyprobe_info); + + /* register type and create class in a more safe place instead of at + * runtime since the type registration and class creation is not + * threadsafe. */ + g_type_class_ref (gst_evaspixmap_buffer_get_type ()); + } + + return evaspixmapsink_type; +} + +static gboolean +plugin_init (GstPlugin *plugin) +{ + if (!gst_element_register (plugin, "evaspixmapsink", GST_RANK_NONE, GST_TYPE_EVASPIXMAPSINK)) { + return FALSE; + } + GST_DEBUG_CATEGORY_INIT (gst_debug_evaspixmapsink, "evaspixmapsink", 0, "evaspixmapsink element"); + GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE"); + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, + "evaspixmapsink","Evas image object render plugin using Xv extension", plugin_init, + VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/mobile/evaspixmapsink/evaspixmapsink.h b/mobile/evaspixmapsink/evaspixmapsink.h new file mode 100644 index 0000000..9bbacca --- /dev/null +++ b/mobile/evaspixmapsink/evaspixmapsink.h @@ -0,0 +1,404 @@ +/* + * EvasPixmapSink + * + * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Sangchul Lee + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_EVASPIXMAPSINK_H__ +#define __GST_EVASPIXMAPSINK_H__ + +#include +#include + +#ifdef HAVE_XSHM +#include +#include +#include +#endif /* HAVE_XSHM */ + +#include +#include + +#ifdef HAVE_XSHM +#include +#endif /* HAVE_XSHM */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include + +#define MAX_PLANE_NUM 3 +#define MAX_BUFFER_NUM 20 +#define MAX_GEM_BUFFER_NUM (MAX_PLANE_NUM * MAX_BUFFER_NUM) +typedef struct _gem_info_t { + int dmabuf_fd; + unsigned int gem_handle; + unsigned int gem_name; + tbm_bo bo; + Pixmap ref_pixmap; +} gem_info_t; + +typedef enum { + BUF_SHARE_METHOD_NONE = -1, + BUF_SHARE_METHOD_PADDR = 0, + BUF_SHARE_METHOD_FD, + BUF_SHARE_METHOD_TIZEN_BUFFER +} buf_share_method_t; + +G_BEGIN_DECLS + +#define GST_TYPE_EVASPIXMAPSINK \ + (gst_evaspixmapsink_get_type()) +#define GST_EVASPIXMAPSINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_EVASPIXMAPSINK, GstEvasPixmapSink)) +#define GST_EVASPIXMAPSINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_EVASPIXMAPSINK, GstEvasPixmapSinkClass)) +#define GST_IS_EVASPIXMAPSINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_EVASPIXMAPSINK)) +#define GST_IS_EVASPIXMAPSINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_EVASPIXMAPSINK)) + +#define XV_SCREEN_SIZE_WIDTH 4096 +#define XV_SCREEN_SIZE_HEIGHT 4096 + +#define MARGIN_OF_ERROR 0.005 +#define NUM_OF_PIXMAP 3 + +typedef struct _GstXContext GstXContext; +typedef struct _GstXPixmap GstXPixmap; +typedef struct _GstEvasPixmapFormat GstEvasPixmapFormat; +typedef struct _GstEvasPixmapBuffer GstEvasPixmapBuffer; +typedef struct _GstEvasPixmapBufferClass GstEvasPixmapBufferClass; +typedef struct _GstEvasPixmapSink GstEvasPixmapSink; +typedef struct _GstEvasPixmapSinkClass GstEvasPixmapSinkClass; + +/* + * GstXContext: + * @disp: the X11 Display of this context + * @screen: the default Screen of Display @disp + * @screen_num: the Screen number of @screen + * @visual: the default Visual of Screen @screen + * @root: the root Window of Display @disp + * @white: the value of a white pixel on Screen @screen + * @black: the value of a black pixel on Screen @screen + * @depth: the color depth of Display @disp + * @bpp: the number of bits per pixel on Display @disp + * @endianness: the endianness of image bytes on Display @disp + * @width: the width in pixels of Display @disp + * @height: the height in pixels of Display @disp + * @widthmm: the width in millimeters of Display @disp + * @heightmm: the height in millimeters of Display @disp + * @par: the pixel aspect ratio calculated from @width, @widthmm and @height, + * @heightmm ratio + * @use_xshm: used to known wether of not XShm extension is usable or not even + * if the Extension is present + * @xv_port_id: the XVideo port ID + * @im_format: used to store at least a valid format for XShm calls checks + * @formats_list: list of supported image formats on @xv_port_id + * @channels_list: list of #GstColorBalanceChannels + * @caps: the #GstCaps that Display @disp can accept + * + * Structure used to store various informations collected/calculated for a + * Display. + */ +struct _GstXContext { + Display *disp; + + Screen *screen; + gint screen_num; + + Visual *visual; + + Window root; + + gulong white, black; + + gint depth; + gint bpp; + gint endianness; + + gint width, height; + gint widthmm, heightmm; + GValue *par; /* calculated pixel aspect ratio */ + + gboolean use_xshm; + + XvPortID xv_port_id; + guint nb_adaptors; + gchar ** adaptors; + gint im_format; + + GList *formats_list; + GList *channels_list; + + GstCaps *caps; +}; + +/* + * GstXPixmap: + * @pixmap: the pixmap ID of this X11 pixmap + * @width: the width in pixels of Pixmap @pixmap + * @height: the height in pixels of Pixmap @pixmap + * @gc: the Graphical Context of Pixmap @pixmap + * + * Structure used to store informations about a Pixmap. + */ +struct _GstXPixmap { + Pixmap pixmap; + gint x, y; + gint width, height; + GC gc; + guint ref; + gint damaged_time; + Pixmap prev_pixmap; + GC prev_gc; +}; + +/** + * GstEvasPixmapFormat: + * @format: the image format + * @caps: generated #GstCaps for this image format + * + * Structure storing image format to #GstCaps association. + */ +struct _GstEvasPixmapFormat { + gint format; + GstCaps *caps; +}; + +/** + * GstEvasPixmapBuffer: + * @evaspixmapsink: a reference to our #GstEvasPixmapSink + * @xvimage: the XvImage of this buffer + * @width: the width in pixels of XvImage @xvimage + * @height: the height in pixels of XvImage @xvimage + * @im_format: the image format of XvImage @xvimage + * @size: the size in bytes of XvImage @xvimage + * + * Subclass of #GstBuffer containing additional information about an XvImage. + */ +struct _GstEvasPixmapBuffer { + GstBuffer buffer; + + /* Reference to the evaspixmapsink we belong to */ + GstEvasPixmapSink *evaspixmapsink; + XvImage *xvimage; + +#ifdef HAVE_XSHM + XShmSegmentInfo SHMInfo; +#endif /* HAVE_XSHM */ + + gint width, height; + gint im_format; + size_t size; +}; + +/** + * GstEvasPixmapSink: + * @display_name: the name of the Display we want to render to + * @xcontext: our instance's #GstXContext + * @xpixmap: the #GstXPixmap we are rendering to + * @fps_n: the framerate fraction numerator + * @fps_d: the framerate fraction denominator + * @x_lock: used to protect X calls as we are not using the XLib in threaded + * mode + * @flow_lock: used to protect data flow routines from external calls such as + * methods from the #GstXOverlay interface + * @par: used to override calculated pixel aspect ratio from @xcontext + * @synchronous: used to store if XSynchronous should be used or not (for + * debugging purpose only) + * @keep_aspect: used to remember if reverse negotiation scaling should respect + * aspect ratio + * @brightness: used to store the user settings for color balance brightness + * @contrast: used to store the user settings for color balance contrast + * @hue: used to store the user settings for color balance hue + * @saturation: used to store the user settings for color balance saturation + * @cb_changed: used to store if the color balance settings where changed + * @video_width: the width of incoming video frames in pixels + * @video_height: the height of incoming video frames in pixels + * + * The #GstEvasPixmapSink data structure. + */ +struct _GstEvasPixmapSink { + /* Our element stuff */ + GstVideoSink videosink; + + char *display_name; + guint adaptor_no; + + GstXContext *xcontext; + GstXPixmap *xpixmap[NUM_OF_PIXMAP]; + GstEvasPixmapBuffer *evas_pixmap_buf; + + GThread *event_thread; + gboolean running; + + gint fps_n; + gint fps_d; + + GMutex *x_lock; + GMutex *flow_lock; + GMutex *pixmap_ref_lock; + + /* object-set pixel aspect ratio */ + GValue *par; + + gboolean synchronous; + gboolean double_buffer; + + gint brightness; + gint contrast; + gint hue; + gint saturation; + gboolean cb_changed; + + /* size of incoming video, used as the size for XvImage */ + guint video_width, video_height; + + /* display sizes, used for clipping the image */ + gint disp_x, disp_y; + gint disp_width, disp_height; + + /* port attributes */ + gboolean autopaint_colorkey; + gint colorkey; + + /* port features */ + gboolean have_autopaint_colorkey; + gboolean have_colorkey; + gboolean have_double_buffer; + + /* target video rectagle */ + GstVideoRectangle render_rect; + gboolean have_render_rect; + + /* display */ + guint flip; + guint rotate_angle; + guint display_geometry_method; + GstVideoRectangle dst_roi; + guint scr_w, scr_h; + /* needed if fourcc is one if S series */ + guint aligned_width; + guint aligned_height; + + gboolean stop_video; + buf_share_method_t buf_shared_type; + + /* ecore & evas object */ + Ecore_Pipe *epipe; + Evas_Object *eo; + Evas_Coord w; + Evas_Coord h; + gboolean visible; + gint last_updated_idx; + gchar update_visibility; + guint epipe_request_count; + + /* pixmap */ + gboolean do_link; + gboolean use_origin_size; + gboolean previous_origin_size; + gint sizediff_width; + gint sizediff_height; + guint num_of_pixmaps; + + /* damage event */ + Damage damage[NUM_OF_PIXMAP]; + Damage prev_damage[NUM_OF_PIXMAP]; + int damage_case; + + gint drm_fd; + gem_info_t gem_info[MAX_GEM_BUFFER_NUM]; +}; + +/* max plane count *********************************************************/ +#define MPLANE_IMGB_MAX_COUNT (4) + +/* image buffer definition *************************************************** + + +------------------------------------------+ --- + | | ^ + | uaddr[], index[] | | + | +---------------------------+ --- | | + | | | ^ | | + | |<-------- width[] -------->| | | | + | | | | | | + | | | | + | | |height[]|elevation[] + | | | | + | | | | | | + | | | | | | + | | | v | | + | +---------------------------+ --- | | + | | v + +------------------------------------------+ --- + + |<----------------- stride[] ------------------>| +*/ +typedef struct _GstMultiPlaneImageBuffer GstMultiPlaneImageBuffer; +struct _GstMultiPlaneImageBuffer +{ + GstBuffer buffer; + + /* width of each image plane */ + gint width[MPLANE_IMGB_MAX_COUNT]; + /* height of each image plane */ + gint height[MPLANE_IMGB_MAX_COUNT]; + /* stride of each image plane */ + gint stride[MPLANE_IMGB_MAX_COUNT]; + /* elevation of each image plane */ + gint elevation[MPLANE_IMGB_MAX_COUNT]; + /* user space address of each image plane */ + gpointer uaddr[MPLANE_IMGB_MAX_COUNT]; + /* Index of real address of each image plane, if needs */ + gpointer index[MPLANE_IMGB_MAX_COUNT]; + /* left postion, if needs */ + gint x; + /* top position, if needs */ + gint y; + /* to align memory */ + gint __dummy2; + /* arbitrary data */ + gint data[16]; +}; + +struct _GstEvasPixmapSinkClass { + GstVideoSinkClass parent_class; +}; + +GType gst_evaspixmapsink_get_type(void); + +G_END_DECLS + +#endif /* __GST_EVASPIXMAPSINK_H__ */ diff --git a/mobile/evaspixmapsink/xv_types.h b/mobile/evaspixmapsink/xv_types.h new file mode 100644 index 0000000..8266e34 --- /dev/null +++ b/mobile/evaspixmapsink/xv_types.h @@ -0,0 +1,101 @@ +/************************************************************************** + +xserver-xorg-video-exynos + +Copyright 2010 - 2011 Samsung Electronics co., Ltd. All Rights Reserved. + +Contact: Boram Park + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* */ +/* File name : xv_types.h */ +/* Author : Boram Park (boram1288.park@samsung.com) */ +/* Protocol Version : 1.0.1 (Dec 16th 2009) */ +/* This file is for describing Xv APIs' buffer encoding method. */ +/* */ + +#ifndef __XV_TYPE_H__ +#define __XV_TYPE_H__ + +#define XV_DATA_HEADER 0xDEADCD01 +#define XV_DATA_VERSION 0x00010001 + +/* Return Values */ +#define XV_OK 0 +#define XV_HEADER_ERROR -1 +#define XV_VERSION_MISMATCH -2 + +/* Video Mode */ +#define DISPLAY_MODE_DEFAULT 0 +#define DISPLAY_MODE_PRI_VIDEO_ON_AND_SEC_VIDEO_FULL_SCREEN 1 +#define DISPLAY_MODE_PRI_VIDEO_OFF_AND_SEC_VIDEO_FULL_SCREEN 2 + +/* Color space range */ +#define CSC_RANGE_NARROW 0 +#define CSC_RANGE_WIDE 1 + +/* Buffer Type */ +#define XV_BUF_TYPE_DMABUF 0 +#define XV_BUF_TYPE_LEGACY 1 +#define XV_BUF_PLANE_NUM 3 + +/* Data structure for XvPutImage / XvShmPutImage */ +typedef struct +{ + unsigned int _header; /* for internal use only */ + unsigned int _version; /* for internal use only */ + + unsigned int YBuf; + unsigned int CbBuf; + unsigned int CrBuf; + unsigned int BufType; + unsigned int dmabuf_fd[XV_BUF_PLANE_NUM]; + unsigned int gem_handle[XV_BUF_PLANE_NUM]; + void *bo[XV_BUF_PLANE_NUM]; +} XV_DATA, * XV_DATA_PTR; + +static void +#ifdef __GNUC__ +__attribute__ ((unused)) +#endif +XV_INIT_DATA (XV_DATA_PTR data) +{ + data->_header = XV_DATA_HEADER; + data->_version = XV_DATA_VERSION; +} + +static int +#ifdef __GNUC__ +__attribute__ ((unused)) +#endif +XV_VALIDATE_DATA (XV_DATA_PTR data) +{ + if (data->_header != XV_DATA_HEADER) + return XV_HEADER_ERROR; + if (data->_version != XV_DATA_VERSION) + return XV_VERSION_MISMATCH; + return XV_OK; +} + +#endif diff --git a/mobile/gst-autogen.sh b/mobile/gst-autogen.sh new file mode 100755 index 0000000..7b31212 --- /dev/null +++ b/mobile/gst-autogen.sh @@ -0,0 +1,308 @@ +# a silly hack that generates autoregen.sh but it's handy +# Remove the old autoregen.sh first to create a new file, +# as the current one may be being read by the shell executing +# this script. +if [ -f "autoregen.sh" ]; then + rm autoregen.sh +fi +echo "#!/bin/sh" > autoregen.sh +echo "./autogen.sh $@ \$@" >> autoregen.sh +chmod +x autoregen.sh + +# helper functions for autogen.sh + +debug () +# print out a debug message if DEBUG is a defined variable +{ + if test ! -z "$DEBUG" + then + echo "DEBUG: $1" + fi +} + +version_check () +# check the version of a package +# first argument : package name (executable) +# second argument : optional path where to look for it instead +# third argument : source download url +# rest of arguments : major, minor, micro version +# all consecutive ones : suggestions for binaries to use +# (if not specified in second argument) +{ + PACKAGE=$1 + PKG_PATH=$2 + URL=$3 + MAJOR=$4 + MINOR=$5 + MICRO=$6 + + # for backwards compatibility, we let PKG_PATH=PACKAGE when PKG_PATH null + if test -z "$PKG_PATH"; then PKG_PATH=$PACKAGE; fi + debug "major $MAJOR minor $MINOR micro $MICRO" + VERSION=$MAJOR + if test ! -z "$MINOR"; then VERSION=$VERSION.$MINOR; else MINOR=0; fi + if test ! -z "$MICRO"; then VERSION=$VERSION.$MICRO; else MICRO=0; fi + + debug "major $MAJOR minor $MINOR micro $MICRO" + + for SUGGESTION in $PKG_PATH; do + COMMAND="$SUGGESTION" + + # don't check if asked not to + test -z "$NOCHECK" && { + echo -n " checking for $COMMAND >= $VERSION ... " + } || { + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + } + + debug "checking version with $COMMAND" + ($COMMAND --version) < /dev/null > /dev/null 2>&1 || + { + echo "not found." + continue + } + # strip everything that's not a digit, then use cut to get the first field + pkg_version=`$COMMAND --version|head -n 1|sed 's/^.*)[^0-9]*//'|cut -d' ' -f1` + debug "pkg_version $pkg_version" + # remove any non-digit characters from the version numbers to permit numeric + # comparison + pkg_major=`echo $pkg_version | cut -d. -f1 | sed s/[a-zA-Z\-].*//g` + pkg_minor=`echo $pkg_version | cut -d. -f2 | sed s/[a-zA-Z\-].*//g` + pkg_micro=`echo $pkg_version | cut -d. -f3 | sed s/[a-zA-Z\-].*//g` + test -z "$pkg_major" && pkg_major=0 + test -z "$pkg_minor" && pkg_minor=0 + test -z "$pkg_micro" && pkg_micro=0 + debug "found major $pkg_major minor $pkg_minor micro $pkg_micro" + + #start checking the version + debug "version check" + + # reset check + WRONG= + + if [ ! "$pkg_major" -gt "$MAJOR" ]; then + debug "major: $pkg_major <= $MAJOR" + if [ "$pkg_major" -lt "$MAJOR" ]; then + debug "major: $pkg_major < $MAJOR" + WRONG=1 + elif [ ! "$pkg_minor" -gt "$MINOR" ]; then + debug "minor: $pkg_minor <= $MINOR" + if [ "$pkg_minor" -lt "$MINOR" ]; then + debug "minor: $pkg_minor < $MINOR" + WRONG=1 + elif [ "$pkg_micro" -lt "$MICRO" ]; then + debug "micro: $pkg_micro < $MICRO" + WRONG=1 + fi + fi + fi + + if test ! -z "$WRONG"; then + echo "found $pkg_version, not ok !" + continue + else + echo "found $pkg_version, ok." + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + fi + done + + echo "not found !" + echo "You must have $PACKAGE installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at $URL" + return 1; +} + +aclocal_check () +{ + # normally aclocal is part of automake + # so we expect it to be in the same place as automake + # so if a different automake is supplied, we need to adapt as well + # so how's about replacing automake with aclocal in the set var, + # and saving that in $aclocal ? + # note, this will fail if the actual automake isn't called automake* + # or if part of the path before it contains it + if [ -z "$automake" ]; then + echo "Error: no automake variable set !" + return 1 + else + aclocal=`echo $automake | sed s/automake/aclocal/` + debug "aclocal: $aclocal" + if [ "$aclocal" != "aclocal" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-aclocal=$aclocal" + fi + if [ ! -x `which $aclocal` ]; then + echo "Error: cannot execute $aclocal !" + return 1 + fi + fi +} + +autoheader_check () +{ + # same here - autoheader is part of autoconf + # use the same voodoo + if [ -z "$autoconf" ]; then + echo "Error: no autoconf variable set !" + return 1 + else + autoheader=`echo $autoconf | sed s/autoconf/autoheader/` + debug "autoheader: $autoheader" + if [ "$autoheader" != "autoheader" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader" + fi + if [ ! -x `which $autoheader` ]; then + echo "Error: cannot execute $autoheader !" + return 1 + fi + fi + +} +autoconf_2_52d_check () +{ + # autoconf 2.52d has a weird issue involving a yes:no error + # so don't allow it's use + test -z "$NOCHECK" && { + ac_version=`$autoconf --version|head -n 1|sed 's/^[a-zA-Z\.\ ()]*//;s/ .*$//'` + if test "$ac_version" = "2.52d"; then + echo "autoconf 2.52d has an issue with our current build." + echo "We don't know who's to blame however. So until we do, get a" + echo "regular version. RPM's of a working version are on the gstreamer site." + exit 1 + fi + } + return 0 +} + +die_check () +{ + # call with $DIE + # if set to 1, we need to print something helpful then die + DIE=$1 + if test "x$DIE" = "x1"; + then + echo + echo "- Please get the right tools before proceeding." + echo "- Alternatively, if you're sure we're wrong, run with --nocheck." + exit 1 + fi +} + +autogen_options () +{ + if test "x$1" = "x"; then + return 0 + fi + + while test "x$1" != "x" ; do + optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + case "$1" in + --noconfigure) + NOCONFIGURE=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --noconfigure" + echo "+ configure run disabled" + shift + ;; + --nocheck) + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --nocheck" + NOCHECK=defined + echo "+ autotools version check disabled" + shift + ;; + --debug) + DEBUG=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug" + echo "+ debug output enabled" + shift + ;; + --prefix=*) + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$optarg" + echo "+ passing --prefix=$optarg to configure" + shift + ;; + --prefix) + shift + echo "DEBUG: $1" + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$1" + echo "+ passing --prefix=$1 to configure" + shift + ;; + + -h|--help) + echo "autogen.sh (autogen options) -- (configure options)" + echo "autogen.sh help options: " + echo " --noconfigure don't run the configure script" + echo " --nocheck don't do version checks" + echo " --debug debug the autogen process" + echo " --prefix will be passed on to configure" + echo + echo " --with-autoconf PATH use autoconf in PATH" + echo " --with-automake PATH use automake in PATH" + echo + echo "to pass options to configure, put them as arguments after -- " + exit 1 + ;; + --with-automake=*) + AUTOMAKE=$optarg + echo "+ using alternate automake in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-automake=$AUTOMAKE" + shift + ;; + --with-autoconf=*) + AUTOCONF=$optarg + echo "+ using alternate autoconf in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF" + shift + ;; + --disable*|--enable*|--with*) + echo "+ passing option $1 to configure" + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1" + shift + ;; + --) shift ; break ;; + *) echo "- ignoring unknown autogen.sh argument $1"; shift ;; + esac + done + + for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done + if test ! -z "$CONFIGURE_EXT_OPT" + then + echo "+ options passed to configure: $CONFIGURE_EXT_OPT" + fi +} + +toplevel_check () +{ + srcfile=$1 + test -f $srcfile || { + echo "You must run this script in the top-level $package directory" + exit 1 + } +} + + +tool_run () +{ + tool=$1 + options=$2 + run_if_fail=$3 + echo "+ running $tool $options..." + $tool $options || { + echo + echo $tool failed + eval $run_if_fail + exit 1 + } +} diff --git a/mobile/gst-plugins-ext0.10.manifest b/mobile/gst-plugins-ext0.10.manifest new file mode 100755 index 0000000..a76fdba --- /dev/null +++ b/mobile/gst-plugins-ext0.10.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/mobile/m4/Makefile.am b/mobile/m4/Makefile.am new file mode 100644 index 0000000..5fa63aa --- /dev/null +++ b/mobile/m4/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = as-version.m4 as-compiler-flag.m4 diff --git a/mobile/m4/as-compiler-flag.m4 b/mobile/m4/as-compiler-flag.m4 new file mode 100755 index 0000000..4134857 --- /dev/null +++ b/mobile/m4/as-compiler-flag.m4 @@ -0,0 +1,25 @@ +dnl as-compiler-flag.m4 0.0.1 +dnl autostars m4 macro for detection of compiler flags +dnl +dnl ds@schleef.org + +AC_DEFUN([AS_COMPILER_FLAG], +[ + AC_MSG_CHECKING([to see if compiler understands $1]) + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1" + + AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + $2 + true + else + $3 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + diff --git a/mobile/m4/as-version.m4 b/mobile/m4/as-version.m4 new file mode 100755 index 0000000..249102b --- /dev/null +++ b/mobile/m4/as-version.m4 @@ -0,0 +1,66 @@ +dnl as-version.m4 0.1.0 + +dnl autostars m4 macro for versioning + +dnl Thomas Vander Stichele + +dnl $Id: as-version.m4,v 1.2 2004-09-17 22:18:03 leroutier Exp $ + +dnl AS_VERSION(PACKAGE, PREFIX, MAJOR, MINOR, MICRO, NANO, +dnl ACTION-IF-NO-NANO, [ACTION-IF-NANO]) + +dnl example +dnl AS_VERSION(gstreamer, GST_VERSION, 0, 3, 2,) +dnl for a 0.3.2 release version + +dnl this macro +dnl - defines [$PREFIX]_MAJOR, MINOR and MICRO +dnl - if NANO is empty, then we're in release mode, else in cvs/dev mode +dnl - defines [$PREFIX], VERSION, and [$PREFIX]_RELEASE +dnl - executes the relevant action +dnl - AC_SUBST's PACKAGE, VERSION, [$PREFIX] and [$PREFIX]_RELEASE +dnl as well as the little ones +dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents +dnl maintainer mode from running ok +dnl +dnl don't forget to put #undef [$2] and [$2]_RELEASE in acconfig.h +dnl if you use acconfig.h + +AC_DEFUN([AS_VERSION], +[ + PACKAGE=[$1] + [$2]_MAJOR=[$3] + [$2]_MINOR=[$4] + [$2]_MICRO=[$5] + NANO=[$6] + [$2]_NANO=$NANO + if test "x$NANO" = "x" || test "x$NANO" = "x0"; + then + AC_MSG_NOTICE(configuring [$1] for release) + VERSION=[$3].[$4].[$5] + [$2]_RELEASE=1 + dnl execute action + ifelse([$7], , :, [$7]) + else + AC_MSG_NOTICE(configuring [$1] for development with nano $NANO) + VERSION=[$3].[$4].[$5].$NANO + [$2]_RELEASE=0.`date +%Y%m%d.%H%M%S` + dnl execute action + ifelse([$8], , :, [$8]) + fi + + [$2]=$VERSION + AC_DEFINE_UNQUOTED([$2], "$[$2]", [Define the version]) + AC_SUBST([$2]) + AC_DEFINE_UNQUOTED([$2]_RELEASE, "$[$2]_RELEASE", [Define the release version]) + AC_SUBST([$2]_RELEASE) + + AC_SUBST([$2]_MAJOR) + AC_SUBST([$2]_MINOR) + AC_SUBST([$2]_MICRO) + AC_SUBST([$2]_NANO) + AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Define the package name]) + AC_SUBST(PACKAGE) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Define the version]) + AC_SUBST(VERSION) +]) diff --git a/mobile/pdpushsrc/Makefile.am b/mobile/pdpushsrc/Makefile.am new file mode 100755 index 0000000..308a09c --- /dev/null +++ b/mobile/pdpushsrc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/pdpushsrc/src/Makefile.am b/mobile/pdpushsrc/src/Makefile.am new file mode 100755 index 0000000..090c2d1 --- /dev/null +++ b/mobile/pdpushsrc/src/Makefile.am @@ -0,0 +1,26 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstpdpushsrc.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstpdpushsrc_la_SOURCES = gstpdpushsrc.c + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgstpdpushsrc_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) +libgstpdpushsrc_la_LIBADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) +libgstpdpushsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +# headers we need but don't want installed +noinst_HEADERS = gstpdpushsrc.h diff --git a/mobile/pdpushsrc/src/gstpdpushsrc.c b/mobile/pdpushsrc/src/gstpdpushsrc.c new file mode 100644 index 0000000..fb56643 --- /dev/null +++ b/mobile/pdpushsrc/src/gstpdpushsrc.c @@ -0,0 +1,830 @@ +/* + * pdpushsrc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Seungbae Shin + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include "gstpdpushsrc.h" +#include +#include +#include +#ifdef G_OS_WIN32 +#include /* lseek, open, close, read */ +/* On win32, stat* default to 32 bit; we need the 64-bit + * variants, so explicitly define it that way. */ +#define stat __stat64 +#define fstat _fstat64 +#undef lseek +#define lseek _lseeki64 +#undef off_t +#define off_t guint64 +/* Prevent stat.h from defining the stat* functions as + * _stat*, since we're explicitly overriding that */ +#undef _INC_STAT_INL +#endif +#include +#include + +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +/* FIXME we should be using glib for this */ +#ifndef S_ISREG +#define S_ISREG(mode) ((mode)&_S_IFREG) +#endif +#ifndef S_ISDIR +#define S_ISDIR(mode) ((mode)&_S_IFDIR) +#endif +#ifndef S_ISSOCK +#define S_ISSOCK(x) (0) +#endif +#ifndef O_BINARY +#define O_BINARY (0) +#endif + +static int +file_open (const gchar * filename, int flags, int mode) +{ + return open (filename, flags, mode); +} + +GST_DEBUG_CATEGORY_STATIC (gst_pd_pushsrc_debug); +#define GST_CAT_DEFAULT gst_pd_pushsrc_debug + +/* FileSrc signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +#define DEFAULT_BLOCKSIZE 4*1024 + +enum +{ + ARG_0, + ARG_LOCATION, + ARG_EOS, +}; + +static void gst_pd_pushsrc_finalize (GObject * object); + +static void gst_pd_pushsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_pd_pushsrc_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); + +static gboolean gst_pd_pushsrc_start (GstBaseSrc * basesrc); +static gboolean gst_pd_pushsrc_stop (GstBaseSrc * basesrc); + +static gboolean gst_pd_pushsrc_is_seekable (GstBaseSrc * src); +static gboolean gst_pd_pushsrc_get_size (GstBaseSrc * src, guint64 * size); +static gboolean gst_pd_pushsrc_query (GstBaseSrc * src, GstQuery * query); +static void gst_pd_pushsrc_uri_handler_init (gpointer g_iface, gpointer iface_data); +static GstFlowReturn gst_pd_pushsrc_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer); +static gboolean gst_pd_pushsrc_checkgetrange (GstPad * pad); + +static void +_do_init (GType pd_pushsrc_type) +{ + static const GInterfaceInfo urihandler_info = { + gst_pd_pushsrc_uri_handler_init, + NULL, + NULL + }; + + g_type_add_interface_static (pd_pushsrc_type, GST_TYPE_URI_HANDLER, &urihandler_info); + GST_DEBUG_CATEGORY_INIT (gst_pd_pushsrc_debug, "pdpushsrc", 0, "PD push source element"); +} + +GST_BOILERPLATE_FULL (GstPDPushSrc, gst_pd_pushsrc, GstBaseSrc, GST_TYPE_BASE_SRC, _do_init); + +static void +gst_pd_pushsrc_base_init (gpointer g_class) +{ + GST_LOG ("IN"); + + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (gstelement_class, + "PD push source", + "Source/File", + "Read from arbitrary point in a file", + "Naveen Ch "); + gst_element_class_add_pad_template (gstelement_class, gst_static_pad_template_get (&srctemplate)); + + GST_LOG ("OUT"); +} + +static void +gst_pd_pushsrc_class_init (GstPDPushSrcClass * klass) +{ + GST_LOG ("IN"); + + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstbasesrc_class = GST_BASE_SRC_CLASS (klass); + + gobject_class->set_property = gst_pd_pushsrc_set_property; + gobject_class->get_property = gst_pd_pushsrc_get_property; + gobject_class->finalize = gst_pd_pushsrc_finalize; + + g_object_class_install_property (gobject_class, ARG_LOCATION, + g_param_spec_string ("location", "File Location", + "Location of the file to read", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + GST_PARAM_MUTABLE_READY)); + + g_object_class_install_property (gobject_class, ARG_EOS, + g_param_spec_boolean ("eos", + "EOS recived on downloading pipeline", + "download of clip is over", + 0, + G_PARAM_READWRITE)); + + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_pd_pushsrc_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_pd_pushsrc_stop); + gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_pd_pushsrc_is_seekable); + gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_pd_pushsrc_get_size); + gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_pd_pushsrc_query); + gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_pd_pushsrc_create); + + if (sizeof (off_t) < 8) { + GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT "!", + sizeof (off_t)); + } + + GST_LOG ("OUT"); + +} + +static void +gst_pd_pushsrc_init (GstPDPushSrc * src, GstPDPushSrcClass * g_class) +{ + GST_LOG ("IN"); + GstBaseSrc *basesrc = GST_BASE_SRC (src); + + src->filename = NULL; + src->fd = 0; + src->uri = NULL; + src->is_regular = FALSE; + src->is_eos = FALSE; + + gst_pad_set_checkgetrange_function (basesrc->srcpad, GST_DEBUG_FUNCPTR (gst_pd_pushsrc_checkgetrange)); + + GST_LOG ("OUT"); +} + +static void +gst_pd_pushsrc_finalize (GObject * object) +{ + GST_LOG ("IN"); + + GstPDPushSrc *src; + + src = GST_PD_PUSHSRC (object); + + g_free (src->filename); + g_free (src->uri); + + G_OBJECT_CLASS (parent_class)->finalize (object); + + GST_LOG ("OUT"); +} + +static gboolean +gst_pd_pushsrc_set_location (GstPDPushSrc * src, const gchar * location) +{ + GST_LOG ("IN"); + + GstState state; + + /* the element must be stopped in order to do this */ + GST_OBJECT_LOCK (src); + state = GST_STATE (src); + if (state != GST_STATE_READY && state != GST_STATE_NULL) + goto wrong_state; + GST_OBJECT_UNLOCK (src); + + g_free (src->filename); + g_free (src->uri); + + /* clear the filename if we get a NULL (is that possible?) */ + if (location == NULL) { + src->filename = NULL; + src->uri = NULL; + } else { + /* we store the filename as received by the application. On Windows this + * should be UTF8 */ + src->filename = g_strdup (location); + src->uri = gst_filename_to_uri (location, NULL); + GST_INFO ("filename : %s", src->filename); + GST_INFO ("uri : %s", src->uri); + } + g_object_notify (G_OBJECT (src), "location"); + gst_uri_handler_new_uri (GST_URI_HANDLER (src), src->uri); + + GST_LOG ("OUT"); + + return TRUE; + + /* ERROR */ +wrong_state: + { + g_warning ("Changing the `location' property on filesrc when a file is " + "open is not supported."); + GST_OBJECT_UNLOCK (src); + GST_LOG ("OUT :: wrong_state"); + return FALSE; + } +} + +static void +gst_pd_pushsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GST_LOG ("IN"); + + GstPDPushSrc *src; + + g_return_if_fail (GST_IS_PD_PUSHSRC (object)); + + src = GST_PD_PUSHSRC (object); + + switch (prop_id) { + case ARG_LOCATION: + gst_pd_pushsrc_set_location (src, g_value_get_string (value)); + break; + case ARG_EOS: + src->is_eos = g_value_get_boolean (value); + g_print ("\n\n\nis_eos is becoming %d\n\n\n", src->is_eos); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_LOG ("OUT"); +} + +static void +gst_pd_pushsrc_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GST_LOG ("IN"); + GstPDPushSrc *src; + + g_return_if_fail (GST_IS_PD_PUSHSRC (object)); + + src = GST_PD_PUSHSRC (object); + + switch (prop_id) { + case ARG_LOCATION: + g_value_set_string (value, src->filename); + break; + case ARG_EOS: + g_value_set_boolean (value, src->is_eos); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + GST_LOG ("OUT"); +} + +static GstFlowReturn +gst_pd_pushsrc_create_read (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer) +{ + GST_LOG ("IN"); + + int ret; + GstBuffer *buf = NULL; + struct stat stat_results; + GstPDPushSrc *src; + + src = GST_PD_PUSHSRC_CAST (basesrc); + + GST_LOG_OBJECT (src, "read position = %"G_GUINT64_FORMAT ", offset = %"G_GUINT64_FORMAT", length = %d", + src->read_position, offset, length); + + memset (&stat_results, 0, sizeof (stat_results)); + + if (fstat (src->fd, &stat_results) < 0) + goto could_not_stat; + + GST_LOG_OBJECT (src, "offset + length = %"G_GUINT64_FORMAT " and filesize = %"G_GUINT64_FORMAT, offset + length, stat_results.st_size); + + while ((offset + length) > stat_results.st_size) + { + fd_set fds; + int ret; + struct timeval timeout = {0,}; + guint64 avail_size = 0; + + if (src->is_eos) + goto eos; + + FD_ZERO (&fds); + FD_SET (src->fd, &fds); + + timeout.tv_sec = 0; + timeout.tv_usec = ((basesrc->blocksize * 8 * 1000) / 64000); // wait_time = (blocksize * 8) / (min downloadratei.e. 64Kbps) + + GST_DEBUG_OBJECT (src, "Going to wait for %ld msec", timeout.tv_usec); + + ret = select (src->fd + 1, &fds, NULL, NULL, &timeout); + if (-1 == ret) + { + GST_ERROR_OBJECT (src, "ERROR in select () : reason - %s...\n", strerror(errno)); + return GST_FLOW_ERROR; + } + else if (0 == ret) + { + GST_WARNING_OBJECT (src, "select () timeout happened..."); + } + else + { + memset (&stat_results, 0, sizeof (stat_results)); + + if (fstat (src->fd, &stat_results) < 0) + goto could_not_stat; + + avail_size = stat_results.st_size; + + GST_LOG_OBJECT (src, "Available data size in file = %"G_GUINT64_FORMAT, avail_size); + + if ((offset + length) > avail_size) + { + GST_LOG_OBJECT (src, "Enough data is NOT available..."); + } + else + { + GST_LOG_OBJECT (src, "Enough data is available..."); + } + } + } + + if (G_UNLIKELY (src->read_position != offset)) { + off_t res; + + res = lseek (src->fd, offset, SEEK_SET); + if (G_UNLIKELY (res < 0 || res != offset)) + goto seek_failed; + src->read_position = offset; + } + + buf = gst_buffer_try_new_and_alloc (length); + if (G_UNLIKELY (buf == NULL && length > 0)) { + GST_ERROR_OBJECT (src, "Failed to allocate %u bytes", length); + return GST_FLOW_ERROR; + } + + /* No need to read anything if length is 0 */ + if (length > 0) { + GST_LOG_OBJECT (src, "Reading %d bytes at offset 0x%" G_GINT64_MODIFIER "x", + length, offset); + ret = read (src->fd, GST_BUFFER_DATA (buf), length); + if (G_UNLIKELY (ret < 0)) + goto could_not_read; + + /* seekable regular files should have given us what we expected */ + if (G_UNLIKELY ((guint) ret < length && src->seekable)) + goto unexpected_eos; + + /* other files should eos if they read 0 and more was requested */ + if (G_UNLIKELY (ret == 0 && length > 0)) + goto eos; + + length = ret; + GST_BUFFER_SIZE (buf) = length; + GST_BUFFER_OFFSET (buf) = offset; + GST_BUFFER_OFFSET_END (buf) = offset + length; + + src->read_position += length; + } + + *buffer = buf; + GST_LOG ("OUT"); + + return GST_FLOW_OK; + + /* ERROR */ +seek_failed: + { + GST_ERROR_OBJECT (src, "Seek failed..."); + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + return GST_FLOW_ERROR; + } +could_not_stat: + { + GST_ERROR_OBJECT (src, "Could not stat"); + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + return GST_FLOW_ERROR; + } +could_not_read: + { + GST_ERROR_OBJECT (src, "Could not read..."); + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM); + if (buf) + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +unexpected_eos: + { + GST_ERROR_OBJECT (src, "Unexpected EOS occured..."); + GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), ("unexpected end of file.")); + if (buf) + gst_buffer_unref (buf); + return GST_FLOW_ERROR; + } +eos: + { + GST_ERROR_OBJECT (src, "non-regular file hits EOS"); + if (buf) + gst_buffer_unref (buf); + return GST_FLOW_UNEXPECTED; + } +} + +static GstFlowReturn +gst_pd_pushsrc_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer) +{ + GST_LOG ("IN"); + + GstPDPushSrc *pdsrc; + GstFlowReturn ret; + + pdsrc = GST_PD_PUSHSRC_CAST (basesrc); + ret = gst_pd_pushsrc_create_read (basesrc, offset, length, buffer); + GST_LOG ("OUT"); + + return ret; +} + +static gboolean +gst_pd_pushsrc_query (GstBaseSrc * basesrc, GstQuery * query) +{ + GST_LOG ("IN"); + + gboolean ret = FALSE; + GstPDPushSrc *src = GST_PD_PUSHSRC (basesrc); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_URI: + gst_query_set_uri (query, src->uri); + ret = TRUE; + break; + default: + ret = FALSE; + break; + } + + if (!ret) + ret = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); + GST_LOG ("OUT"); + + return ret; +} + +static gboolean +gst_pd_pushsrc_checkgetrange (GstPad * pad) +{ + GST_LOG ("IN"); + + GST_LOG ("OUT"); + + return FALSE; +} + +static gboolean +gst_pd_pushsrc_is_seekable (GstBaseSrc * basesrc) +{ + GST_LOG ("IN"); + + GstPDPushSrc *src = GST_PD_PUSHSRC (basesrc); + + GST_DEBUG_OBJECT (src, "seekable = %d", src->seekable); + GST_LOG ("OUT"); + + return src->seekable; + +} + +static gboolean +gst_pd_pushsrc_get_size (GstBaseSrc * basesrc, guint64 * size) +{ + GST_LOG ("IN"); + + struct stat stat_results; + GstPDPushSrc *src; + + src = GST_PD_PUSHSRC (basesrc); + + if (!src->seekable) { + /* If it isn't seekable, we won't know the length (but fstat will still + * succeed, and wrongly say our length is zero. */ + return FALSE; + } + + if (fstat (src->fd, &stat_results) < 0) + goto could_not_stat; + + //*size = stat_results.st_size; + /* Naveen : Intentionally, doing this because we dont know the file size...because its keep on increasing in PD case */ + *size = G_MAXUINT64; + + GST_DEBUG ("size of the file = %"G_GUINT64_FORMAT, *size); + + GST_LOG ("OUT"); + + return TRUE; + + /* ERROR */ +could_not_stat: + { + GST_ERROR_OBJECT (src, "Could not stat"); + return FALSE; + } +} + +/* open the file, necessary to go to READY state */ +static gboolean +gst_pd_pushsrc_start (GstBaseSrc * basesrc) +{ + GST_LOG ("IN"); + + GstPDPushSrc *src = GST_PD_PUSHSRC (basesrc); + struct stat stat_results; + + if (src->filename == NULL || src->filename[0] == '\0') + goto no_filename; + + GST_INFO_OBJECT (src, "opening file %s", src->filename); + + /* open the file */ + src->fd = file_open (src->filename, O_RDONLY | O_BINARY, 0); + + if (src->fd < 0) + goto open_failed; + + /* check if it is a regular file, otherwise bail out */ + if (fstat (src->fd, &stat_results) < 0) + goto no_stat; + + if (S_ISDIR (stat_results.st_mode)) + goto was_directory; + + if (S_ISSOCK (stat_results.st_mode)) + goto was_socket; + + src->read_position = 0; + + /* record if it's a regular (hence seekable and lengthable) file */ + if (S_ISREG (stat_results.st_mode)) + src->is_regular = TRUE; + + { + /* we need to check if the underlying file is seekable. */ + off_t res = lseek (src->fd, 0, SEEK_END); + + if (res < 0) { + GST_LOG_OBJECT (src, "disabling seeking, not in mmap mode and lseek " + "failed: %s", g_strerror (errno)); + src->seekable = FALSE; + } else { + src->seekable = TRUE; + } + lseek (src->fd, 0, SEEK_SET); + } + + /* We can only really do seeking on regular files - for other file types, we + * don't know their length, so seeking isn't useful/meaningful */ + src->seekable = src->seekable && src->is_regular; + GST_LOG ("OUT"); + + return TRUE; + + /* ERROR */ +no_filename: + { + GST_ERROR_OBJECT (src, "No file name specified for reading..."); + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, + ("No file name specified for reading."), (NULL)); + return FALSE; + } +open_failed: + { + switch (errno) { + case ENOENT: + GST_ERROR_OBJECT (src, "File could not be found"); + GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), + ("No such file \"\"")); + break; + default: + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + ("Could not open file for reading."), + GST_ERROR_SYSTEM); + break; + } + return FALSE; + } +no_stat: + { + GST_ERROR_OBJECT (src, "Could not get stat info..."); + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + ("Could not get info on \"\"."), (NULL)); + close (src->fd); + return FALSE; + } +was_directory: + { + GST_ERROR_OBJECT (src, "Is a Directory"); + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + ("\"\" is a directory."), (NULL)); + close (src->fd); + return FALSE; + } +was_socket: + { + GST_ERROR_OBJECT (src, "Is a Socket"); + GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, + ("File \"\" is a socket."), (NULL)); + close (src->fd); + return FALSE; + } +} + +/* unmap and close the file */ +static gboolean +gst_pd_pushsrc_stop (GstBaseSrc * basesrc) +{ + GST_LOG ("IN"); + + GstPDPushSrc *src = GST_PD_PUSHSRC (basesrc); + + /* close the file */ + close (src->fd); + + /* zero out a lot of our state */ + src->fd = 0; + src->is_regular = FALSE; + + GST_LOG ("OUT"); + + return TRUE; +} + +/*** GSTURIHANDLER INTERFACE *************************************************/ + +static GstURIType +gst_pd_pushsrc_uri_get_type (void) +{ + GST_LOG ("IN"); + GST_LOG ("OUT"); + + return GST_URI_SRC; +} + +static gchar ** +gst_pd_pushsrc_uri_get_protocols (void) +{ + GST_LOG ("IN"); + static gchar *protocols[] = { (char *) "file", NULL }; + GST_LOG ("OUT"); + + return protocols; +} + +static const gchar * +gst_pd_pushsrc_uri_get_uri (GstURIHandler * handler) +{ + GST_LOG ("IN"); + GstPDPushSrc *src = GST_PD_PUSHSRC (handler); + GST_LOG ("OUT"); + + return src->uri; +} + +static gboolean +gst_pd_pushsrc_uri_set_uri (GstURIHandler * handler, const gchar * uri) +{ + GST_LOG ("IN"); + + gchar *location, *hostname = NULL; + gboolean ret = FALSE; + GstPDPushSrc *src = GST_PD_PUSHSRC (handler); + GError *error = NULL; + + if (strcmp (uri, "file://") == 0) { + /* Special case for "file://" as this is used by some applications + * to test with gst_element_make_from_uri if there's an element + * that supports the URI protocol. */ + gst_pd_pushsrc_set_location (src, NULL); + return TRUE; + } + + location = g_filename_from_uri (uri, &hostname, &error); + + if (!location || error) { + if (error) { + GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc: %s", uri, + error->message); + g_error_free (error); + } else { + GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc", uri); + } + goto beach; + } + + if ((hostname) && (strcmp (hostname, "localhost"))) { + /* Only 'localhost' is permitted */ + GST_WARNING_OBJECT (src, "Invalid hostname '%s' for filesrc", hostname); + goto beach; + } +#ifdef G_OS_WIN32 + /* Unfortunately, g_filename_from_uri() doesn't handle some UNC paths + * correctly on windows, it leaves them with an extra backslash + * at the start if they're of the mozilla-style file://///host/path/file + * form. Correct this. + */ + if (location[0] == '\\' && location[1] == '\\' && location[2] == '\\') + g_memmove (location, location + 1, strlen (location + 1) + 1); +#endif + + ret = gst_pd_pushsrc_set_location (src, location); + + GST_LOG ("OUT"); + +beach: + if (location) + g_free (location); + if (hostname) + g_free (hostname); + + return ret; +} + +static void +gst_pd_pushsrc_uri_handler_init (gpointer g_iface, gpointer iface_data) +{ + GST_LOG ("IN"); + GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface; + + iface->get_type = gst_pd_pushsrc_uri_get_type; + iface->get_protocols = gst_pd_pushsrc_uri_get_protocols; + iface->get_uri = gst_pd_pushsrc_uri_get_uri; + iface->set_uri = gst_pd_pushsrc_uri_set_uri; + GST_LOG ("OUT"); +} + +static gboolean +gst_pd_pushsrc_plugin_init (GstPlugin *plugin) +{ + if (!gst_element_register (plugin, "pdpushsrc", GST_RANK_NONE, gst_pd_pushsrc_get_type())) + { + return FALSE; + } + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "pdpushsrc", + "PD push source", + gst_pd_pushsrc_plugin_init, + VERSION, + "LGPL", + "Samsung Electronics Co", + "http://www.samsung.com") + + diff --git a/mobile/pdpushsrc/src/gstpdpushsrc.h b/mobile/pdpushsrc/src/gstpdpushsrc.h new file mode 100755 index 0000000..651efdb --- /dev/null +++ b/mobile/pdpushsrc/src/gstpdpushsrc.h @@ -0,0 +1,73 @@ +/* + * pdpushsrc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Seungbae Shin + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_PD_PUSHSRC_H__ +#define __GST_PD_PUSHSRC_H__ + +#include +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_PD_PUSHSRC (gst_pd_pushsrc_get_type()) +#define GST_PD_PUSHSRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PD_PUSHSRC,GstPDPushSrc)) +#define GST_PD_PUSHSRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PD_PUSHSRC,GstPDPushSrcClass)) +#define GST_IS_PD_PUSHSRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PD_PUSHSRC)) +#define GST_IS_PD_PUSHSRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PD_PUSHSRC)) +#define GST_PD_PUSHSRC_CAST(obj) ((GstPDPushSrc*) obj) + +typedef struct _GstPDPushSrc GstPDPushSrc; +typedef struct _GstPDPushSrcClass GstPDPushSrcClass; + +/** + * GstFileSrc: + * + * Opaque #GstPDPushSrc structure. + */ +struct _GstPDPushSrc { + GstBaseSrc element; + GstPad *srcpad; + + gchar *filename; /* filename */ + gchar *uri; /* caching the URI */ + gint fd; /* open file descriptor */ + guint64 read_position; /* position of fd */ + + gboolean seekable; /* whether the file is seekable */ + gboolean is_regular; /* whether it's a (symlink to a) regular file */ + + gboolean is_eos; + +}; + +struct _GstPDPushSrcClass { + GstBaseSrcClass parent_class; +}; + +GType gst_pd_pushsrc_get_type (void); + +G_END_DECLS + +#endif /* __GST_FILE_SRC_H__ */ diff --git a/mobile/toggle/Makefile.am b/mobile/toggle/Makefile.am new file mode 100755 index 0000000..308a09c --- /dev/null +++ b/mobile/toggle/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/toggle/src/Makefile.am b/mobile/toggle/src/Makefile.am new file mode 100755 index 0000000..4d761d7 --- /dev/null +++ b/mobile/toggle/src/Makefile.am @@ -0,0 +1,30 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgsttoggle.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgsttoggle_la_SOURCES = gsttoggle.c + + + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgsttoggle_la_CFLAGS = $(GST_CFLAGS) +libgsttoggle_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +#libgsttoggle_la_LIBADD = $(GST_BASE_LIBS) +libgsttoggle_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +# headers we need but don't want installed +noinst_HEADERS = gsttoggle.h + diff --git a/mobile/toggle/src/gsttoggle.c b/mobile/toggle/src/gsttoggle.c new file mode 100755 index 0000000..1f8d831 --- /dev/null +++ b/mobile/toggle/src/gsttoggle.c @@ -0,0 +1,219 @@ +/* + * toggle + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "gsttoggle.h" +#include + +static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); + +GST_DEBUG_CATEGORY_STATIC (gst_mytoggle_debug); +#define GST_CAT_DEFAULT gst_mytoggle_debug + +enum +{ + LAST_SIGNAL +}; + + +#define DEFAULT_BLOCK_DATA FALSE + +enum +{ + PROP_0, + PROP_BLOCK_DATA + +}; + + +#define _do_init(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_mytoggle_debug, "toggle", 0, "toggle element"); + +GST_BOILERPLATE_FULL (GstMytoggle, gst_mytoggle, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM, _do_init); + +static void gst_mytoggle_finalize (GObject * object); +static void gst_mytoggle_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mytoggle_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_mytoggle_event (GstBaseTransform * trans, GstEvent * event); +static GstFlowReturn gst_mytoggle_transform_ip (GstBaseTransform * trans, + GstBuffer * buf); +static gboolean gst_mytoggle_start (GstBaseTransform * trans); +static gboolean gst_mytoggle_stop (GstBaseTransform * trans); + +static void +gst_mytoggle_base_init (gpointer g_class) +{ + GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (gstelement_class, + "toggle", + "Generic", + "Pass data without modification", "Rahul Mittal "); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&srctemplate)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sinktemplate)); +} + +static void +gst_mytoggle_finalize (GObject * object) +{ + GstMytoggle *mytoggle; + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +gst_mytoggle_class_init (GstMytoggleClass * klass) +{ + GObjectClass *gobject_class; + GstBaseTransformClass *gstbasetrans_class; + + gobject_class = G_OBJECT_CLASS (klass); + gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass); + + gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_mytoggle_set_property); + gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_mytoggle_get_property); + + g_object_class_install_property (gobject_class, + PROP_BLOCK_DATA, g_param_spec_boolean ("block_data", + "Data Block", + "Data Block", + DEFAULT_BLOCK_DATA, G_PARAM_READWRITE)); + + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_mytoggle_finalize); + + gstbasetrans_class->event = GST_DEBUG_FUNCPTR (gst_mytoggle_event); + gstbasetrans_class->transform_ip = + GST_DEBUG_FUNCPTR (gst_mytoggle_transform_ip); + gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_mytoggle_start); + gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_mytoggle_stop); +} + +static void +gst_mytoggle_init (GstMytoggle * mytoggle, GstMytoggleClass * g_class) +{ + gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (mytoggle), TRUE); + + mytoggle->block_data = DEFAULT_BLOCK_DATA; + +} + + +static gboolean +gst_mytoggle_event (GstBaseTransform * trans, GstEvent * event) +{ + return TRUE; +} + +static GstFlowReturn +gst_mytoggle_transform_ip (GstBaseTransform * trans, GstBuffer * buf) +{ + GstMytoggle *mytoggle = GST_MYTOGGLE (trans); + + if (mytoggle->block_data ==TRUE) + return GST_BASE_TRANSFORM_FLOW_DROPPED; + + return GST_FLOW_OK; +} + +static void +gst_mytoggle_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMytoggle *mytoggle; + + mytoggle = GST_MYTOGGLE (object); + + switch (prop_id) { + + case PROP_BLOCK_DATA: + mytoggle->block_data = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mytoggle_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMytoggle *mytoggle; + + mytoggle = GST_MYTOGGLE (object); + + switch (prop_id) { + case PROP_BLOCK_DATA: + g_value_set_boolean (value, mytoggle->block_data); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +gst_mytoggle_start (GstBaseTransform * trans) +{ + return TRUE; +} + +static gboolean +gst_mytoggle_stop (GstBaseTransform * trans) +{ + return TRUE; +} + + +static gboolean plugin_init(GstPlugin *plugin) +{ + + GST_DEBUG_CATEGORY_INIT (gst_mytoggle_debug, "toggle",0, "toggle"); + return gst_element_register (plugin, "toggle", GST_RANK_NONE, GST_TYPE_MYTOGGLE); +} +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "toggle", + "Base transform plugin template", + plugin_init, VERSION, "LGPL", "Samsung Electronics Co", "http://www.samsung.com/") + + diff --git a/mobile/toggle/src/gsttoggle.h b/mobile/toggle/src/gsttoggle.h new file mode 100755 index 0000000..0090a6b --- /dev/null +++ b/mobile/toggle/src/gsttoggle.h @@ -0,0 +1,61 @@ +/* + * toggle + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: JongHyuk Choi + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef __GST_MYTOGGLE_H__ +#define __GST_MYTOGGLE_H__ + + +#include +#include + +G_BEGIN_DECLS + + +#define GST_TYPE_MYTOGGLE \ + (gst_mytoggle_get_type()) +#define GST_MYTOGGLE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MYTOGGLE,GstMytoggle)) +#define GST_MYTOGGLE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MYTOGGLE,GstMytoggleClass)) +#define GST_IS_MYTOGGLE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MYTOGGLE)) +#define GST_IS_MYTOGGLE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MYTOGGLE)) + +typedef struct _GstMytoggle GstMytoggle; +typedef struct _GstMytoggleClass GstMytoggleClass; + +struct _GstMytoggle { + GstBaseTransform element; + gboolean block_data; +}; + +struct _GstMytoggleClass { + GstBaseTransformClass parent_class; +}; + +GType gst_mytoggle_get_type(void); + +G_END_DECLS + +#endif /* __GST_MYTOGGLE_H__ */ diff --git a/mobile/xvimagesrc/Makefile.am b/mobile/xvimagesrc/Makefile.am new file mode 100644 index 0000000..af437a6 --- /dev/null +++ b/mobile/xvimagesrc/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/mobile/xvimagesrc/src/Makefile.am b/mobile/xvimagesrc/src/Makefile.am new file mode 100644 index 0000000..7fb9ec7 --- /dev/null +++ b/mobile/xvimagesrc/src/Makefile.am @@ -0,0 +1,26 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstxvimagesrc.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstxvimagesrc_la_SOURCES = gstxvimagesrc.c + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgstxvimagesrc_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(TBM_CFLAGS) $(DRI2_CFLAGS) $(X11_CFLAGS) $(XEXT_CFLAGS) $(XV_CFLAGS) $(XDAMAGE_CFLAGS) $(DRM_DEVEL_CFLAGS) $(DRM_CFLAGS) +libgstxvimagesrc_la_LIBADD = $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(TBM_LIBS) $(DRI2_LIBS) $(X11_LIBS) $(XEXT_LIBS) $(XV_LIBS) $(XDAMAGE_LIBS) $(DRM_LIBS) $(DRM_DEVEL_LIBS) +libgstxvimagesrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +# headers we need but don't want installed +noinst_HEADERS = gstxvimagesrc.h diff --git a/mobile/xvimagesrc/src/gstxvimagesrc.c b/mobile/xvimagesrc/src/gstxvimagesrc.c new file mode 100644 index 0000000..21688bf --- /dev/null +++ b/mobile/xvimagesrc/src/gstxvimagesrc.c @@ -0,0 +1,1527 @@ +/* + * xvimagesrc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Hyunil Park + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +/** +* SECTION:element-xvimagesrc +* +* xvimagesrc captures frame buffer which includes the application data along with video layer data +* from the XServer and pushes the data to the downstream element. +* +* +* +* Example launch line +* |[ +* gst-launch xvimagesrc ! "video/x-raw-yuv, width=720, height=1280, framerate=(fraction)30/1, format=(fourcc)ST12" ! fakesink +* ]| captures the frame buffer from the XServer and send the buffers to a fakesink. +* +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstxvimagesrc.h" + +/* headers for drm */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +GST_DEBUG_CATEGORY_STATIC (xvimagesrc_debug); +#define GST_CAT_DEFAULT xvimagesrc_debug + + +#define GST_XV_IMAGE_SRC_CAPS \ + "video/x-raw-rgb, " \ + "bpp = (int) 32, " \ + "depth = (int) 24, " \ + "endianness = (int) BIG_ENDIAN, " \ + "red_mask = (int) 0xFF000000, " \ + "green_mask = (int) 0x00FF0000, " \ + "blue_mask = (int) 0x0000FF00, " \ + "width = (int) [ 16, 4096 ], " \ + "height = (int) [ 16, 4096 ], " \ + "framerate = (fraction) [0/1, 2147483647/1];" \ + "video/x-raw-yuv," \ + "format = (fourcc) { SN12, ST12 }, " \ + "width = (int) [ 1, 4096 ], " \ + "height = (int) [ 1, 4096 ], " \ + "framerate = (fraction) [0/1, 2147483647/1];" \ + +static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS(GST_XV_IMAGE_SRC_CAPS) +); + +enum +{ + PROP_0 +}; + +enum +{ + VIDEO_TYPE_VIDEO_WITH_UI, + VIDEO_TYPE_VIDEO_ONLY, +}; + +enum +{ + SIGNAL_VIDEO_WITH_UI = 0, + SIGNAL_VIDEO_ONLY, + SIGNAL_LAST +}; +#define GEM_NAME_MAX 10 + +#define SCMN_CS_YUV420 1 /* Y:U:V 4:2:0 */ +#define SCMN_CS_I420 SCMN_CS_YUV420 /* Y:U:V */ +#define SCMN_CS_NV12 6 +#define SCMN_CS_NV12_T64X32 11 /* 64x32 Tiled NV12 type */ +#define SCMN_CS_UYVY 100 +#define SCMN_CS_YUYV 101 +#define SCMN_CS_YUY2 SCMN_CS_YUYV + +/* max channel count *********************************************************/ +#define SCMN_IMGB_MAX_PLANE (4) + +/* image buffer definition *************************************************** + + +------------------------------------------+ --- + | | ^ + | a[], p[] | | + | +---------------------------+ --- | | + | | | ^ | | + | |<---------- w[] ---------->| | | | + | | | | | | + | | | | + | | | h[] | e[] + | | | | + | | | | | | + | | | | | | + | | | v | | + | +---------------------------+ --- | | + | | v + +------------------------------------------+ --- + + |<----------------- s[] ------------------>| +*/ + +typedef struct +{ + /* width of each image plane */ + int w[SCMN_IMGB_MAX_PLANE]; + /* height of each image plane */ + int h[SCMN_IMGB_MAX_PLANE]; + /* stride of each image plane */ + int s[SCMN_IMGB_MAX_PLANE]; + /* elevation of each image plane */ + int e[SCMN_IMGB_MAX_PLANE]; + /* user space address of each image plane */ + void *a[SCMN_IMGB_MAX_PLANE]; + /* physical address of each image plane, if needs */ + void *p[SCMN_IMGB_MAX_PLANE]; + /* color space type of image */ + int cs; + /* left postion, if needs */ + int x; + /* top position, if needs */ + int y; + /* to align memory */ + int __dummy2; + /* arbitrary data */ + int data[16]; + /* dmabuf fd */ + gint32 fd[SCMN_IMGB_MAX_PLANE]; + /* flag for buffer share */ + int buf_share_method; + /* Y plane size in case of ST12 */ + int y_size; + /* UV plane size in case of ST12 */ + int uv_size; + + /* Tizen buffer object of each image plane */ + void *bo[SCMN_IMGB_MAX_PLANE]; + + /* JPEG data */ + void *jpeg_data; + /* JPEG size */ + int jpeg_size; + + /* tzmem buffer */ + int tz_enable; +} SCMN_IMGB; + +typedef struct +{ + void *address[GEM_NAME_MAX]; + int buffer_size[GEM_NAME_MAX]; + int name[GEM_NAME_MAX]; + gint32 fd[GEM_NAME_MAX]; + gint32 handle[GEM_NAME_MAX]; +} GEM_MMAP; + +typedef enum { + BUF_SHARE_METHOD_PADDR = 0, + BUF_SHARE_METHOD_FD +} buf_share_method_t; + +typedef struct GstXvImageOutBuffer GstXvImageOutBuffer; + +struct GstXvImageOutBuffer { + GstBuffer buffer; + int fd_name; + int YBuf; + GstXVImageSrc * xvimagesrc; +}; + + + +#define DEFAULT_USER_AGENT "GStreamer xvimagesrc " + +static guint gst_xv_image_src_signals[SIGNAL_LAST] = { 0 }; + +#define BASE_TIME 33000 +#define LIMIT_TIME -33000 +//#define COUNT_FRAMES +#ifdef COUNT_FRAMES +gchar old_time[10] = {0, }; +#endif +static gboolean error_caught = FALSE; + +#define HANDLE_OUTBUF_UNREF + +#ifdef HANDLE_OUTBUF_UNREF +#define BUFFER_COND_WAIT_TIMEOUT 1000000 +#define GST_TYPE_GST_XV_IMAGE_OUT_BUFFER (gst_xv_image_out_buffer_get_type()) +#define GST_IS_GST_XV_IMAGE_OUT_BUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_GST_XV_IMAGE_OUT_BUFFER)) +static GstBufferClass *gst_xv_image_out_buffer_parent_class = NULL; +static void gst_xv_image_out_buffer_class_init(gpointer g_class, gpointer class_data); +static void gst_xv_image_out_buffer_finalize(GstXvImageOutBuffer *buffer); +static GstXvImageOutBuffer *gst_xv_image_out_buffer_new(GstXVImageSrc *src); +#endif +static GstStateChangeReturn gst_xv_image_src_change_state (GstElement * element, GstStateChange transition); +static void gst_xv_image_src_finalize (GObject * gobject); + +static void gst_xv_image_src_set_property (GObject *object, guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_xv_image_src_get_property (GObject *object, guint prop_id, GValue * value, GParamSpec * pspec); +static GstFlowReturn gst_xv_image_src_create (GstPushSrc * psrc, GstBuffer ** outbuf); +static gboolean gst_xv_image_src_start (GstBaseSrc * bsrc); +static gboolean gst_xv_image_src_stop (GstBaseSrc * bsrc); +static gboolean gst_xv_image_src_get_size (GstBaseSrc * bsrc, guint64 * size); +static gboolean gst_xv_image_src_is_seekable (GstBaseSrc * bsrc); +static gboolean gst_xv_image_src_query (GstBaseSrc * bsrc, GstQuery * query); +static gboolean gst_xv_image_src_unlock (GstBaseSrc * bsrc); +static gboolean gst_xv_image_src_unlock_stop (GstBaseSrc * bsrc); +static gboolean gst_xv_image_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps); + +static tbm_bufmgr bufmgr_get (Display *dpy, Pixmap pixmap); +static int port_get (GstXVImageSrc * src, unsigned int id); +static void pixmap_update (GstXVImageSrc * src,Display *dpy, tbm_bufmgr bufmgr, Pixmap pixmap, + int x, int y, int width, int height); +static Pixmap pixmap_create (GstXVImageSrc * src, Display *dpy, int width, int height); + +static void* gst_xv_image_src_update_thread (void * asrc); +static gboolean xvimagesrc_thread_start(GstXVImageSrc *src); +static void drm_init(GstXVImageSrc *src); +static void drm_finalize(GstXVImageSrc *src); +static gint32 drm_convert_gem_to_fd(int * gemname_cnt, int drm_fd, unsigned int name, void * data, void **virtual_address); +static void gst_xv_get_image_sleep(void *asrc, long duration); + +static void +_do_init (GType type) +{ + GST_DEBUG_CATEGORY_INIT (xvimagesrc_debug, "xvimagesrc", 0, "Xv image src"); +} + +GST_BOILERPLATE_FULL (GstXVImageSrc, gst_xv_image_src, GstPushSrc, GST_TYPE_PUSH_SRC, _do_init); + +#ifdef HANDLE_OUTBUF_UNREF +static void gst_xv_image_out_buffer_class_init(gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS(g_class); + gst_xv_image_out_buffer_parent_class = g_type_class_peek_parent(g_class); + mini_object_class->finalize = (GstMiniObjectFinalizeFunction)gst_xv_image_out_buffer_finalize; +} + +static GType gst_xv_image_out_buffer_get_type(void) +{ + static GType _gst_gst_xv_image_out_buffer_type; + + if (G_UNLIKELY(_gst_gst_xv_image_out_buffer_type == 0)) { + static const GTypeInfo gst_xv_image_out_buffer_info = { + sizeof (GstBufferClass), + NULL, + NULL, + gst_xv_image_out_buffer_class_init, + NULL, + NULL, + sizeof (GstXvImageOutBuffer), + 0, + NULL, + NULL + }; + _gst_gst_xv_image_out_buffer_type = g_type_register_static(GST_TYPE_BUFFER, + "GstOmxOutBuffer", + &gst_xv_image_out_buffer_info, 0); + } + return _gst_gst_xv_image_out_buffer_type; +} +#ifdef DEBUG_BUFFER + int value[5] ={0}; + static int value_count =0; +#endif + +static GstStateChangeReturn +gst_xv_image_src_change_state (GstElement * element, GstStateChange transition) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (element); + + GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE; + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + src->pause_cond_var = FALSE; + g_cond_signal(src->pause_cond); + break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + src->pause_cond_var = TRUE; + break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + src->thread_return = TRUE; + g_cond_signal(src->pause_cond); + g_cond_signal(src->queue_cond); + break; + case GST_STATE_CHANGE_READY_TO_NULL: + break; + default : + break; + } + result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + return result; +} + + +static void gst_xv_image_out_buffer_finalize(GstXvImageOutBuffer *buffer) +{ + Atom atom_retbuf = 0; + g_mutex_lock (buffer->xvimagesrc->dpy_lock); + atom_retbuf = XInternAtom (buffer->xvimagesrc->dpy, "_USER_WM_PORT_ATTRIBUTE_RETURN_BUFFER", False); + XvSetPortAttribute (buffer->xvimagesrc->dpy, buffer->xvimagesrc->p, atom_retbuf, buffer->YBuf); //data->YBuf is gemname, refer to drm_convert_gem_to_fd + g_mutex_unlock (buffer->xvimagesrc->dpy_lock); + g_cond_signal(buffer->xvimagesrc->buffer_cond); + GST_INFO(" xvimagesrc = %p, gem_name =%d, fd_name =%d", buffer->xvimagesrc, buffer->YBuf, buffer->fd_name); +#ifdef DEBUG_BUFFER + int i = 0; + for(i=0 ; i<5; i++){ + if (value[i] == buffer->YBuf) { + value[i]=0; + GST_ERROR("value[%d]=%d", i, value[i]); + } + } +#endif + return; +} + + +static GstXvImageOutBuffer *gst_xv_image_out_buffer_new(GstXVImageSrc *src) +{ + GstXvImageOutBuffer *newbuf = NULL; + GST_LOG("gst_omx_out_buffer_new"); + + newbuf = (GstXvImageOutBuffer *)gst_mini_object_new(GST_TYPE_GST_XV_IMAGE_OUT_BUFFER); + if(!newbuf) + { + GST_ERROR("gst_omx_out_buffer_new out of memory"); + return NULL; + } + GST_LOG("creating buffer : %p", newbuf); + newbuf->xvimagesrc = gst_object_ref(GST_OBJECT(src)); + newbuf->fd_name = 0; + newbuf->YBuf =0; + return newbuf; +} +#endif + +static void +gst_xv_image_src_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&srctemplate)); + gst_element_class_set_details_simple (element_class, "XServer Display FB video source", + "Source/video", + "Receive frame buffer data from XServer and passes to next element", + ""); +} + +static void +gst_xv_image_src_class_init (GstXVImageSrcClass * klass) +{ + GObjectClass *gobject_class; + GstBaseSrcClass *gstbasesrc_class; + GstPushSrcClass *gstpushsrc_class; + GstElementClass *gstelement_class; + gobject_class = G_OBJECT_CLASS (klass); + gstelement_class = (GstElementClass *) klass; + gstbasesrc_class = (GstBaseSrcClass *) klass; + gstpushsrc_class = (GstPushSrcClass *) klass; + gobject_class->set_property = gst_xv_image_src_set_property; + gobject_class->get_property = gst_xv_image_src_get_property; + gobject_class->finalize = gst_xv_image_src_finalize; + + gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_xv_image_src_start); + gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_xv_image_src_stop); + gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_xv_image_src_unlock); + gstbasesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_xv_image_src_unlock_stop); + gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_xv_image_src_get_size); + gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_xv_image_src_is_seekable); + gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_xv_image_src_query); + gstbasesrc_class->set_caps = GST_DEBUG_FUNCPTR (gst_xv_image_src_setcaps); + gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_xv_image_src_create); + gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_xv_image_src_change_state); + + gst_xv_image_src_signals[SIGNAL_VIDEO_WITH_UI] = + g_signal_new ("video-with-ui", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstXVImageSrcClass, video_with_ui), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + + gst_xv_image_src_signals[SIGNAL_VIDEO_ONLY] = + g_signal_new ("video-only", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GstXVImageSrcClass, video_only), NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + +} + +static gboolean gst_xv_image_src_get_frame_size(int fourcc, int width, int height, unsigned int *outsize) +{ + switch (fourcc) { +/* case GST_MAKE_FOURCC('I','4','2','0'): // V4L2_PIX_FMT_YUV420 + *outsize = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); + *outsize += 2 * ((GST_ROUND_UP_8 (width) / 2) * (GST_ROUND_UP_2 (height) / 2)); + break;*/ + case GST_MAKE_FOURCC('S','N','1','2'): // V4L2_PIX_FMT_NV12 non-linear + GST_INFO("SN12"); + case GST_MAKE_FOURCC('S','T','1','2'): // V4L2_PIX_FMT_NV12 tiled non-linear + GST_INFO("ST12"); + *outsize = GST_ROUND_UP_4 (width) * GST_ROUND_UP_2 (height); + *outsize += (GST_ROUND_UP_4 (width) * height) / 2; + break; + case GST_MAKE_FOURCC('R','G','B','4'): + /* jpeg size can't be calculated here. */ + *outsize = width * height * 4; + break; + default: + /* unkown format!! */ + *outsize = 0; + return FALSE; + } + return TRUE; +} + +static gboolean +gst_xv_image_src_parse_caps (const GstCaps * caps, guint32 *fourcc, + gint * width, gint * height, gint * rate_numerator, gint * rate_denominator, unsigned int *framesize) +{ + const GstStructure *structure; + GstPadLinkReturn ret = TRUE; + const GValue *framerate; + const char *media_type = NULL; + GST_DEBUG ("parsing caps"); + if (gst_caps_get_size (caps) < 1) return FALSE; + GST_INFO("xvimagesrc src caps:%"GST_PTR_FORMAT, caps); + structure = gst_caps_get_structure (caps, 0); + ret = gst_structure_get_int (structure, "width", width); + if(!ret) { + GST_ERROR ("xvimagesrc width not specified in caps"); + goto error; + } + ret = gst_structure_get_int (structure, "height", height); + if(!ret) { + GST_ERROR ("xvimagesrc height not specified in caps"); + goto error; + } + media_type = gst_structure_get_name (structure); + if(media_type == NULL) { + GST_ERROR ("xvimagesrc media type not specified in caps"); + goto error; + } + framerate = gst_structure_get_value (structure, "framerate"); + if (framerate) { + *rate_numerator = gst_value_get_fraction_numerator (framerate); + *rate_denominator = gst_value_get_fraction_denominator (framerate); + } else { + GST_ERROR ("xvimagesrc frametype not specified in caps"); + goto error; + } + if (g_strcmp0 (media_type, "video/x-raw-rgb") == 0) { + gst_xv_image_src_get_frame_size(FOURCC_RGB32, *width, *height, framesize); + *fourcc = FOURCC_RGB32; + GST_DEBUG ("Caps set to RGB32"); + } else if(g_strcmp0 (media_type, "video/x-raw-yuv") == 0) { + + GST_INFO ("media_type is video/x-raw-yuv"); + guint32 format = FOURCC_SN12; + ret = gst_structure_get_fourcc (structure, "format", &format); + if (!ret) GST_DEBUG ("xvimagesrc format not specified in caps, SN12 selected as default"); + ret = gst_xv_image_src_get_frame_size(format, *width, *height, framesize); + if(!ret) { + GST_ERROR ("xvimagesrc unsupported format type specified in caps"); + goto error; + } + *fourcc = format; + } + return TRUE; +/* ERRORS */ +error: + return FALSE; +} + +static gboolean gst_xv_image_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) +{ + gboolean res = TRUE; + gint width, height, rate_denominator, rate_numerator; + GstXVImageSrc *src; + src = GST_XV_IMAGE_SRC (bsrc); + res = gst_xv_image_src_parse_caps (caps, &src->format_id, &width, &height, + &rate_numerator, &rate_denominator, &src->framesize); + if (res) { + /* looks ok here */ + src->width = width; + src->height = height; + src->rate_numerator = rate_numerator; + src->rate_denominator = rate_denominator; + GST_DEBUG_OBJECT (src, "size %dx%d, %d/%d fps", + src->width, src->height, + src->rate_numerator, src->rate_denominator); + } + xvimagesrc_thread_start(src); + return res; +} +static void +gst_xv_image_src_reset (GstXVImageSrc * src) +{ +} + +static void +gst_xv_image_src_init (GstXVImageSrc * src, GstXVImageSrcClass * g_class) +{ + src->format_id = 0; + src->running_time = GST_CLOCK_TIME_NONE; + src->frame_duration = GST_CLOCK_TIME_NONE; + src->virtual = NULL; + src->bo = NULL; + src->dri2_buffers = NULL; + src->queue_lock = g_mutex_new (); + src->queue = g_queue_new (); + src->queue_cond = g_cond_new (); + src->cond_lock = g_mutex_new (); + src->buffer_cond = g_cond_new (); + src->buffer_cond_lock = g_mutex_new (); + src->pause_cond = g_cond_new (); + src->pause_cond_lock = g_mutex_new (); + src->dpy_lock = g_mutex_new (); + src->pause_cond_var = FALSE; + src->drm_fd = -1; + src->current_data_type = VIDEO_TYPE_VIDEO_WITH_UI; + src->new_data_type = VIDEO_TYPE_VIDEO_WITH_UI; + src->get_image_overtime = 0; + src->get_image_overtime_cnt = 0; + src->gemname_cnt = 0; + src->tz_enable = 0; + drm_init(src); + gst_base_src_set_live (GST_BASE_SRC (src), TRUE); +} + +static void +gst_xv_image_src_finalize (GObject * gobject) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (gobject); + GST_DEBUG_OBJECT (src, "finalize"); + g_mutex_free (src->queue_lock); + drm_finalize(src); + G_OBJECT_CLASS (parent_class)->finalize (gobject); +} +static void drm_init(GstXVImageSrc *src) +{ + Display *dpy; + int eventBase, errorBase; + int dri2Major, dri2Minor; + char *driverName, *deviceName; + struct drm_auth auth_arg = {0}; + + src->drm_fd = -1; + dpy = XOpenDisplay(0); + + /* DRI2 */ + if (!DRI2QueryExtension(dpy, &eventBase, &errorBase)) { + GST_ERROR("DRI2QueryExtension !!"); + return; + } + if (!DRI2QueryVersion(dpy, &dri2Major, &dri2Minor)) { + GST_ERROR("DRI2QueryVersion !!"); + return; + } + if (!DRI2Connect(dpy, RootWindow(dpy, DefaultScreen(dpy)), &driverName, &deviceName)) { + GST_ERROR("DRI2Connect !!"); + return; + } + GST_INFO("Open drm device : %s", deviceName); + + /* get the drm_fd though opening the deviceName */ + src->drm_fd = open(deviceName, O_RDWR); + if (src->drm_fd < 0) { + GST_ERROR("cannot open drm device (%s)", deviceName); + return; + } + + /* get magic from drm to authentication */ + if (ioctl(src->drm_fd, DRM_IOCTL_GET_MAGIC, &auth_arg)) { + GST_ERROR("cannot get drm auth magic"); + close(src->drm_fd); + src->drm_fd = -1; + return; + } + if (!DRI2Authenticate(dpy, RootWindow(dpy, DefaultScreen(dpy)), auth_arg.magic)) { + GST_ERROR("cannot get drm authentication from X"); + close(src->drm_fd); + src->drm_fd = -1; + return; + } +} +static void drm_finalize(GstXVImageSrc *src) +{ + if (src->drm_fd >= 0) { + close(src->drm_fd); + src->drm_fd = -1; + } +} +static gint32 drm_convert_gem_to_fd(int *gemname_cnt, int drm_fd, unsigned int name, void *data, void **virtual_address) +{ + g_return_val_if_fail((data != NULL),0); + int count=0; + gint32 fd = 0; + count = *gemname_cnt; + GST_DEBUG("gamname_cnt = %d", count); + GST_DEBUG("name = %u", name); + + + GEM_MMAP *xv_gem_mmap = NULL; + xv_gem_mmap = (GEM_MMAP *) data; + if(count >=GEM_NAME_MAX) + goto PASS; + + if (count < GEM_NAME_MAX ) { + int i =0; + for ( i =0 ; i < GEM_NAME_MAX ; i++) { + if (name == xv_gem_mmap->name[i]) + goto PASS; + } + + struct drm_prime_handle prime; + struct drm_gem_open gem_open; + struct drm_exynos_gem_mmap gem_mmap; //for virtual address + + memset (&gem_open, 0, sizeof (struct drm_gem_open)); + gem_open.name = name; + if (ioctl(drm_fd, DRM_IOCTL_GEM_OPEN, &gem_open)) { + GST_ERROR("Gem Open failed"); + return 0; + } + memset (&prime, 0, sizeof (struct drm_prime_handle)); + prime.handle = gem_open.handle; + prime.flags = DRM_CLOEXEC; + /*get gem_open handle*/ + xv_gem_mmap->handle[count] = gem_open.handle; + GST_DEBUG("gem_open.handle =%d, xv_gem_mmap->handle[count]=%d", gem_open.handle, xv_gem_mmap->handle[count]); + /*get virtual address */ + /*set name*/ + xv_gem_mmap->name[count] = name; + memset (&gem_mmap, 0, sizeof (struct drm_exynos_gem_mmap)); + gem_mmap.handle = prime.handle; + gem_mmap.size = gem_open.size; + /*set size*/ + xv_gem_mmap->buffer_size[count] = gem_mmap.size; + if (drmIoctl(drm_fd, DRM_IOCTL_EXYNOS_GEM_MMAP, &gem_mmap) !=0) { + GST_ERROR("Gem mmap failed [handle %d, size %d]", gem_mmap.handle, gem_mmap.size); + return 0; + } + /*set virtual address*/ + xv_gem_mmap->address[count] = (void *)(gem_mmap.mapped); + GST_DEBUG ("%d - Virtual address[%d] = %p size=%d ", name, count, xv_gem_mmap->address[count], xv_gem_mmap->buffer_size[count] ); + + /*get fd*/ + if (ioctl(drm_fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime) < 0) { + GST_ERROR("Gem Handle to Fd failed"); + return 0; + } + xv_gem_mmap->fd[count] = prime.fd; + GST_DEBUG("fd = %d", xv_gem_mmap->fd[count]); + } + + if (count < GEM_NAME_MAX) { + count ++; + *gemname_cnt = count; + } + +PASS: + + if (name == xv_gem_mmap->name[0]) { + *virtual_address = xv_gem_mmap->address[0]; + fd = xv_gem_mmap->fd[0]; + } else if (name == xv_gem_mmap->name[1]) { + *virtual_address = xv_gem_mmap->address[1]; + fd = xv_gem_mmap->fd[1]; + } else if (name == xv_gem_mmap->name[2]) { + *virtual_address = xv_gem_mmap->address[2]; + fd = xv_gem_mmap->fd[2]; + } else if ( name == xv_gem_mmap->name[3]) { + *virtual_address = xv_gem_mmap->address[3]; + fd = xv_gem_mmap->fd[3]; + } else if (name == xv_gem_mmap->name[4]) { + *virtual_address = xv_gem_mmap->address[4]; + fd = xv_gem_mmap->fd[4]; + } else if ( name == xv_gem_mmap->name[5]) { + *virtual_address = xv_gem_mmap->address[5]; + fd = xv_gem_mmap->fd[5]; + } else if (name == xv_gem_mmap->name[6]) { + *virtual_address = xv_gem_mmap->address[6]; + fd = xv_gem_mmap->fd[6]; + } else if (name == xv_gem_mmap->name[7]) { + *virtual_address = xv_gem_mmap->address[7]; + fd = xv_gem_mmap->fd[7]; + } else if ( name == xv_gem_mmap->name[8]) { + *virtual_address = xv_gem_mmap->address[8]; + fd = xv_gem_mmap->fd[8]; + } else if (name == xv_gem_mmap->name[9]) { + *virtual_address = xv_gem_mmap->address[9]; + fd = xv_gem_mmap->fd[9]; + } + + GST_DEBUG("virtual_address = %p fd = %d", *virtual_address, fd); + return fd; +} +static void +gst_xv_image_src_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (object); + GST_INFO ("set property function %x", src); + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } + return; +} + +static void +gst_xv_image_src_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (object); + GST_INFO ("get property function %x", src); + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static inline GstClockTime xvimagesrc_clock (GstXVImageSrc *src) +{ + struct timeval tv; + gettimeofday (&tv, NULL); + if(!src->base_time) { + src->base_time = GST_TIMEVAL_TO_TIME(tv); + } + return (GstClockTime)(GST_TIMEVAL_TO_TIME(tv) - src->base_time); +} + +static gboolean gst_xv_image_src_get_timeinfo(GstXVImageSrc *src, GstBuffer *buffer) +{ + int fps_nu = 0; + int fps_de = 0; + GstClockTime timestamp = GST_CLOCK_TIME_NONE; + GstClockTime duration = GST_CLOCK_TIME_NONE; + GstClock *clock; + if (!src || !buffer) { + GST_WARNING("Invalid pointer [handle:%p, buffer:%p]", src, buffer); + return FALSE; + } + clock = gst_element_get_clock (GST_ELEMENT (src)); + if (clock) { + timestamp = gst_clock_get_time (clock); + timestamp -= gst_element_get_base_time (GST_ELEMENT (src)); + gst_object_unref (clock); + } else { + /* not an error not to have a clock */ + timestamp = GST_CLOCK_TIME_NONE; + } + + //timestamp = xvimagesrc_clock(src); + /* if we have a framerate adjust timestamp for frame latency */ + if ((int)((float)src->rate_numerator / (float)src->rate_denominator) <= 0) { + /*if fps is zero, auto fps mode*/ + fps_nu = 0; + fps_de = 1; + } else { + fps_nu = 1; + fps_de = (int)((float)src->rate_numerator / (float)src->rate_denominator); + } + if (fps_nu > 0 && fps_de > 0) { + GstClockTime latency; + latency = gst_util_uint64_scale_int(GST_SECOND, fps_nu, fps_de); + duration = latency; + } + GST_BUFFER_TIMESTAMP(buffer) = timestamp; + GST_BUFFER_DURATION(buffer) = duration; + return TRUE; +} +#ifdef COUNT_FRAMES +static int fps = 0; + +static gchar *get_current_system_time() +{ + gchar target[10]={0,}; + time_t t; + struct tm tm; + + t = time(NULL); + tzset(); + /*localtimer_r : available since libc 5.2.5*/ + if(localtime_r(&t, &tm) == NULL) { + return NULL; + } + snprintf(target, sizeof(target), "%02i:%02i:%02i", tm.tm_hour, tm.tm_min, tm.tm_sec); + return g_strdup(target); +} +#endif +static void gst_xv_get_image_sleep(void *asrc, long duration) +{ + GST_INFO("end_time duration=%d", duration); + if (duration < 0) return; + GstXVImageSrc *src = (GstXVImageSrc *)asrc; + g_return_if_fail(src != NULL); + long sleep_time = 0; + sleep_time = (long)BASE_TIME - duration; + if (sleep_time < 0) { + src->get_image_overtime_cnt ++; + src->get_image_overtime += sleep_time; + if (src->get_image_overtime_cnt > 2) + src->get_image_overtime = 0; + if (src->get_image_overtime <= (long)LIMIT_TIME) + src->get_image_overtime = 0; + } else if (sleep_time > 0) { + src->get_image_overtime_cnt = 0; + sleep_time = sleep_time + src->get_image_overtime; + src->get_image_overtime = (sleep_time < 0) ? sleep_time : 0; + if (sleep_time >0) { + GST_INFO("end_time : sleep_time = %d", sleep_time); + usleep(sleep_time); + } + } +} +static GstFlowReturn +gst_xv_image_src_create (GstPushSrc * psrc, GstBuffer ** buffer) +{ + GST_INFO("gst_xv_image_src_create"); + GstXVImageSrc *src; + GstXvImageOutBuffer *outbuf = NULL; + src = GST_XV_IMAGE_SRC (psrc); + g_mutex_lock (src->queue_lock); + if(g_queue_is_empty (src->queue)) { + GST_INFO("g_queue_is_empty"); + g_mutex_unlock (src->queue_lock); + GST_INFO("g_cond_wait"); + g_cond_wait(src->queue_cond, src->cond_lock); + if(src->pause_cond_var) return GST_FLOW_WRONG_STATE; + g_mutex_lock (src->queue_lock); + outbuf = (GstXvImageOutBuffer *)g_queue_pop_head(src->queue); + GST_INFO("g_queue_pop_head"); + g_mutex_unlock (src->queue_lock); + } + else { + GstXvImageOutBuffer *tempbuf = NULL; + while((tempbuf = (GstXvImageOutBuffer*)g_queue_pop_head(src->queue)) != NULL) + { + outbuf = tempbuf; // To reduce latency, skipping the old frames and submitting only latest frames + g_mutex_unlock (src->queue_lock); + } + GST_INFO("g_queue_pop_head end"); + } + if(outbuf == NULL) return GST_FLOW_ERROR; + GST_INFO("gem_name=%d, fd_name=%d, Time stamp of the buffer is %"GST_TIME_FORMAT, outbuf->YBuf, outbuf->fd_name, GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(outbuf))); + *buffer = outbuf; +#ifdef COUNT_FRAMES + gchar *current_time = NULL; + current_time = get_current_system_time(); + if (strncmp(current_time, old_time, 10) == 0) { + fps ++; + strncpy(old_time, current_time, 10); + } else { + g_printf("xvimagesrc %s - fps : %d\n", old_time, fps); + fps = 1; + strncpy(old_time, current_time, 10); + } +#endif + GST_INFO("return ok"); + return GST_FLOW_OK; +} + +static gboolean xvimagesrc_thread_start(GstXVImageSrc *src) +{ + GError *error; + if(!src->updates_thread) src->updates_thread = g_thread_create ((GThreadFunc) gst_xv_image_src_update_thread, src, TRUE, &error); + else GST_LOG_OBJECT (src, "The thread function already running"); + return TRUE; +} + +static gboolean +gst_xv_image_src_start (GstBaseSrc * bsrc) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + if(src->format_id) xvimagesrc_thread_start(src); + return TRUE; +} + +gboolean signal_emit_func(void *asrc) +{ + GstXVImageSrc *src = (GstXVImageSrc *)asrc; + if (src->current_data_type == VIDEO_TYPE_VIDEO_ONLY) { + g_signal_emit (src, gst_xv_image_src_signals[SIGNAL_VIDEO_ONLY] , 0, NULL); + } else if (src->current_data_type == VIDEO_TYPE_VIDEO_WITH_UI) { + g_signal_emit (src, gst_xv_image_src_signals[SIGNAL_VIDEO_WITH_UI] , 0, NULL); + } + return FALSE; +} + +static int +gst_xvimagesrc_handle_xerror (Display * display, XErrorEvent * xevent) +{ + char error_msg[1024]; + + XGetErrorText (display, xevent->error_code, error_msg, 1024); + GST_DEBUG ("XError. error: %s", error_msg); + error_caught = TRUE; + return 0; +} + +//static gboolean first_frame=TRUE; +static void* gst_xv_image_src_update_thread (void * asrc) +{ + GstXVImageSrc *src = (GstXVImageSrc *)asrc; + Atom atom_data_type = 0; + Atom atom_secure = 0, atom_capture=0; + Atom atom_fps = 0; + g_return_val_if_fail((src != NULL),NULL); + + struct drm_gem_close gem_close; + int i=0; + GEM_MMAP *xv_gem_mmap = NULL; + xv_gem_mmap = (GEM_MMAP *)malloc(sizeof(GEM_MMAP)); + g_return_val_if_fail((xv_gem_mmap != NULL),NULL); + + memset(xv_gem_mmap, 0, sizeof(GEM_MMAP)); + + GST_LOG_OBJECT (src, "The thread function start"); + { + int damage_err_base = 0; + Atom atom_format = 0; + src->dpy = XOpenDisplay (NULL); + src->p = port_get (src, src->format_id); + if (src->p < 0) goto finish; + /*src->width and src->height is set by caps info */ + GST_DEBUG (" width and height of caps : %dx%d ", src->width, src->height); + if (src->width == 0 || src->height == 0) goto finish; + GST_DEBUG ("gst_xv_image_src_update_thread pixmap_create !!"); + src->pixmap = pixmap_create (src, src->dpy, src->width, src->height); + GST_DEBUG ("gst_xv_image_src_update_thread pixmap_create !!"); + src->gc = XCreateGC (src->dpy, src->pixmap, 0, 0); + GST_DEBUG ("gst_xv_image_src_update_thread XCreateGC !!"); + src->bufmgr = bufmgr_get (src->dpy, src->pixmap); + if (!src->bufmgr) goto finish; + GST_DEBUG ("gst_xv_image_src_update_thread bufmgr_get !!"); + if (!XDamageQueryExtension(src->dpy, &src->damage_base, &damage_err_base)) goto finish; + GST_DEBUG ("gst_xv_image_src_update_thread XDamageQueryExtension !!"); + src->damage = XDamageCreate (src->dpy, src->pixmap, XDamageReportNonEmpty); + atom_format = XInternAtom (src->dpy, "_USER_WM_PORT_ATTRIBUTE_FORMAT", False); + atom_capture = XInternAtom (src->dpy, "_USER_WM_PORT_ATTRIBUTE_CAPTURE", False); + atom_secure = XInternAtom (src->dpy, "_USER_WM_PORT_ATTRIBUTE_SECURE", False); + src->atom_stream_off = XInternAtom (src->dpy, "_USER_WM_PORT_ATTRIBUTE_STREAM_OFF", False); + XvSetPortAttribute (src->dpy, src->p, atom_format, src->format_id); + + /*get data type*/ + atom_data_type = XInternAtom (src->dpy, "_USER_WM_PORT_ATTRIBUTE_DATA_TYPE", False); + XvSelectPortNotify (src->dpy, src->p, 1); + XvGetPortAttribute (src->dpy, src->p, atom_data_type, &(src->new_data_type)); +#if 0 + /*set Xorg write-back hz*/ + atom_fps = XInternAtom (src->dpy, "_USER_WM_PORT_ATTRIBUTE_FPS", False); + GST_DEBUG("frame rate of caps %d", src->rate_numerator); + XvSetPortAttribute (src->dpy, src->p, atom_fps, src->rate_numerator); + GST_DEBUG ("gst_xv_image_src_update_thread XvSetPortAttribute !!"); +#endif + } + + struct timeval start_time, end_time; + long duration; + long starttime, endtime; + GTimeVal timeout; + XEvent ev; + int eventcount = 0; + void *virtual_address = NULL; + int (*handler) (Display *, XErrorEvent *); + GstXvImageOutBuffer *outbuf = NULL; + + while(!src->thread_return) { + if(src->pause_cond_var == TRUE) { + g_cond_wait(src->pause_cond,src->pause_cond_lock); + } + duration = 0; + starttime =0; + endtime = 0; + start_time.tv_sec = 0; + start_time.tv_usec = 0; + end_time.tv_sec = 0; + end_time.tv_usec = 0; + gettimeofday(&start_time, NULL); + + eventcount = 0; + virtual_address = NULL; + duration = 0; + outbuf = NULL; + g_mutex_lock (src->dpy_lock); + XSync(src->dpy, 0); + GST_INFO ("gst_xv_image_src_update_thread XSync@@ !!"); + g_mutex_unlock (src->dpy_lock); + error_caught = FALSE; + GST_DEBUG ("gst_xv_image_src_update_thread XSetErrorHandler in !!"); + handler = XSetErrorHandler (gst_xvimagesrc_handle_xerror); + GST_INFO ("gst_xv_image_src_update_thread XSetErrorHandler !!"); + GST_INFO ("gst_xv_image_src_update_thread XvPutStill in !!"); + g_mutex_lock (src->dpy_lock); + XvPutStill (src->dpy, src->p, src->pixmap, src->gc, 0, 0, src->width, src->height, 0, 0, src->width, src->height); + GST_INFO ("gst_xv_image_src_update_thread XvPutStill !!"); + XSync (src->dpy, 0); + g_mutex_unlock (src->dpy_lock); + if (error_caught) { + GST_ERROR("gst_xv_image_src_update_thread error_caught is TRUE, X is out of buffers"); + error_caught = FALSE; + XSetErrorHandler(handler); + g_get_current_time(&timeout); + g_time_val_add(&timeout, BUFFER_COND_WAIT_TIMEOUT); + if(!g_cond_timed_wait(src->buffer_cond, src->buffer_cond_lock, &timeout)) { + GST_ERROR("skip wating"); + } else { + GST_ERROR("Signal received"); + } + continue; + } + /*reset error handler*/ + error_caught = FALSE; + XSetErrorHandler(handler); + + GST_INFO ("gst_xv_image_src_update_thread XSync !!"); +next_event: + g_mutex_lock (src->dpy_lock); + GST_INFO("XNextEvent in"); + XNextEvent (src->dpy, &ev); /* wating for x event */ + GST_INFO("XNextEvent out"); + g_mutex_unlock (src->dpy_lock); + GST_INFO ("gst_xv_image_src_update_thread XNextEvent !!"); + if (ev.type == (src->damage_base + XDamageNotify)) { + XDamageNotifyEvent *damage_ev = (XDamageNotifyEvent *)&ev; + GST_INFO ("gst_xv_image_src_update_thread XDamageNotifyEvent"); + g_mutex_lock (src->dpy_lock); + if (damage_ev->drawable == src->pixmap) { + pixmap_update (src, src->dpy, src->bufmgr, src->pixmap, + damage_ev->area.x, + damage_ev->area.y, + damage_ev->area.width, + damage_ev->area.height); + GST_INFO("gst_xv_image_src_update_thread pixmap_update"); + } + XDamageSubtract (src->dpy, src->damage, None, None ); + g_mutex_unlock (src->dpy_lock); + GST_INFO ("gst_xv_image_src_update_thread XDamageSubtract"); + } + else if (ev.type == (src->evt_base + XvPortNotify)) { + XvPortNotifyEvent *notify_ev = (XvPortNotifyEvent*)&ev; + if (notify_ev->attribute == atom_secure) { + GST_WARNING ("secure attr changed : %s \n", ((int)notify_ev->value)?"Secure":"Normal"); + src->tz_enable = (int)notify_ev->value; + GST_ERROR("src->tz_enable = %d", src->tz_enable); + } + else if (notify_ev->attribute == atom_data_type) { + /* got a port notify, data_type */ + src->new_data_type = (int)notify_ev->value; + if (src->current_data_type != src->new_data_type) { + src->current_data_type = src->new_data_type; + GST_WARNING("current_data_type : %s \n", (src->current_data_type)?"Video":"UI+Video"); + g_timeout_add(1, signal_emit_func, src); + } + } + goto next_event; + } + + if(!src->virtual) continue; + if(src->format_id == FOURCC_RGB32) { + outbuf = gst_buffer_new_and_alloc (src->framesize); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (GST_BASE_SRC_PAD (src))); + memcpy(GST_BUFFER_DATA (outbuf), src->virtual, src->framesize); + } else if (src->format_id == FOURCC_SN12) { + XV_PUTSTILL_DATA_PTR data = (XV_PUTSTILL_DATA_PTR)src->virtual; + int error = XV_PUTSTILL_VALIDATE_DATA (data); + outbuf = gst_xv_image_out_buffer_new(src); + if(!outbuf) + { + GST_ERROR("Out of memory"); + continue; + } + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (GST_BASE_SRC_PAD (src))); + if (error == XV_HEADER_ERROR) + GST_ERROR ("XV_HEADER_ERROR\n"); + else if (error == XV_VERSION_MISMATCH) + GST_ERROR ("XV_VERSION_MISMATCH\n"); + else + { + SCMN_IMGB *psimgb = NULL; + psimgb = (SCMN_IMGB *)malloc(sizeof(SCMN_IMGB)); + if (psimgb == NULL) { + GST_ERROR_OBJECT(src, "failed to alloc SCMN_IMGB"); + return NULL; + } + memset(psimgb, 0x00, sizeof(SCMN_IMGB)); + if (data->BufType == XV_BUF_TYPE_LEGACY) { + psimgb->p[0] = (void *)data->YBuf; + psimgb->p[1] = (void *)data->CbBuf; + psimgb->buf_share_method = BUF_SHARE_METHOD_PADDR; + psimgb->a[0] = NULL; + psimgb->a[1] = NULL; + } else if (data->BufType == XV_BUF_TYPE_DMABUF) { + psimgb->fd[0] = drm_convert_gem_to_fd(&src->gemname_cnt, src->drm_fd, (void *)data->YBuf, xv_gem_mmap, &virtual_address); + if(!virtual_address) continue; + psimgb->a[0] = virtual_address; + GST_DEBUG("YBuf gem to fd[0]=%d virtual_address = %p", psimgb->fd[0], psimgb->a[0]); + psimgb->fd[1] = drm_convert_gem_to_fd(&src->gemname_cnt, src->drm_fd, (void *)data->CbBuf, xv_gem_mmap, &virtual_address); + if(!virtual_address) continue; + psimgb->a[1] = virtual_address; + GST_DEBUG("CbBuf gem to fd[1]=%d virtual_address = %p", psimgb->fd[1], psimgb->a[1]); + psimgb->buf_share_method = BUF_SHARE_METHOD_FD; + } + psimgb->w[0] = src->width; + psimgb->h[0] = src->height; + psimgb->cs = SCMN_CS_NV12; + psimgb->w[1] = src->width; + psimgb->h[1] = src->height >> 1; + psimgb->tz_enable = 0; + psimgb->s[0] = GST_ROUND_UP_16(psimgb->w[0]); + psimgb->e[0] = GST_ROUND_UP_16(psimgb->h[0]); + psimgb->s[1] = GST_ROUND_UP_16(psimgb->w[1]); + psimgb->e[1] = GST_ROUND_UP_16(psimgb->h[1]); + outbuf->fd_name = psimgb->fd[0]; + GST_BUFFER_MALLOCDATA(outbuf) = (unsigned char*)psimgb; + GST_BUFFER_DATA(outbuf) = src->virtual; + outbuf->YBuf = (void *)data->YBuf; + outbuf->fd_name = psimgb->fd[0]; +#ifdef DEBUG_BUFFER + for ( i=0; i<5 ; i++) { + if(value[value_count] == outbuf->YBuf ) { + GST_ERROR("ERROR: value[%d](%d)==YBUf(%d)", value_count, value[value_count], outbuf->YBuf); + } + } + value[value_count] = outbuf->YBuf ; + GST_ERROR("value[%d]=%d", value_count, value[value_count]); + if( value_count < 4){ + value_count ++; + } else { + value_count = 0; + } +#endif + } + } + if(!outbuf) continue; + GST_BUFFER_SIZE (outbuf) = src->framesize; + gst_xv_image_src_get_timeinfo(src,outbuf); + src->running_time = GST_BUFFER_TIMESTAMP(outbuf); + src->frame_duration = GST_BUFFER_DURATION(outbuf); + //first_frame = FALSE; + g_mutex_lock (src->queue_lock); + g_queue_push_tail(src->queue, outbuf); + GST_INFO("g_queue_push_tail"); + g_mutex_unlock (src->queue_lock); + g_cond_signal(src->queue_cond); + GST_INFO("g_cond_signal"); + + update_done: + if (src->virtual) tbm_bo_unmap(src->bo); + src->virtual = NULL; + GST_INFO("g_cond_signal"); + if (src->bo) tbm_bo_unref(src->bo); + src->bo = NULL; + if (src->dri2_buffers) free(src->dri2_buffers); + src->dri2_buffers = NULL; + gettimeofday(&end_time, NULL); + starttime = start_time.tv_usec; + endtime = end_time.tv_usec; + GST_INFO("star_time: %d, end_time:%d", starttime, endtime); + if (endtime > starttime) { + GST_INFO("end_time > start_time"); + duration = endtime - starttime; + } else { + GST_INFO("end_time.tv_usec < start_time.tv_usec"); + endtime=endtime+1000000; + GST_INFO("end_time =%d", endtime); + duration = endtime -starttime; + } + GST_INFO("end_time duration = %d", duration); + gst_xv_get_image_sleep (src, duration); + GST_INFO ("gst_xv_image_src_update_thread cleanup !!"); + } + for ( i=0 ; i < GEM_NAME_MAX ; i++) { + /*gem munmap*/ + if (xv_gem_mmap->address[i]) { + if (-1 == munmap(xv_gem_mmap->address[i],xv_gem_mmap->buffer_size[i])) { + GST_ERROR ("munmap failed"); + return NULL; + } + } + if (xv_gem_mmap->handle[i]) { + gem_close.handle = xv_gem_mmap->handle[i]; + if (ioctl(src->drm_fd, DRM_IOCTL_GEM_CLOSE, &gem_close)) { + GST_ERROR("Gem Close failed"); + } + } + if (xv_gem_mmap->fd[i]) { + close(xv_gem_mmap->fd[i]); + } + } + if (xv_gem_mmap) { + free(xv_gem_mmap); + xv_gem_mmap = NULL; + } + GST_LOG_OBJECT (src, "The thread function cleanup"); + if (src->atom_stream_off > 0) { + XvSetPortAttribute (src->dpy, src->p, src->atom_stream_off, 1); + src->atom_stream_off = 0; + } + if (src->bufmgr) { + tbm_bufmgr_deinit (src->bufmgr); + src->bufmgr = NULL; + } + if (src->p > 0) { + XvUngrabPort (src->dpy, src->p, 0); + src->p = 0; + } + if (src->gc) { + XFreeGC (src->dpy, src->gc); + src->gc = NULL; + } + if (src->pixmap > 0) { + XFreePixmap (src->dpy, src->pixmap); + src->pixmap = 0; + } + if (src->dpy) { + XCloseDisplay (src->dpy); + src->dpy = NULL; + } + GST_LOG_OBJECT (src, "The thread function stop"); + return NULL; +finish: + GST_LOG_OBJECT (src, "The thread function Error cleanup"); + if (src->atom_stream_off > 0) { + XvSetPortAttribute (src->dpy, src->p, src->atom_stream_off, 1); + src->atom_stream_off = 0; + } + if (src->bufmgr) tbm_bufmgr_deinit (src->bufmgr); + src->bufmgr = NULL; + if (src->p > 0) XvUngrabPort (src->dpy, src->p, 0); + src->p = 0; + if (src->gc) XFreeGC (src->dpy, src->gc); + src->gc = NULL; + if (src->pixmap > 0) XFreePixmap (src->dpy, src->pixmap); + src->pixmap = 0; + if (src->dpy) XCloseDisplay (src->dpy); + src->dpy = NULL; + GST_LOG_OBJECT (src, "The thread function Error stop"); + return NULL; +} + +static tbm_bufmgr bufmgr_get (Display *dpy, Pixmap pixmap) +{ + int screen; + int drm_fd; + tbm_bufmgr bufmgr; + int eventBase, errorBase; + int dri2Major, dri2Minor; + char *driverName, *deviceName; + drm_magic_t magic; + + screen = DefaultScreen(dpy); + if (!DRI2QueryExtension (dpy, &eventBase, &errorBase)) { + GST_ERROR ("!!Error : DRI2QueryExtension !!"); + return NULL; + } + if (!DRI2QueryVersion (dpy, &dri2Major, &dri2Minor)) { + GST_ERROR ("!!Error : DRI2QueryVersion !!"); + return NULL; + } + if (!DRI2Connect (dpy, RootWindow(dpy, screen), &driverName, &deviceName)) { + GST_ERROR ( "!!Error : DRI2Connect !!"); + if(driverName) Xfree(driverName); + if(deviceName) Xfree(deviceName); + return NULL; + } + if(driverName) Xfree(driverName); + GST_DEBUG("Open drm device : %s", deviceName); + // get the drm_fd though opening the deviceName + drm_fd = open (deviceName, O_RDWR); + if (drm_fd < 0) { + GST_ERROR ("!!Error : cannot open drm device (%s)", deviceName); + if(deviceName) Xfree(deviceName); + return NULL; + } + if(deviceName) Xfree(deviceName); + /* get the drm magic */ + drmGetMagic(drm_fd, &magic); + fprintf(stderr, ">>> drm magic=%d \n", magic); + if (!DRI2Authenticate(dpy, RootWindow(dpy, screen), magic)) + { + fprintf(stderr, "!!Error : DRI2Authenticate !!\n"); + close (drm_fd); + return NULL; + } + // drm slp buffer manager init + bufmgr = tbm_bufmgr_init (drm_fd); + if (!bufmgr) { + GST_ERROR ("!!Error : fail to init buffer manager "); + close (drm_fd); + return NULL; + } + DRI2CreateDrawable (dpy, pixmap); + return bufmgr; +} + +static int port_get (GstXVImageSrc * src, unsigned int id) +{ + unsigned int ver, rev, req_base, err_base; + unsigned int adaptors; + XvAdaptorInfo *ai = NULL; + XvAttribute *at = NULL; + XvImageFormatValues *fo = NULL; + int attributes, formats; + int i, j, p; + + if (XvQueryExtension (src->dpy, &ver, &rev, &req_base, &src->evt_base, &err_base) != Success) return -1; + if (XvQueryAdaptors (src->dpy, DefaultRootWindow (src->dpy), &adaptors, &ai) != Success) return -1; + if (!ai) return -1; + for (i = 0; i < adaptors; i++) { + int support_format = False; + if (!(ai[i].type & XvInputMask) || !(ai[i].type & XvStillMask)) continue; + GST_LOG ("==========================================="); + GST_LOG (" name: %s" + " first port: %ld" + " ports: %ld", + ai[i].name, + ai[i].base_id, + ai[i].num_ports); + p = ai[i].base_id; + GST_LOG (" attribute list:"); + at = XvQueryPortAttributes (src->dpy, p, &attributes); + for (j = 0; j < attributes; j++) GST_LOG ("\t- name: %s\n" + "\t\t flags: %s%s\n" + "\t\t min_value: %i\n" + "\t\t max_value: %i\n", + at[j].name, + (at[j].flags & XvGettable) ? " get" : "", + (at[j].flags & XvSettable) ? " set" : "", + at[j].min_value, at[j].max_value); + if (at) XFree (at); + GST_LOG (" image format list:"); + fo = XvListImageFormats (src->dpy, p, &formats); + for (j = 0; j < formats; j++) { + GST_LOG ("\t- 0x%x (%4.4s) %s", fo[j].id, (char *)&fo[j].id, (fo[j].format == XvPacked) ? "packed" : "planar"); + if (fo[j].id == (int)id) support_format = True; + } + if (fo) XFree (fo); + if (!support_format) continue; + for (; p < ai[i].base_id + ai[i].num_ports; p++) { + if (XvGrabPort (src->dpy, p, 0) == Success) { + GST_LOG ("========================================"); + GST_DEBUG ("XvGrabPort success : %d", p); + GST_LOG ("========================================"); + XvFreeAdaptorInfo (ai); + return p; + } + } + } + XvFreeAdaptorInfo (ai); + return -1; +} + +static void pixmap_update (GstXVImageSrc * src, Display *dpy, tbm_bufmgr bufmgr, Pixmap pixmap, + int x, int y, int width, int height) +{ + unsigned int attachments[1]; + int dri2_count, dri2_out_count; + int dri2_width, dri2_height, dri2_stride; + int opt; + tbm_bo_handle temp_virtual; + attachments[0] = DRI2BufferFrontLeft; + dri2_count = 1; + src->dri2_buffers = DRI2GetBuffers (dpy, pixmap, &dri2_width, &dri2_height, attachments, dri2_count, &dri2_out_count); + if (!src->dri2_buffers) { + GST_ERROR ("[Error] : fail to get buffers"); + goto update_done; + } + if (!src->dri2_buffers[0].name) { + GST_ERROR ("[Error] : a handle of the dri2 buffer is null "); + goto update_done; + } + src->bo = tbm_bo_import(bufmgr, src->dri2_buffers[0].name); + if (!src->bo) { + GST_ERROR ("[Error] : cannot import bo (key:%d)", src->dri2_buffers[0].name); + goto update_done; + } + dri2_stride = src->dri2_buffers[0].pitch; + opt = TBM_OPTION_READ|TBM_OPTION_WRITE; + temp_virtual = tbm_bo_map (src->bo, TBM_DEVICE_CPU, opt); + src->virtual = temp_virtual.ptr; + if (!src->virtual) { + GST_ERROR ("[Error] : fail to map "); + goto update_done; + } + return; +update_done: + if (src->virtual) tbm_bo_unmap(src->bo); + src->virtual = NULL; + if (src->bo) tbm_bo_unref(src->bo); + src->bo = NULL; + if (src->dri2_buffers) free(src->dri2_buffers); + src->dri2_buffers = NULL; + return; +} + +static Pixmap pixmap_create (GstXVImageSrc * src, Display *dpy, int width, int height) +{ + src->pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy), width, height, DefaultDepth(dpy, DefaultScreen(dpy))); + src->gc = XCreateGC (dpy, src->pixmap, 0, 0); + XSetForeground (dpy, src->gc, 0xFFFF0000); + XFillRectangle (dpy, src->pixmap, src->gc, 0, 0, width, height); + XSync(dpy, 0); + XFreeGC (dpy, src->gc); + return src->pixmap; +} + +static gboolean +gst_xv_image_src_stop (GstBaseSrc * bsrc) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + GST_DEBUG_OBJECT (src, "stop()"); + + if(src->updates_thread) { + src->thread_return = TRUE; + g_thread_join ( src->updates_thread); + src->updates_thread = NULL; + } + GST_DEBUG_OBJECT (src, "stop end "); + return TRUE; +} + +/* Interrupt a blocking request. */ +static gboolean +gst_xv_image_src_unlock (GstBaseSrc * bsrc) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + GST_DEBUG_OBJECT (src, "unlock()"); + g_cond_signal(src->queue_cond); + return TRUE; +} + +/* Interrupt interrupt. */ +static gboolean +gst_xv_image_src_unlock_stop (GstBaseSrc * bsrc) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + GST_DEBUG_OBJECT (src, "unlock_stop()"); + return TRUE; +} + +static gboolean +gst_xv_image_src_get_size (GstBaseSrc * bsrc, guint64 * size) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + GST_INFO ("Get size %x", src); + return FALSE; +} + +static gboolean +gst_xv_image_src_is_seekable (GstBaseSrc * bsrc) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + GST_INFO ("Is seekable %x", src); + return FALSE; +} + +static gboolean +gst_xv_image_src_query (GstBaseSrc * bsrc, GstQuery * query) +{ + GstXVImageSrc *src = GST_XV_IMAGE_SRC (bsrc); + gboolean ret; + GST_INFO ("src query %x", src); + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_URI: + ret = TRUE; + break; + default: + ret = FALSE; + break; + } + + if (!ret) + ret = GST_BASE_SRC_CLASS (parent_class)->query (bsrc, query); + + return ret; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (xvimagesrc_debug, "xvimagesrc", 0, "XServer display FB video capture Source"); + return gst_element_register (plugin, "xvimagesrc", GST_RANK_PRIMARY, GST_TYPE_XV_IMAGE_SRC); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "xvimage", + "XServer display video src", + plugin_init, VERSION, "LGPL", "Samsung Electronics Co", "http://www.samsung.com") diff --git a/mobile/xvimagesrc/src/gstxvimagesrc.h b/mobile/xvimagesrc/src/gstxvimagesrc.h new file mode 100644 index 0000000..37519e3 --- /dev/null +++ b/mobile/xvimagesrc/src/gstxvimagesrc.h @@ -0,0 +1,136 @@ +/* + * xvimagesrc + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Hyunil Park + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation; either version 2.1 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 Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifndef __GST_XV_IMAGE_SRC_H__ +#define __GST_XV_IMAGE_SRC_H__ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include //libdri2-dev, libdrm-dev +#include + +#include "xv_types.h" + +#define C(b,m) (((b) >> (m)) & 0xFF) +#define B(c,s) ((((unsigned int)(c)) & 0xff) << (s)) +#define FOURCC(a,b,c,d) (B(d,24) | B(c,16) | B(b,8) | B(a,0)) +#define FOURCC_RGB32 FOURCC('R','G','B','4') +#define FOURCC_I420 FOURCC('I','4','2','0') +#define FOURCC_SN12 FOURCC('S','N','1','2') +#define FOURCC_ST12 FOURCC('S','T','1','2') + +G_BEGIN_DECLS + +#define GST_TYPE_XV_IMAGE_SRC \ + (gst_xv_image_src_get_type()) +#define GST_XV_IMAGE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_XV_IMAGE_SRC,GstXVImageSrc)) +#define GST_XV_IMAGE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GST_TYPE_XV_IMAGE_SRC,GstXVImageSrcClass)) +#define GST_IS_XV_IMAGE_SRC(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_XV_IMAGE_SRC)) +#define GST_IS_XV_IMAGE_SRC_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_XV_IMAGE_SRC)) + +typedef struct _GstXVImageSrc GstXVImageSrc; +typedef struct _GstXVImageSrcClass GstXVImageSrcClass; + +struct _GstXVImageSrc { + GstPushSrc element; + Display *dpy; + int p; + Pixmap pixmap; + GC gc; + unsigned int width; + unsigned int height; + unsigned int framesize; + guint32 format_id; + Damage damage; + int damage_base; + unsigned int evt_base; + tbm_bufmgr bufmgr; + void *virtual; + tbm_bo bo; + DRI2Buffer* dri2_buffers; + guint64 running_time; + guint64 base_time; + guint64 frame_duration; + Atom atom_stream_off; + gint rate_numerator; + gint rate_denominator; + GThread *updates_thread; + gboolean thread_return; + GQueue *queue; + GMutex *queue_lock; + GCond *queue_cond; + GMutex *cond_lock; + GCond *buffer_cond; + gboolean pause_cond_var; + GCond *pause_cond; + GMutex *pause_cond_lock; + GMutex *buffer_cond_lock; + GMutex *dpy_lock; + gint drm_fd; + int current_data_type; + int new_data_type; + double get_image_overtime; + int get_image_overtime_cnt; + int gemname_cnt; + int tz_enable; + +}; + +struct _GstXVImageSrcClass { + GstPushSrcClass parent_class; + + /* signals */ + void (*video_with_ui) (void *data); + void (*video_only) (void *data); +}; + +GType gst_xv_image_src_get_type (void); + +G_END_DECLS + +#endif /* __GST_XV_IMAGE_SRC_H__ */ + diff --git a/mobile/xvimagesrc/src/xv_types.h b/mobile/xvimagesrc/src/xv_types.h new file mode 100755 index 0000000..afeb389 --- /dev/null +++ b/mobile/xvimagesrc/src/xv_types.h @@ -0,0 +1,134 @@ +/************************************************************************** + +xserver-xorg-video-exynos + +Copyright 2010 - 2011 Samsung Electronics co., Ltd. All Rights Reserved. + +Contact: Boram Park + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* */ +/* File name : xv_types.h */ +/* Author : Boram Park (boram1288.park@samsung.com) */ +/* Protocol Version : 1.0.1 (Dec 16th 2009) */ +/* This file is for describing Xv APIs' buffer encoding method. */ +/* */ + +#ifndef XV_TYPES_H_ +#define XV_TYPES_H_ + +G_BEGIN_DECLS + +#define XV_PUTIMAGE_HEADER 0xDEADCD01 +#define XV_PUTIMAGE_VERSION 0x00010001 + +#define XV_PUTSTILL_HEADER 0xDEADCD02 +#define XV_PUTSTILL_VERSION 0x00010001 + +/* Return Values */ +#define XV_OK 0 +#define XV_HEADER_ERROR -1 +#define XV_VERSION_MISMATCH -2 + +#define XV_BUF_TYPE_DMABUF 0 +#define XV_BUF_TYPE_LEGACY 1 + +/* Data structure for XvPutImage / XvShmPutImage */ +typedef struct +{ + unsigned int _header; /* for internal use only */ + unsigned int _version; /* for internal use only */ + + unsigned int YBuf; + unsigned int CbBuf; + unsigned int CrBuf; + + unsigned int BufType; +} XV_PUTIMAGE_DATA, * XV_PUTIMAGE_DATA_PTR; + +/* Data structure for XvPutImage / XvShmPutImage */ +typedef struct +{ + unsigned int _header; /* for internal use only */ + unsigned int _version; /* for internal use only */ + + unsigned int YBuf; + unsigned int CbBuf; + unsigned int CrBuf; + + unsigned int BufIndex; + unsigned int BufType; +} XV_PUTSTILL_DATA, * XV_PUTSTILL_DATA_PTR; + +static void +#ifdef __GNUC__ +__attribute__ ((unused)) +#endif +XV_PUTIMAGE_INIT_DATA (XV_PUTIMAGE_DATA_PTR data) +{ + data->_header = XV_PUTIMAGE_HEADER; + data->_version = XV_PUTIMAGE_VERSION; +} + + +static int +#ifdef __GNUC__ +__attribute__ ((unused)) +#endif +XV_PUTIMAGE_VALIDATE_DATA (XV_PUTIMAGE_DATA_PTR data) +{ + if (data->_header != XV_PUTIMAGE_HEADER) + return XV_HEADER_ERROR; + if (data->_version != XV_PUTIMAGE_VERSION) + return XV_VERSION_MISMATCH; + return XV_OK; +} + +static void +#ifdef __GNUC__ +__attribute__ ((unused)) +#endif +XV_PUTSTILL_INIT_DATA (XV_PUTSTILL_DATA_PTR data) +{ + data->_header = XV_PUTSTILL_HEADER; + data->_version = XV_PUTSTILL_VERSION; +} + + +static int +#ifdef __GNUC__ +__attribute__ ((unused)) +#endif +XV_PUTSTILL_VALIDATE_DATA (XV_PUTSTILL_DATA_PTR data) +{ + if (data->_header != XV_PUTSTILL_HEADER) + return XV_HEADER_ERROR; + if (data->_version != XV_PUTSTILL_VERSION) + return XV_VERSION_MISMATCH; + return XV_OK; +} + +G_END_DECLS + +#endif diff --git a/packaging/gst-plugins-ext0.10-0.3.14.tar.gz b/packaging/gst-plugins-ext0.10-0.3.14.tar.gz new file mode 100755 index 0000000000000000000000000000000000000000..0d4415b1508d6225c2118a7591773f0eff484a02 GIT binary patch literal 4210688 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�k0c;00$t@qnH97yb=rbNyvv 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

T%+L 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� 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

$yRL; zUo75MJPykvr@)pa#?H9pkcOP=PrqW#39vp-Eah4##gO_8h+yx5Fz`gg0yA-m?}xK$ zoohk~xtca6Gt`L;xz4&O4Rbezx*CoP*g}!`0H;DG`iW>%D&v;}whH!?=BOod0Ao`) zAbF$?XrWgseO#|y?>v_E?;}fV>P3EKc})xwJ3Z+7Fp0lLx4Mdtiw*P5q;KH)

G5 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

ZaGIdf6Pw$Sm}Q;Xt;wHV&bQi|ZymkC@M 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

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

>GHAPyoV&ebhMPbjBxCxCOmjZ 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%0Aba_IuzR$>URjvBgO5yj8EY|t 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

Jva7zz7d&O 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

jfZ>4e22Oh=J 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

-@e*o!CsUX^S&Iz`TUE zP_T@F6^;OsBImPpTD`T~Fe+W<>!V)n1ajw7AR()YYz5P^$R^u?U`n4_)?9zFy}h}< zSAD*=v$+eRJDg`vOPF=Lps z0r*8RphM?2wAU02DAlO0D&r}`s1+8ix&4_+k&vA#tZ`=F$X??Nu*j5 zVVt~imp0@4hLQyWhWxaC)Lt`t817&QD71KP*N|C}DK(gKi3>)9_o!Y&+<6#_HZf11 zSdr_Bfe!bXXIYIu3fBd+Sao%RS!1g94;H-gH{)i0^?_l{V3a3-0T851n;uA>#ogvB z`TPR@v0ckg3-63xYahDEz5qu-*sdWlMH@Lfx(5hfDaR+eWTOs%1p-27MN^$_l_lct zDh1B1U?=tr@6djiIh*a#gTyQkx4`8ARx9P*jM`{ z#BZd@GI5WLg3iYfV_A{|oo$}e%@K6>r}cTPmfG{`jbom)IX_pL!UsIA%C)H}VlTZ{ ztL=vHYOhAuXW*G#WK&vS$IJEgoc^#rYBQRy5=B&NAPFX{(5eQ&oOl=e%>!U6=Fn)3 z*X(GyUJo8K6{a$7e1Q^wJ^4<$cJHkNsSYD7x1l9A%I!w*7}|D_Z_HcX`d?+}G6+ZH zP3(%ugT^#?b%yulJgPjQZd{tUQcnE0?T#rSN zobjkt7vASN$xQsBT0dz}TalmfEyLUjLsK2k#Ik{O&3(ividjGq(&{t&O9~1@a$9Dd z@nYO*4SUcJ``Y51;;3(j;sVjK@D2!N{_#jqRN$wQO|n<)Z(sBBxIs=-V;kh{z(Uuu z=%{>CiDpp{U1ut>Qrat&#Qqe=rgDyE?lf{wm64y+a&e_t8ge1`uB+&c_D86qVp61) z9aTU(WzH#Kx za&cvo!@@vq7e7H--lOJud7pd?l4w>VIfN4q+o;Tz;CTa*fQG`Q%|ayT5Cw7)z$CRn zO(lHbrv*Viu#Wx21`wOWh64|4$jGt(;?fQvtnr8y)ySJaDUg5veHBvo=8LCh>F?hx zPfZmH1@p5Sp*~V_=506i9E+nVQrfivqRD@2ala90y4hdvuo|1KA0C~)Lc!{8h zN^&#?lNWpMX1#mVY5fLSn4{PO(bRJYeQgpI;2R?u7OZcL)`Bc13UfacX$3+*vK<{m ze3e7Grq)&;GNHm{PZQgrM|_2}F{^7Ae*}Z?SF<5X73; z&{WP8*1#Z>grs&tlJId)qYvo+Ua0|)_q z$BXZH@f|OIWJSD3CSd3Z{_|hv#a2G%4)wwTQe2AsLn*}yLQZgj0^l|7YS!h5MJdc` zcjzrDX>3)x#Houft;A)bI$~BL1F7R4UU>vEORZB~!Zd0)`f;)7k#os{ZQ@0 zcI^oFAxtWqZbXnl8nSvsHYQ)$pnS2iQ{*Tm`Mb&ssf$51Ld?aSaI#y0`OO zv$yu_r!}M%vH=d}&D(c#JXh9mXZbQ76Ru>RuD#ygb7SL?1prp3%!Pw45Vr?cNBAD| z;zrR%&Ll(&A}###iQQ#y3rNw)BA<;az+FEAv2b!vRKy;c5;cKHV0Q31Xal}M98Z58 z3GLO)?&gNcFZ?pI(0FVXeldk_7a9n);2VRx=#-eY+4)z4sg(C!q&p!RD7rs2^J>SF zk%HtPywb#yNIia5EPInFv3|2R$%Kk==pM{zY8td)?WfJPJ+ry<5(Z(9_+$^Edf*Gr z&{Ov6k>G&Zo47;%DJHk$72;_O*mr;eG9;s}H#o)j$e&z_|jsrM| zTpS39(T-T=1Q!+E0dREC5ghy66_iulU4B@!O%b zI{=b+aSuAu)r0ee+@s(sPopNrM^3~q>*Ewvr z{Eq2mjfQ*ueoMdUZ4EDz#^{x=*wQ8E*97D^5^!Z+8F3KTRz3ry&H=+MS2fkPwTrxj zj6gJ*h?4jX?BoC*+&BtH14#N2fo>$YSsomtgB108^T}CW~CKx@#i%Dh!kR~KOmHnY1Vkod6XA8E;?0qz>Jwodyn&xTb zW0&|jcutCH=K$6aHQR`$;DVjlR^y9ms2s@x#C$@$>am}k5k(u3VnD=?I%bxew`Ptn zPH`QAfItWw!3`{6woxKPTZc?yh~*?*pm0X409ESP`N@40NxMXBkUObIB?a>5%E!g|rOIdX=o?WOg^Nm; z@_s(7WZwQ_-W41>sFWaY#~o`R)o+F>&195%lxHX@8yQ>28;9L~xU#&MsDmim6h0+B zhzq72_e-kphJ?`6Jt>C8)nL&YJzJF2VIesj#9Kh)eWT-*N6?*TN1>)+1ulIdMi6zh zbxD&aoEvc+gu7Y>=SV2JAog>G-G;$faR1NyK1u|FR~kD(kj3Ev#WMsiams8PyZ~Yj z;=)053%-Kka0AiaITkLIIp78QAnpwqX2q(@^|A#De|uXwijya=FGU(i2m$8|(TBfm zX(0*a;McO&;;^wv&0iP_BYe&1IPjbdf(qc~Bv~RBRubAKr*0ZYaOKKhhAsML90NF< zlz@VVS60kAJ?ps6lPm{_LhN<1ciomtQE}E0Qz*})&nK*x2+qSPqqp&FTpAu*WDGlX zCTLVf@odZgGxl;Dq&F&}=Pt1_lN9N@gB$Y6K(2#aI zmM1c6Cm28Q$l-LR5R?sueDUY@JVPyHytY%%7xjyXMK-#g8V{(A8tdZzwskI7!u(Fl z&$bw>@gPC@6H~R@J{Y9fxz$ex6xUj{)fJ~uR9m+PATDRI9JRH!xh`8a?n#BkxL&U3==Y+V^Jlfiw6E& zV}mbtS4;_<)&`uhZD^&Tu@cqt#X~?vLC<0so|ZmYefVCOhyKLB)8^^co1M)^jEzIf zo;c#&>O&-)#c-?=KmucCUg{;rGi_=OAO7&h*ZFI|2;kCW?66M%{<1-IBC#3f zGdROEi?x*u2n82;Zcz`KSWz4uTgW*4zv}yKtG>920Vb#+UhKN~gR)pMe}t4eI%7liiz6JN`0e!U{<1bLAN3|eqy$~a#qBXH z5807OW>z?~(IQ2gMAnP|bz)~t=1QdjiiYJQloPG6 z2mZyVq|wF60W;5VMmUgBNd(g{T_x^VSl_@~PH;kJ!{9C&*9dZ_U@K%vF@+Q)l>^1%sdBUcL9hyKU6pV4a0U()4BLn zBSy;;2MGeg!`ar|V2_D)ZYz((uGN*|0oM2BnnnTEJ9v(Vu)V*`mwwc)5U$f-AiXwe zqJ$2f&q7@Wr{fOCZj-(3TY=dvZ4hE4-`n1m@PROL1=`faqJZ|t&_)2k9g>V9l*gy1 zwZiHOW_oYheEYv)%TxC}S>x+b5EMcf7tPq;P$V|7wcp-nRM;4#jN^#M=6>m1u(f!I z$u0=4Ilf|m@>W~!G->#-#QV~ zX6_lc#wSsu8#VreY@org{zY437vB{PQ;SKe>Y}JII5Rtp1`QBCh~Ur&4t466i-sCv z{$LG9V5ERZY%bU^*73wmX9&I^BuR@?cyj8FckX9ui0U7^X%#yCE~!}I*G`DS|MUC} zClk3GH5OTIWLT&?5u_CYwSv#fEC`S2l|_D5KzX?{V?JwGew~h-L(D8)%jtav=zLfy z?7Z|V-~^#!!-zFmr&)Kx#Sn*A1g=HprWbFl`a zVSHKxeTSuvijI>;9TOYsAbXKCzIX9Quu8e=3E1~Y%ISt$gbZw54$>n8#Zk%lec>Q# z6pFap1V+85*MFq3r{$R&tS)O{bsn!QBK#uII2m$VB$xAtt5t|6>W`peqYuVuWFBtZ zO%afXg@YIn!|!x=5E{UQArShB>lZia;E**fK{mn4B&0b5=5|P2aXA8^Rh6n>*lvVC zD{$|nMbE%Bx0FtUCnHEt$R%M>2H`uo8CxLleWLi#@GhU29u0?UPBO9W8X_;#=L>O? z5gNX<#2tz7?RR>AACZyOLl8};pG2i$}?|?r+x6&{Ve%&Wg zxmQ3O_=;I)QKAQaVek)1-|^?rj!KY&jQ1W^e#Np{iB|=0LBs7Bo`z#^pnF)lZz!|z zN(SfcK_}LcJNZqoT~wy~!lMRob;QC8;|&v^Z7rRdv7&v-p+YZ(Dpc~$_4thNtD1mX8!G3fDj&YA{Bit>Q zb>laT791l0SQ3Az1b!^9`5${Ugusx;w6$sOvLSeRc>7`*C>;$DLYva$h{;GJVV|Q4 zDquvY7}1npzZ6{D;>l4I98W$=%Y!pf0_rdIbQx-n2H@DS5!>vZ!yQPDJ@JN}=weDAwSCeQtd3~oBs+ooK234*jr(xc=E?%_|R3$}S#56}d&k;DH z4}!H6?#p>K&*N!nYT94EimzbS+~b@6iKpg$WuPvLZyNm|cso2a868n_-id3=E4P)n z#B_=~AM#{q0966Wt=cVNA+^;%#9}EM%(7DiW$$d3?rfHvZ3cis*LB?JqA^|BAS@PE~2DJF;vP(rq8?UYoG`%>0QzS|^w8DXcCC_RydQcz>aHc7>r zOpfOaLSX&(2?4d>VDD`;@HMMS8ObNJp67f;kwN^mP*z!$c!rzLlGP}e@xROD3zZN@ zi5L)Jhev(ZHe#}mAtDEtm>Ysyk`9$C8Pb;aP{~bhzm_e8gd^pkQhi@d3Yn;}tB4`m z;1`fY!iKFdB5vl}8)AwK*H!yXB!i)+f^{iSNy#A#YbvE;KOO8hC@(s&evaL&xa}d0 zshuk=O<5&v;>w6V&g|4Rz_QKrCY(J&<4CnVRbAK@wLDdF<>bhuZD%hW5tWK-Odtw_ z2Pp6*1(_(1DT#A3t)o)A>y00VO?MGu;(_+Y=oNu6tIjg?;mBqSG0btn>08S5eR060 zVR6C{##*z=T3yp>RSwKUW}pdF^lZQ}g21s5c!CW&VSQyFF&jxZv7n_Gr9-@jCmO0u ze6De^3P?D{j%y-569R%2CSoXP#ArfvnTlxtz3nE!iVfu4{&JDQcH>^0ZxHlEx0s{++fL!=X?_68IKFV zc%DCosHVMgx`c4DDlsn<+ToZY`M`bl;pK1vSmW-PH~N?tL-SAIRq}8Z&K*LU6hSWc zDgiorycz3Rk}jC-UGi}C;SEk|VILt96Ng22j89_oo^Vl{{u@H;7jrdX$0-Kvw_e~E zI)Vj<)1jS_Z7q`tC(Du%r=DcFmZXb#_mbobxR@j#^p*pk*reQ&#nwmyJ(mu-Z2cHP z%FW>0GgIO%t4J)#1Dq_^?z63A#%;CD(?stGk%l|;Ztp_I*lI~|vS@*39!k0xNKyQV zCDb_X=*7uYP=Y=-FvH{ITt!Na976bPp}?ma?KgbRHeA_c5x#M0K&41P_gyU~HWhAB zfB>YE9CO6^)Rqf0zju5*2u3{$iPaMIj*tHtT}=N}eEhqmt7=+P1b(!KXu4oFAOCLo zCK}hUk2^k|l(6pj_#GejGGv;M!?&R!%CM-MgJB}oU(H4w&QX-2Ls|!Eq)c~dr!mXT z(21%Fhm-dR1%Y7rovxSi7;_!J`^LqH(d%KvBOgepmbfPE8$ZB#4lw~P-j z^t+5t>dV&vgE38g^MGP_x{WavycQv=?}>r!6;pA~L!xBzl}L{XKMjw4^wbD&<_c^6 z^V+NDThE{25J>aOd>n7W*=khwMNyQO&=Hk=F;Xc0Cl70d3wSlb)-kFbrs85l2-e^Q z=Jr}&eyn-iVstMvQ~{P22ON8O61)Q*;JN-?0UBOqc6N*a#J_c@b8526Rn>3r)J(xFq&?Jm3LUHhZ2qq%kvnpH`#P6zMW8v^Q^X@0#@5;J>()=PJ3@$ zAUM6fGO98r7kf>POnc4GJl}y{q;&wTWW)vNzyZ0%03^IqW!i;W+s*}ETBq_6&r zzuMz_tw%IQu>W?|#{Vu4I`83M&&>q=zyR@19Y)xnDTH8F2!}g|z3xdBX2ibA&`Yh1 z!2TA?;K~MLe1w8OY$hRecHBkRzF}M|df>rBqf>7Wuu8Ty=gtfYRKw1LUV%}|PHXjM z(E<)T()shM6F@w&wc{ka*Xvt4*jp3rZUj2}n|b|!ItY|t$o z4=SK1EM^lPz?FU_HyM%c$@XUTlY3fy`gUvMT@~Yz zj=XcZd!ML9gFuECY9kkm9mBc=+nWb&0wA>#4lB}5Y-2cEJD8(aEgj?GzW~EIZfJE! z#o{72fD&$`8-;5vAF#zi$ zjlf$N3NgmFK^u15OvHgC8U4HlK1V&ocBfA)kfOu*=MJfL;5sR~9oL9UZUNXGtp2z} zn~H%+hI4^dT2QjJTfd2-Z2?{QAGQ^#4=iOeBe#R>eni6=R-ADJ1MgDlLK%cH416pK z!jMU4zWr7}1fm+zE%~4c7i$%YxiZ+PUHmcD1e~YQGbi;kY>WlXHFy-9gv9;2K0rLG z4wnIb6$4~PQV%_iEF?v3{hb!$)O8R0=BJhf7Q!G1u24{tFmMp7A!d5HnkB*nIM(Y~ z)un2iVg1alktrODn&v;;l*jOhTkyleg5&=TkH8JZ4O@TsotZ6LfT$sQ*ppMuiUlj3 z>*#DZT+9wgN&$bb2;N&$i(&4$I_PPa~rx#IEg)>Z{k!t1pp#S0+7@$6G)Yg$b*d zD5V<+32MO&szd2)SUyq!B6G47DB1#A2{gM?hfvfP2Yf)V(Q1Uj0E$K7s71Skrirw} zwYJ|I5MoWS$h>I03s|CH_3YK=OOr20D$_ax=)p0#ToRcmyI!5T6O3RYZ&9!ux;W!fKP%KIQn(g2LkfrJ%gW^Q9A zI;0tH2s_tXZJ9#Fyj@&+2VoPD5h`Z6^mY;PDB_>+rxWWi>?6dH00*}tip=*YytL$c zX4R#o(s%bui>2j?xx9Zg`09th!Q~7mf^;LxXk=;9R(3$JdbRgWxB)I_H0DMx;TmL+ zehRMJ$zbK^5I65GA|_!|**));Y-j`P#4WJFwm=b|Pil-42Sk~km( zSreC48t=o78v_tarJRPYlCV=?4`JM?m}Y{a!as3>d@^yb2+j-QgxrdK1MgK36>xR@ zY66Jgm6jkAFrp%NJS6l262d6i8FWOn(Bdr-7wUTFHbmYaX<))Wn+(D;!sU1#VveSr zLHinVhxBf!vL~vf?=JNUI--w3oq_w%*ibD=(jtd`m!Jh_112n!j4VO{ITIJes0J3% zDaH`tln)sWR^t{!Ug(g9_iH`m`}FBql&aY6EdCj?VE_FfT_M-AVZ|*N<3p)EJjLn( zInCg-DzN~NR+Bj$K?rB;R~UV;veIsyDUdni$eoXi2=iyz;W%KfrW~vCRGrO0GCmz3 zTc~7)U8pU$&e0!|7hRMZwSMh)YnL`{BeO8Or;LaLh0fxt^$`*2)!M6nSGP9I5~^Rh zzD>AmW=?AV=`thkm0NhV`O_A2_L><4C~J}0Pu9xXD>Jk9s;UuPxh7uK@cYcGwdV}= z#HYW{;z~IQRBHSJxSHbq<+*sZxKLw6fZ{e=^*o=Y`R8l6v%QlK`O+hR&`>^!w}pf` zbAFB>X(Ji>BgfHjtiXTXQNxi5VN$T-)0FIjlFSDlwKVMsCC){$1A2Bk1^-f!z~xA99%_ zA8`Cf`BG8W#)aZT0<|KOhMM9V)sbLJqB?{0kuLhD%DJ#}Au{l=Z_guk(Zq@rXA3I! zppT#irvxsek7t)42BGmLH$L8JEWcgEqP994Xq;L&m;0z-%&8|?=_ud&t&Sein`$lc zUVuB_m(^SPHLcp+=Xv(r_GJ(K2#ZiZO&1&iE{>mR;@UWNqMn$4+SZ0yr3JCA!;=Q+ zP!g{**juvJVe9v)dlCV|t##%y3S7Awsu>?8gnUsnP%NFCK4!-2^HeF+ud`+UBB|B( z;T@VyC@=dMtax3^MvS1{&?C@E6M>21#!woHHJ%XI+F`GD#4xt}jeBIO zJjjtY zp07TAy3QwZSi)(|Pg6oGB1;i&voRW+pm@oE3LYf2HqIHss^C42laGlGdhZ#CUv2;# z@W+r*dVh&?_2oNB$>#BVij2wxg>=sE1Gktj7^36Gi=E=k%xCjgv$FWzs#!40rcyA= ztIJC(E9P6Xbbn=e>2H5qez>?#+j}Ldx|`f!6J(AdaB|W7FZ0!Tc#)+EN;aLR;VKB_ z?+H?J^Z6oU53T@;mf#l|nRb5c0PHykoW${%+X0jlx)7XJ66+~O5Oe! zR;Pjwkxv3)-yeoCzzn%U6XoV7l<<)^;a*^L;>M}g19toIXg+n1uMihneEam5(l2>{ zAmAXv%?6@=48daFt5jm;nnBDjhQPXqKSUXX-Xn2`(*#BC80hi@>o2yAe8h_+arfc7)RXN{VNh;<%b z4!;nvZd^s-KmO!pHH=WQ;L0YsvN?TVIYka6?$VRVrRq`3hXR&-KI85Q(pNij$Rn5K zp|s;`#z*LcIHf*(AC1}%J<8B|a`;q-mT+f);}`{lth1a3Cxpr%7cEp~OR7_NypW}R z%xF=ELE*jq$P^x%&yOdpNRjSKE`ctMy{0N^Do;wcK0U5JG@#L&8de;5O`D#8WJx3e!XPnYcgno&na3D2rX0too{YiC!;}W5q~^7lO5O z|JZa1bW01nmrtwd(wRCIgdJLV@WaDob-VHRGIj6FIc>}@p?3|ol-0)HVZwphiQ3r6 z&T6<5?ZkpC=H&t+g-x&v3k$fo7n;`_eqxARI1-f)tqNdQQ**NP0bSBmCgp#^B^(we zsp<(!_Q~(qgMzx zNCaA*{4-7uT1W(HvI7Z1!MO+SJ!kpqz<1{ke0RW`obymVSI-VHZsv~S@vsZ{1n9!Q z=WgShn{ds!Mc#(qa{_{XNQ<0KbU-(r{>g_k9s6f@M48)q#u-X*k}!k9Z?rq6?`{hm z6jat)EbFj)a0u@frsZa_Hu~3!KdICnmH-Ko^f|Fexlg|sQ`JKeB0-rajiQgpy;?hY z_>x|MbctctncdC-sQ2Gsdk<&WIU2 zH+5yWyRgY-k4p{o;ZB7?&IfNk%vTD2xfS?AF%@(Sh6I8Hnu2UNALy5A^)s50T*w&v z3Y)6}Z0d!=pcnoaV_YJz70yn1QAAA` z!zLxHg~i=dZznZ6NR=v2I}KFRJxz0}U&@Uog?xv;EOH@_QSD_>luzQLhk{m**7BCT z`pY{vQSS0b`Mvwo+KcCpeuslv!AUJApQ?($53|-0UjxYit8Odjn@d6hr+drXLe?LP z4>vcVQ3M_G{I;KPErLN6E=6&3#_DzVyC9ngEv|35h1L6S7G2j;fRx}1iMC+JZt z^F?~@YUsqDSUGkbiGwO>U!Sx-Ye2)SO-qPTY9VwwoP;`my&lrmtb#m-K^vlrJ=+xI z3(_87>-Fup*kC%l>RM?}wI-u_B-@5aHFums34oDZ;%u;{X4#h@TZEZNRX+~@um!;d zEF^4Mq2{V=1|9ilFs>%#n5G3=@+Ihx{_ZmXSqigqo}s0BpvM^6_x_*>Gym|t-l<7S zNFH->bb(rKA7L&FfB+50;j!x<$sD9ep_Us|7hr%?t&Xb2TE79qnM>*$lFc2mV&|yE zl~ z6QQH5aq9fk(7D-I>JMB58# zJT`88Q4Gbw1c;0UKJ=rK?SiPuAP4|F`SP(y?a%!;Ljb`F>pVh&cH1*74P z#N9%C5@g@djUYBS8X>yzXruzLY(9{RMp%Lyz=1_z?U-6AY_4H9FbyEF^lA@%;oVG| zIcyz4!W+RsO6XfnvbZKMpKeI%jD6T9YpivRy3!z5a7*dc$AdN?A@sBH>XrC}uWYDm zIQRA7`t=n$bYTdL?qpUBmU&X(67dY+MuA>Q2f~E=TBwt$HBaRUnAfrH!(ctb+aZA2-F z?95v1N>(Lb0}r*Bp5-9s2tLk1M`BS~DgtQ$_Mlh1-MDp~N25JZrhpc|^_}?-8yg>! zy5Md69vsx=x;NV46F$}YJ{TCk!)Ej=VFMr~;C<-O^S51R4*(tX-f}^An|v@z?8oN; zVSWCU#gH>H>~Q2bSN=NQUgIwpGt;&#x)?Xh0SDsz1B;|D*+gOKmZ@VAH;mkX2$%z7 zg>{K^6ohsK{^+)LAP(nx0&pyu{e~Eq=L8evO&pvTs1eVz9Y$l^qV@m=AsQC95Wa`h zb1O5$M)?ONj5WS)fKA+LKpHu=mo!XI0J~Rw8Svzc;xXr(^cxr_-+LrCDP_ATZ{gH9 ze0$;a1+$T}WweKe0O@!v)%>T1L*ECUMnv>-@(+!N zMAf`Ia!z=n?rh1&&HMGcx0eyjF>ZldF^wiqRr?S{vgP~<+IlQ;xOjvSv)oaPTLKVJ zwwXyG1uCO?g74%E9Zt`^fY~LC)+~kn(k3cG;mx|YSYgGjDH&7B=iWcEMH%cy(uhOg z*b!_oLWw)1RD$yBc3+SSvA;>l9&QhGbkOZfvIg?Dfi?*GfpQy^aj^*pco->EKWWuz zaTY>>@+hrEoJ)dMDi^=XQ@f;?`R zwt0W!(bFHIr0bgCemuK^a4MkBv^ntJ(#q^CWPn-veI<+6W4a4I`~7CSN!d&mt~S55`Q*`)rzQ~t>CYl*B9V{b)+S6?>$)H-n@5C<BJIyCP%NO01By@{1-1SO~k&A{TfYX~8S% z4We#cSD?(Xtx6d2D^wijhFo&cz#8~BJW4?H<>-2!l7ByZ;j(ZlP|0q~I{KYxz5J5o z`$o&NCMG<;Ppc-?>+wwrqGReQI*Ujo?nAFpg3+v-H5&iXVhxT&@k+{&2?x%A0s~Ti z5NYnuq4Qd(ZHu{mKBH}*f0&zVWrWBm6L8e&{D-o0|55Vc)lU5ogyIT}vaNgsz{tWo z_k>4E*0@$XaGkP2VQN7)vbLSq#>JF6s~rhr4L;7K`Ek_v6dM7xp6x(pKZRPAEda8` z{~IKRNT|k>TDCu!7&POVfiIj(M;Vspto_nmE#Ijr7Z|fJj^I)le5Mq4&pYK=YCV0Sp^>WAbdoTcu20 z+R~aa%N02paB8N|6_*JlOglaisT3R)!ktC53aTcF4>QCl9??}ssRfDaFeR`KE6Q&q z&ehFc+vQ6ZE`V%{f1~bE7dkJh4G$4cN7)Hs0DH*0g)|S$n?Xev5+uPt)yIa7RWA-G z#y=6(wpBJ|U4gdR?Sj3jf@)Uq_YGVfn94ft0i$?eQ(5_iSKUn8TK_LqKj6O*Md#6me zN3v0!a*ua|wk}WFh)6>*<2b1Wb524~r?ti^Oro2MC$&giM^H*~B4wkkAq`PfR*XeZ z2a1;*#|;c0Vgr&dYPvfhJo)DO0o;ZJw~jxPyV*n6aW~NUWcoo^6#7v)tJXkkmpMXm zMc1EFDL@oF(!6zCO+<_DVZqyPd{izSWW_d4C3X7Fi(o;dvSb3;>Nt{7H>vm9^O^_) zk;|f;sAH(Vhas67g8Tncl)sXEOO!w%uWm{xG4QawCin{h#dRbu@wpT-$x65tv&b%t zhbJB1<#e462PaT~_mCKnY9AO8VUrTa1x<&}RWLhI*(-F(*r@*W=a*~qcs;)G5B<&g z*YoB2n_=K-j)rY+XH&B4F6`hOib}lx4w?$PSKILi&XpI%kM>?`2xTh+1%`*M)RJk%|*G;YGENX9P?V@55tyd5r&)vt(?*fIqOPV%)>CHP0Z&mmE?=9Dbv@`XR2IE zSe=NOwcvcYi^NBwp5uvKXM~2lINpnO6~{eUBOz*gJ~vrWe^5l<=DF101T%c{lpfo8 zT}j5o)@pnm2FQqm28E5tqKwS1Q&o)u5|M7Btbp0@5QEbTZ%JQkEZuDhCTkbokMe5_skV zQHK1ftFKE95KosMx+(`XBktIVkzXy{mBI=!N70oo(kIw#OnTz{a9TwBlk<%gSwW95 z52}3HJ3!7`=ZG9^jIhxM?{QK;gwjhB?VZ#0HQ+n|QBGePnGRKW32n3ZG1%yQy!*pW z2O(WI!axK`J3L_(Hd&~UPYp(gA5LIffXzd#eRQ<~F(j+t+3iV%)e3`11Z zJfb+21lKclcxTF3io^$fxC8#*!_6ZaUdQTO**UO)d0t1~AMeKlfqg7$d3Y7`efh z6YvkPLg*wMn&0cTp0uROXtKgHoC9WF>@KIvQ zX7Fa3GTXxe0Nq#wQ|n-ZTy?^i8K{s0Lb}=mCOIMt#9LV=D4VHs0!GMkz=f6gLjdIP z_~i7PFpZQUDf-al&P6fPr{Ta%%Afi^^WcjL=sK8xv6eXhpz}MIfgs0={I33NS(5Ci zcwJ--y0#s?txyt43txA&224Lo;{M%)v%1WL$g_IH>y=I?XurZCDZ*2BU-Z5&NB*(Y zS!K;&KD3CiliiBMZ#%VX$rGR!oI9#1%{RxgMbiB{P2olNTouGqQ#uojnQK0=I|iyI zdOdq#97P0SJU~%_VO|^|-I^0m9*3JZCZ30+-hxmSWzx??IE2t);}F2{J93H70yqXa z3&u8NH=+cdFy%;ecHTU99DM6aA=$t+WmPI5x8hAPocenLh^1(wa#_MADU=l~!vQMU zl;=x#Bt_(B0B+};qu7Gu2_q|Yd^&{ zgj1IuuTO~ZVl0*k3CJJM-_ny4aFQWANQZ!?aJ3*U7^o@Ghh{ORjGorZIb0b6UnUV* z4&ovRlTV!sWk#cok!JBkg{^c1+8uUJ??^f{e7GwKQ4qO39)Ka3$PT!pZH{q_=sxL` zsHlQYEl0P_`W*8D&cyBrhYN4ETB=r)aDJ@9(YshYS<_ab+}M9Z+Gr;!G^itK$)fNsNslFJ>iS;9#tFat2svBo>0+_vu&a zLOeZr=|c|bJu0PS&yS>jduS^S6N|fpvpt`cT+mt)OX)K;6>gn(O*$M45vta-&=>eS z+b6eXBp&II-U|GgpsT`srK`8H*Ll0rhhsqcnk(@CVc-^Cy!dv|-9sqX zIh{09nG~yqy@_4uOu+r?17^Hs210Tv?@VWG0AfXO?mvwWrOF~Pe8rIHfKketp9@#y zQ*)h(AyA1hLJnnkp)>9B$0yh}jXXD}VbCJsLO?aT~JK6P@#!Rm#YRW2I^TB<@y zLEiC%Z6XD_Ad{14?a`PI&=%QZnyFT>!T`pHoXq`+`MxIb;u-0ZMBnQxa_FUJhT^QD zvFZC|Z}9Be`oYu`feDzfTlK3~%EEv=8jS8%=nk*UrVw#)oOr|n=J)3_bA8OAx;4 zs*G=?{DfmPUBQ{mzaH<51R&3si2>TSC<{o0Q)UyZ)B}3_j9<&TRS5&Uj&Pvj+I^~J z`wT=2JtPi<0Yy5j|0%*lbQErr5gUy5?;tn3)N;e;TT7a@h{_#gijdd>x>D4SphS>B zTVtO8TBk=wZ>Qn&KS(K$3S0&@^*rL^XLI~y$v>k*7*I1%P^u7P5O9|k=^d)9g`+t$rvKy=$bn)-+pit&&U# z5$N{e0BR~*d%PHMgBw|W^JlXOC~S%Xu{LmM}pf1qcZfW6$X~ zI$_Gyvpq2##ssU5axfY5Fk*0xE5YoDS$wIs;gye&$K*y$g*V$ok-2hH=`!;!w>8Zbfw`^{QFnOFqOSqgnI_bJZhv)I-mOcwEnf?7-7N2T@>RFz9 z@v}27U;fBDAt2Zwy5nT#xRyxqp(iY~Ehy;pe&pDz@e6P?e|Z5o}G=}wy>qz%O!Q?i<4uIJBIHy zlBif^gw@8~WDyB#5P`hfxYM}#J?1uvq)aGHqa?%7D&$=8if)f#lui>Jdf=~2I1=1wM*>H=g)Fn<_cI;RA_35*=YFY|9@ zT;TWLe=kryGwODb>whF8nVWCA$ABDMhZ5D*7G(+h|(#Ch!ds5N64)( z1eW^bON~(6xu5K1Se*U|ivEpS??+5`X9>OFnu63&hzdbwFDNkH<76ZIXdnm?%|Zq- zMo2c_wub8qTMt<(p-D$%KT=_zE67s@3>&FVF?YZ(4r|jfQE`;i_8pjz>_kuAty0M)HC>*< zI`s3C%~#>V&;9NxlFfC#X6Vx|jn_AC{K9));pJ;-*dE+!tiA=Gk4CGv)8P0Lna`-^ zGD)QaQoM%2Q6Le9&b;PT~Xx4S1ZLM7x6qsBA&oh<-{1JlY!+2ODhY^ zHha^P!jo@K6T^d+Vn*cEFnJ!m(9Ia3_y>pndT~UA_M&|#iMb_dfjTXY#L2WP33{<` zhn?2j_w_??ah-HXxNd9fzJ}8xfKo$J{B>xAH*~xgs2oeQ2Cmvbe6{@?lMV~AiTMobFsh4wY3oMA< zcfKKvwZzE*ZP-}&NcrRfXGY!>akJkwQB!+QB@~J#dW}rUZDUT5RXk!B=a+el&ud3#PVJ>0Sh7#;|L}c;T_{^e?L1nE6ZFvosZ$nxvm;l{`9v~@QegU zRBuo}bdWrR{0gN5*@Deeuzpz&BEjNO-}TyjCY6f05QO?NC4L3m3k8L^e+P-Bh2Iwf z_=SWrq~nlhLJgKs?EDBD)UAU-gD`|Vb)w)v)^ev$1_cY`&Ejrfvfc%9sY5_QDmjUk zH=9f3V$W3t3xTxJWC;*vPh}J`;8O!);EQ;FE!Vk>CMZsT5lYSg3O`afp*+VM-@4{0d zQLjA>`1^qWI!Gz4)p={%FhI&_-mX=gXZR~2HL$$~E=xGBa-Nf9QTmDQUPDG@oOI~Y z+f9}?IvK6ce~+)x(Vv7lw&%YG24sKwu&yhL3J~tn%V=|hgIN8}7l)aQGf0!_UV2!q zdkdRCQ~m6gUZm0@+>m9%m6Rn+zzYL$?2f#w7<8Dub!LfXMkZgKVe?&YcE;W9N^av; z7>TW@6)j$`zYTX{f)!s6zBlP0GTt@o4(u|`iunU@80b>!rc|2cCk(6fk#P5-pcRRl zs5JcD_TO$M+g@y98wPWnXZ+btYeZYCQb@dLXMZT*h9v_EMXYSr^5irpO}PSMEVZpF z+NFw&C|@PomI)7p*UH_uVadxB|D-A8c>*O}_)R_EydQ+mGBhatWS}nQ?<|}QNOBu;91;|EhKSGWwsUM(hAd5f zFhhz$j`vcgB;`(2Ysl=s^?aq~1~-`ADqC73 zQ@|2_I|KsBSEnT})Xc7BZ}eszD)tfBW0pvhME*JkT#1|w;^AN@O!_}sUdPCm50L3! zST%D1mQ#~^s{}`CLE3vL>lWhpl86jJyRYTVC8HiF(HMmkP+8|*jm(pjqqBfUnu-Qg zeUPaNqO=^yIW1iAt_v-NnbX)-8q%x?%b^tdO&?1ZyNwQbi8YjctJ7FuNh#^4H##{2 z$08aUaM#BzR9ui`M_QOnIuaM>%wTE9lt+};^hB~KBE+D8&)aMzab2)UgxOO!+DU_}ukD^(^($1Skbnwk`9 zHk1}R#wre_xK@{%ChP~8Z}P0dj^lK2y$CZ|jKAYbpw(>Q%i zJdG+);MwOlo;}kFVDnZ9%%fSoJd_Fmh&918FfoGrRbtWC0fd!d z7X}0tcO`m6xXl}&&HgN<7?m>XP2WLsNUTxNwY7cyHj`(L6 zt2RqDkL<}Y{AIeQ;iW;t&Gh?hFd~Bu?GWfypJkhYykS=0(>6X*+5TWzjOp+xWpd{< zB>_}1Vm654BhZ%?lTu3F>+C~U0xby56<~lscu@&b$7gQ{gHz>Gm^GA5sBEK_;ml%T zeNIjR)Fu0m{6Yo+NXcm_?(sNA!0q~`>9*pX)M6@*n3Bx4i2{u+|&(Egs!1w1o(@}E_Cr0J}bvOo5`q; z?9_(?IDvpA=Hfu4z$~#ow_w7T2TG+K$l9o}OL0R=?ZO`*{>(^G0*H_zXx@-;Ia!zk zv^ATk2))s4f;O*8z2u5dDM-T#BpThRvB|%s*PHe{W@(F~@lquY00;$BGm9hO?EMg~~F+>^i95uSt zI3vx~59~oBv}O+-?oodUFqCSHwnb*&k+Lai!QMvl41z>!7ixU#f{b(#MWxW0Br;2un7b zDMhb|9U3_NTjI;_5T$Nl11S>OgrNT>Sf=+|1WcxiKkf{m22My@RZ7FDfvgDU6s~IM z1k@I}ZhP|H@-(FvMPgiZqbq09AVYXYs!EVpKvD#%e?qW=eyB4<4SAF=07!w5!6S|t z9f^SQ^9b@478ho*Fn7vXvdBv9NwIWwU^gH+%WshG`t<9;S~51JhLBW(z(vVjP^{(f z`Q`(PrI?dQ8A24{q|q9T1i?g@$&!4bBBG`XQ2aBOybw#wf1KdRtlqfsb#kANKYei< zaD_C;T__CUrlC&6qXh70YzC3KtR(h>yppP|xokww>4^jaW_f6^MNC}|O+bBXM5X!~ z0hLWn-%Xsa9b(DyZ0r<#!IgrWAhM&oe}AKkR5~Kx+3u;`E^IbDFQEY$!z(x(fM#e7 z-~e?QVi_qzuYi{&A8%`FjJ5F63nFrZ^+&Uv-bmg8@qA^e5&Fsq=@MaPgM-|!8k1K9 z#E`j*3XKI8!1(Id#?s36;_F{mep%YSww?Ak|JC-*uh;|uYieeJ%_$6WrF=s7SgH@` zrq+h%pHGMsYkuoV^Mwq&VkscXp8FXR$IdC3@0%JLr`(S0oM{Dl7X@gS)!wDoAG^HZ2$AbaY!PMt;JQ(uxyE4W_X^8Li z=4O#(L=XT&`qk%mQCFE7SJHN*(ic09^nc5h|yu zsFZvT|HMVH~jfAEg(D*ST%?v^;* z@^iZb%e^tqr6&a!MXW?Z38%Pl^w`?snwmO;dTvC~FQO^1=(UwbV+HV;?81#8r}My= zNi1`UkcHhADy6VC&iW2N@_ne{@qt%9?))wf0e$pDx3M$-;>SmLJ(J%4u09o^=;whu5e{9Xe1fS-|$2I z7$cQy-e*WPPAJiV*{i+fihcJd+J`8vlC-X$RyA<07&#_6{CSpcfh5Jx!I33%4?Dq| z8T~IL7y2Tk9iUPEh0>!F0r&{G&Tqe~q<~wO(^xHF^1U9YV(GSU3ny=YY^rRZtRpH# z*?x;p2CuP&zCJ~6MV%LbS!;nr{8?%zv(w-LBG`!c2RMWT!W;iAVa`2ZBo##1Zka%Ex1+c}+~h?p8xUN?SOsne`7{~@qj zS#45yd6fz@RC`W{^;U4WTgP4bT!Nr^0EM6@a6C4g5aR%%(Vx2g$Nx;1CMsX4t6|Gj zwkYXxeDY~m8zbk%T3CzBj>4wdqSthH+&)@nkmMra%(+q0iCUg!#+J#~?fSnr>i_-A z+DdGr%pE{Tss}UM3bspP!b6_pri$JT|yd<+aNV!-}3W-oslg|fU%WunRo@E zs!u5avYLW*BY6y8F6jYCnz1&b%#AwYnNrWOdu~e`3}Hf}{3Z@%5`;<02!R=@Cdh}B z+v#r&2^gm%>MPSUSp?McWbx#)d=!osG*_rLg-1tx@(5IyA`cw6rKcmWD?rfeNEJ2_ zkRXF%e(D`hcQok{zhQr&U6nNeL3N-BB^a~5E341PeZ4#E!i`+CT>XVOJ`@k>AW@VC zE6lZMB=-*wT^LQ-nEZ|h=6`-7Or*yLmLKfU3++$QAit(3 zec|}snK%$ArXWiCS;sw+PpZUnsPOpR6=Fi0iisr3gGqWe&a-TMSBI5SffVmi%q*j^ zvE)RY1srUwFBn+}?`$3XMfc%00Ua$|5Y(wv0WE3B0R(WCBo82FF+41QzXAeSGigl za+~g9EQS?&ljrCP%~RbhXA|;^_wc_E)0R`=$M(C09bx|(^I8KB#)<~G4RT(>0#JcN zo{9SA23E7Xiz<#BekH-K#2zIC+j}XIs1`($2@+IH@)bA*9K1AIW`Etjb>-U|$^5Yy z?7T8`+Rc=JkUsEnUVtJC2s|UjP3HPo$tW$$kvqR)*@_xbfXddDf+!?)rhb4%&y%Qw zN`kVrV2y-1go?Zs^6!jv6*pqBfV6P1-T_AD{MeCx9|43~F#jG=!6zYD3|J;r3If2X zLI}jG6;M3o7a}GjTwC7}*vPcYcTK|dob5D~AT zKp{98ShHU1^PxYq*Z0TmAWcd?-W**AgU)269wUSp4%qvY>hgfsOBCg0_>L1UJv+Q% z3*r;Gx>;ZuNMAE!Oivjho<@^UF?=goE`&oQS(ohL%TsO4GM^Q}W+Dzgy&A~`}1?UKWR!){<{;U+cU`>ARqulx^x!xai z`ft$<`C_f$4Uz7%F?vnG!NvqDFfJ*@uf3Z8@!8L>nsk3@{`B-A(jc!VuWqeIM1K;e zsT?A-LWER^B3X{H{Hl6bMzX52pap3-Xr82_ySK}_zk56K*i467!p>H5#VMvti=CA~ zXYZ2GX_aA8Oj`n-fV>}Jjx(tZ@|$TyUi=98!7Wu^;5Xgp2{3cqTD{S9plP?oSi52u z6=odpE(R>dcja)HK}n9&PaPo@1>5_BAW2X-#~#BUXD+!e&iL?gJ%KDQCK8QAO>!N5 zdOE7a#vLaz?4zEUi{q)7tHjxOR{!}GojgX#lIB@jN=CiGJ4i<-im(;kr4A3`9|F0$ zliay;hj_ba9a8fMZVQvn0h0z(JBlh`uWymlBP*66gP$EMV_Oi(!4cx;oG!WrIY3_6 z)OCR;-6<7MqXAgg#b=L}vE*+$tg8aQwirQ`Ai2!_A^{fWuaXCly*Z;!Tf}vwCK~uB zdnvc3JOzn-M z+ps&JcmX||;HXXyJTSWOt{cG|fhasO!^q1fJuKC4t^T%D!|$Z_+fx0AqU7rC=%{uV01~qaWDqHqL&27{@dbb<)0=-at1s)R?LT3L2 z-@<$FCA{SBZN3B4&tGx(_HHx*{Z{N852T&rOX&OV?RXA|@+%H-%R?yLe>Qe6BdxMFArZbm7$qz;tGW8 z9z006X6gVP8nPS65OGypIBIrz1<_phm>hw1Zi?v`{v^)bn&%^pE>kt|-D{XnY-mBlDebu#QDP;U0z1v8-uM=;&f2mkT#=bxU@ z`-c8uG|w<;1N;{~x@$XZW zr}SN#kD&siayW>9Lc@jxL(r^1r&mZF`z@plfo#QdQ_{AgG;B?qw z%3CG8z%b->6iUSvPLN#OAqIj{znV0LmI-kQz;i0rh}I=QR94j~Pu|zqC1py*t&cu@ zjMZ|bm{~!o8p0F7=&_%ybjDUtPW%BQ$%c#gRBe>@SKREjoj9EF3Mq8pWVeTZTK->a}a|hFJuWg+=CKSF?A?o{2lIjUjj2y748 z0Q%49Y%Jjb+hJlWx*kUBZF*|V=lWCf&G7*X=~J>5Bv2Htv^prQW2F0k85$o6AXg;$ zrl|U=W!U^qJn4)dym%;n9KHRfs=?E(C~6^B+VcuuIJyPCJ13zLXzYGYg39*9UI;sdoY)h0NR|_~3ml^w6&fsSh ztVKI?x;{mzQs>WOSSVMUnJjA90<@;okz?pV6DYaTB6Ac zJc-kp z!KtW0S#@A@#{$hRN=L8q41F5vRO#R;W_DR-6~N588Kkk5HbnN}Xa!#SZlSjio_!`+ z!QQM$7sQQ|aA>97oDXtOhkF*VnS+a_IGUq+ZHI|FjG{siiI1|J3!2TU3iQhSn< z&g`HH+|=4oL74h?W6P>6pokBn?#kuBsH{@vY`XAqmB;5IB#1hDXj(29rWzQ-B2w1{ zcOq4blTv3*eEp(d`S)N0}f ze4Ma9f>zk5bnSTq4g#_Jm)G?H?DGe^z(1iT6TeL8%$lbqj?QSG+4nHksV3xDxM0It zka*)PDmR?Zb!f=2OrPddwo!l{%IHl~{c!0T!MpT&n86R>@Au7;8a9u(Pas9P6#b2yH<+Dcv3) ztJxRk-Df{g1B_@yDzfWH+jRiz-~cLf=)Ipo4nST%h_8B=iTYrZ2ufjUj5BoK5yR&K z@vdSk!xh}E6h6yQM0&pnzk;?a!IyX?R5U4FqfdU^&z$@xqTQUjKzRkLFF-qW_Un)_ zJlk6#S9tMuTxleKcVf8_z(SX%CM4U00elY$ONUKxN3aI1*Jv?kJ{;_xvk%F9#7opB zC(xeM^?dbBCa7yZdi7|d`Rw_lA2wel8&7|Fwz>7_xwyV0aonJ!42=fyL4DJzaLsi% z1AHXQioe06S=AW1Iw$ugFHbRd?%hSqH1X}l=7skco9OgEO|tikoM z*z%91FciAi7BwdJg{Jdwf8zjYY~9qX>m*re^di^1^>%=)koG*Ste|t5gUf8)-iuew z(Q^(jDvWz5Y1l&o03rZ2`obogrk$}J^^PRNY#LMz*91Pt*NeTlh3q%u`gl;^?bOpg zm=;&3gY-kpt6iIKZoO>2y#M$g_n$9@CCH8bT7EI?(a;`g2~I}MEo&BzH&<=T24%Ko ze*|t2VpC=YP=cw0t8b6wD3AQr46bz5FonQ6Njg7ncUU!sZ>F2!W@_=@@V8@Q`vMVM zF1*sxrul7$;_eaB+INwG4KD=iWAF4gW|B*y7$MB|{R44}V?)Nfb65f{-Z2x7F(1$Y zI-JXcqBrul!?E0JZ_^Fu{DdsmVfNU^$5I!U_l1;&!yBDkZ?X>azpQk0aBIi{1R(B? zo0674ua`g`09Y#=kddJusXK5&xP0jZv7>#G!e;D)!<=S#o27sUvl^&jflIQN8p<$? zQY)6j>cff5WX%cV3Yqc=X=USr^AJO_xG(yXdhnpwmp!tF6tEqnE(0QAjj!9l`@v=-nbxo?8jk54~R<1Z3Pxh5tDEYjlG;HE4$pm6Dl841ao@__9 z3&rv2N^myXhnE*YODVB|`+Gh0T0ue=q%fAUo|HI<^yLtEoT3z7xCqsz1CkDq9^!Sl z*Je*?hBy}+XJ~MGPCl@()?4mNbFYVg1j8Z+Brbqn8ip@gY`5sSc}?quIl5zChn@Bt z=}uksHXpoz_a=VN^4EHe<3=?ueyJhp_*ncDk=bt4K(V&u+i#oqHy%CxAxZ0MssG}5 zc4Z02iwfiZzBY#}xU@3M>rWxeFwr}_jNVJyWUw$DBrNNZjTsM^w|fI!fmngo~%9($f=J$kj~lLjuQ z8~^dKNU<0>GB9HzNU_{L?wySI|15LM!vC|jQJbBUJj$~&INSBbYxi<)qc*bWJ^&O$ zyM!NU2{=fsykU&8+rYfQZJ);VQ-FpbPy$yMqjV)R$etrmyNWhK@xswTp~m9TA#FLW z)dC8agHwuRGH6rrq8yHz9wq`+KJ<_>{1ud zShn#rIP42&_l2`7aw}Dc%bMsFF;J(1OkaRi&6jV0LX55W_B z(HBnVe4LJLXCOECjyCbToE_;t74024%su6VR3S;syUoY!)cj^a`uK@1^(t@ z5)y*2!7af^U^=6-(MGQQ*?5Dm@Yj5ikPZ%^L1J9<=b}5Z{hWX~q83+(J7TaXM;@6L ze^u-ePhtZ4$TzFTAK8{uAQ0WYNfMHn9;$wsY6v!kQL9Y_d8FZrg)TKtL`IRE6+-qH z*H|f@eP&G;*j|sVRck`rHINhTDhZ?C8k}Gls^3?eqU)XxQJJhW1Pa=3 z_nU{pr$PV5G{pW?)Im~z_~ZS5JZe7N`eEZq^T!$|Y_IbmbLhbyO6_8O8S)5}Wf9Pn z1O7}VeL&}wwF;Z=-@%%k66>&?d7G%iO%cv9sD9j>8FVc~&UIzE4D|d&0JdM6jiI(S zo4%MDja|@+*jcd6NSjkUT}2?`4HgU4g=qt-3kH~+7q2gr@?~%{)PQEpQ-fJS+p3l^ zdBoKO7}j3T>|iKYOu~x-C-A*{?8gJ|0B zTLJOL;dgEwh;Fe^%Ye7|Jnah4Um|Sq@z&D^_qR|Nmc@fO3JmGtmR_Bi$uyC3i-!92 z!>#Dq@~1OR{OR(hH#h<{Xqa7tW*bD z*zCd=1A@>%zt4(S%zl3`+*@R=YwBvc>$g|$eWbw)P=d{rJSlMPr2otk?Zq%MxX^QB zIR@dFeBw## z59($W`nZ-Loeq#2F26w@9OeL_0s?7gq!YizEHiQ$O&w!?k5+CyPS6S8QuU7c@3}wW zVWmyxq>)}m8)g_ut2{B^g(bY9Nn11Ce2mkW1fL3wxUu4`QG^MF{q7~#IGMOPhMd9r zoP&8noDzI&>nu5YlE}q~k|2CP)>ylTgGX_s52S=<+DD9f{dS53*~OQ@5e=3;4%R%e z1qijk?i|r52&a11?6**hhM7Hb7DXAWGin0X41@4=+ENS?DgxP3(NM+H(yw`FDzSNMrUTeuxwvgHb{Yihy22_ zA?@4$UY5=25fw_tRZYpcO?q-71LqH34Ih{G1_lOP+oxpb>|JMbbx}iM?#NhSV8UWW zI=hS#P#G}Sx52@i8p4dC&J<|D?^K_VU31lDQS~SqBGo@)kALeAu4NUMszE9;rV0&U zz%y!2ZEf4DP0o0=EyYZ97WowBi+w@ycp79d;$7p>%K01)%QBPCkKSTv;(<;1(1jR zOW{FOEQLJSk-~#hueb|X0O0ImCUivQB{^lL#zCmwPfVeQNT1FSIuR<#Sd&1;ic+Tx zsBJPzc*N?UTCE^C7@!g}v;ijv%s^Ta4-k38i*i9H&M+<8gGl^_zTLqpEZnIJSmo;q zXK^BlbI4y)E(-e$T9gZP-yh_cT(87vDB1(74mjt8(>*1**d=U);>fCvGRx1MJ`&U`kv7^)X3nE=8b2|g^! zsnJO~b^3N;pXZXN{p9}UE0iA2?UjTzsD>fJ+epbO+V~N2b|uW0F*9F}>0{|V?nw2~IF#WU9$whvKp ztl2)=8v)bCUw_}8*C)We5-DSV{3)gw@@Af4NEj71#gW59n8NGZUTGyAl9kOt=`gXH zvT|5ZRbn9BQ<#=IO$4xxyQrF=VUM(Ak>`tNV7r>xIkR|GE(1n*S8c55yvOV9S$t?8AFnUaWR85f&z^}X zdqJ*iMrhtc8r?ST%DuEzQ1J#UCN^FkC5+m0gV2iVcvZBQbmd0$&^q)fHgBri<3SCZ z$b+)Z9ubX(UpiE|Iy<|uf#VC!tO^8(j+*6kU}as$RHGTcdNpyJ`x-Q0?GdlZE7I-9=Uix*G5v?z}_hZmf~GBEW*R zJLrwVV}=-U7k30d>QiCa`JPb|g=tZ2+n=g(YtTnQJ~VJ&!?OLM{N>gzlIop|;oPA! z2={@7@njnBpX;@78$?_tn(tuLIc^PGW2DE(-nO{&!g~>6kfzO$yKyje=shG7@D4I@ z%zjY|VMhyU7YYl_^VG!dHTOCcuXJZjKoh|$v+JCRNFedmSy~%QcK+Sr0I|{DGB}^e z5N91vVO{_iM*o|1=)@?%2#n4z1}DRI2a-85+%q(>KVm#K9ymbr;vm%#I%87Xld1^*0y8|5QA)!$UirM}Pi^JW;6FAQBs^Q6BceAh1Z#$0a zF(4$l0z$yOWFF)p)*?MZhUZ|IO@#rCom7uc6y=3LrWa&Cfe59QLu4e_* zokNHwv%cdI<(x|cO?PJJpZ_Efz$;6_vY&HmS=gLBFSfnRr1(56)Kg5Up0&qwkIx4r zdcMWY5>PA=?apCsJ!HWp!vJi7fcN!zje6IQuUM9$uy zwnQ@#m`Vqt!vw*o8iY0o0|@OWzC27`UaZrnit)qN!|*C3CqY#|ZUZi%H^DUcSg*CO zUk6TrJZfI`&mIM{N026|6$*?NJq+Tbs zV1XVa0ujP`01Zt)=3_oY_@u%Og)QE;;M)^5#r6Ti;~3dZQ>Wk@MUCP(g!nQtGa%HxZUgh>Ni zNCrb3?%a_sqY5cD&gni<^&4;j#6KF+`O}}lTnLL*@rzOb~VRg z_NY!xXrYvKOI+I2)OOs5BoVB}yt&`6=|^?>q_<>~vTJX=zOeH8*Og!R|I*5KW4p1U zhl(9SVX z4k>3DdJ7K_yFGsX=otVzj1O>-tn78(uJlhJKhT~f2z@3jpmySY*gJs^(=PC4AVVFj z;8^{b5~Hn$qB8~!5~oiYytNnXT(c6g!tlcRn!bcE9^sJp;nfDgi{cGLF~~^3q9-FF zN}MF!0w1WYmvk85aC4u|++fPF6~H5JfmfwhD}qNz$9GWeA&xr^2uK?fU~13tp>}ba zQ%fmIoFpu2oj>9iJFmopXGZ2~qs;j{GAR}KH%39_ znV`Hwv7G{z0&#U7v%61~{N@iYa0|cJ=edW?7muFZe}4bv)8_y+ZZrS|M^d;K-Z#D_ zktb4(Ao@}TehR+&pn$M`TvzxAxj^9P=UEE>?KfOky=vHtk*45FU$Dx2c;$v?*L5$&ldF$ zV!;(LoFyZHhO{e9C#dx;llohoKOcWU7EAA9IdIk}-*Pl~ZY6~gTtZ|E&M+&lpyZ&v zUI@vKyXqPzU&9Mjmism!rX9z|AU5ck7DcI)A_^w?xqB*Pg^d@h3r z9XCJ{v)#k#G{C$tA_RS`IL`@AIA~khVb%joy&=_$%F6Hr>)FH9tBzawK?_JKosR`; zf-DN%EzDPKthgXA2I4$&<-6ViRX$yhkh%g7?IvqR(3;sAhR1pK)$91DLhQsOz z6>utWLrwXx_nvHsf)J!N#NP=I7dldK2%2)A-uLzvY^li(70B&IA765J4kLK zPh{kMK!e2y3Y}$W1jbP2Aj@+P_u+IgI034JE*?snu_^`F#a!|VR*FqPF7@TwmKlQC zu-Apy14kesVF0Q8O4Dti7CNW>&3!yUWDbb_Djidt~mtfG}ixnx5)5@dP?`m}2~Bh+084 zz&jN(;trUd!%pv5I0ulT2Vx5O8|6h1_tV9>Xg2 zF+U)Mg{W2G)nRcXB@5p?>8;@zpi&)W=HUoixOa>6C>!C3j$m;=Iq39}Ke;XTBXEXb z|I~Wps+f!)&wCWf=%_MA-^xA=w+Vyo7}KRHp)gR^z*qs;5Ijn%3wVPd7A66kizup> z0a-|u-hze7xlY*70Q>ISNzqNsD`L`8aF4n%hH4K&BN*c`%`&aMw@|rJ2CEwYNI##d;dz=Np;ibhM) zD(d2V?Q|na#adYhFw3cqI+ODLrVU4eKe=}13u3_LjwBEQQlpQWic~5HN{sFLR?SdK zbO50JOu@eNEGSBnx%)cKCC{EdfBDm+HJX``e3>@Vz0Rl&hh@>y0({=XI&GEi7e>Mv z5N^euh$Q7WMnH;fUD2ueo4}B|N|Ue`bn6bL%Aa1u5%MzKX4qLmiFi5!G?c?owp~Ql3dh zBtCQN30>w2cwM{|H}BuQEh-^j>%9Tc0SIhDXF9n^fQHJ{P@?GNA;*eBKa7<}D5M^M z>|#mz)kYhWEg5u)zg`NloCSD+CVgpm*47v550p1Z846U~8Z<#WhwrsX&0P*7GZp)p z^tQ~{UsBtRwNoV<)T+YU0-xZF7gqzi6vUh#wR)L8;P?qw?DyaVcrLJN4I=OQ?r<#0 z%&Ax~TF?jcBKGLCK7|YxCJuNC5qa+o_||v}Qlwi1IRe7%#_QEvzx)9l8u+s$)1cNszgI3SPeo{BIs|_N0+8JjIY>T> zB0)ZhQqh}AgJ^Yg0I_=(KrGaE`vU=x6lfgP@g1;9QMU??0HiUkiwQ!=G{`{iAi{$9 znSOHsSlkumB2Z@d z=Fq_;7E$(>BmO-_v=!Dyjz6^%Nel>xsvOiCH&^|n@*@jOv$g(+xm0u&Vl7o)MuL&X!8+J9Ta3a# zxIdJN1d|R=IlNp6H>>O70O@&(ZhIFZ7wfUY6JYQ~)FgVq^Snt%IrCBrqr$0XT_5j* zgeV;xWsNqev^%?Nv;4#1kjPxZT{|J90uhAQw}RAO+B|!p_`)E2ajAoLm|s|Rk0{j1 zw|-mTLk=&K-1c!8jaQM8#C@?6P3SqPnd;%ObRCT+Vum>ydJeeN4A?I^C+To1xFw8W zF8N1ygpi*5pcG)&mXm*=9w!|a?lkU*)Wfdv@(+oY5B zA&wyhEk&7+8_7$6z&=jp;2k+E;3Y_jOuPb5$o5!3IhriEAWW09(VrB`(>VaSlyFvA zg_$gAZi7^TqpKL7pVDT#KdrrZ{zz6l2LsUt#H3b9buoWij9E#~ai-D>c)~)>;oLw~DcQ)9#pX5PULlKPp?7iSz=7jv zi4uU?9IA4_2ZCUGx1gvqbEdyaIk0MX@R*RCZ)1F81#PKoA;Jnd87AaXlP{5mlr2k{ zLzI;u^r%p}C|ue#w{5Y@IWV9dPyqFgCGiV=3QwV`E@ln`Sr=Kk^)w zcQxdzLbylzj`f|r6Zoaoe+2rlyiLKt3Y|f)BGUhX9-%Ot(WQ$vgQypd6n+eDTqX0+ zO77mSQ?Y4k5Uc@ZKUGyqx;Pj0Ql}%aQb*mU7T)M$81X9vb6vrpfpPHf)0EBegIqB& zGIhS$>oqUWy~Z-cn0kx~BZd|?D^=;c203d+lGmU>jox8-F9`)Wkrlxws)&Os-&9W6 zKfG_njTP(}mm<5z0uq){MLnO9tZNIYHb%(#DB1DlK)tmOWe5SqMp1aJc53_XPB^c$ z`>IC(ne;nE1~F!NTjRp*Kyz$^0=5qdfwk?t$s*BI!tXR(p{Z?S zws6_c)8#oq83_mknd)4OBnXAralr>d+9E3`jVqC1)IKzxOCE_47;K<3;AW>ihHs`Y zhhWzgEe8GE{%~;QWYBbvlWd0zv1!r=85x%|L7`;lZS`N$^oD;h5F+EF$PKL7OyLji zy?b3+Nif;>nw$Vl;XS4!^&UWSHE~13mZpMqUmE+{MwkM$K)~(xqqQ6vt)S+=&))~V zyZ^i?+Qb44!mOyYfitWKyNy<%h5ARtq5*g!JiUCs3((}rL#-s{>yYQql)1xg-)AlTG8LwbeF)2S-~pa)IFM#Mgx zGsyX~(2u1B0iwvh1)G_1X}ZZ1yi{gfgHSLt&0u?G(#?S4Vt6u&RFtaJjKWBup$_}0 zu7zC1sqI~uZgC8el`E%RibkfjX8{x9I!~X-vhubBwYj9M+BRS}!-Ow0oK+m*V9?Yo zE=Qdfqx@KNI2EfAZz_IJwCht}4ow9&O#I?S5A<+r%PL#*`q9hMpP`wTYo3jF7q*r;^V(cYO`czz~3d$X-Ah1BH_h@OrMJs85O6ujsn{=;- ziZ3iKVG@lVy`tUy1r$@XG(yk@WObqc4AtqEp_u8Qj4(@1MGrfIz!+#KP4Pq!b53_e z)W7+!B!}mBs1ZE17sr~`_Hn*x1uo~jJf${w+EEEU0bBT-;8avDu;}AB_Nu?h4KMj_ z@^gGlfA+h-M=Mg{@K-7_$;MoPFW?^nak9ET=Mr4$w<4+Da~q7xM6{-`Q}eEJR@`B|ey1%z( z@|dwkZ>@#V@~_Ly<%Q&1yg>0c^-4_V0(7;V!&gu~VS&ls!r@n2HMCn~yu!}^sk@*{ z4v0;+;iD}GE~axE`PI_hDP1Lr{k_VC`UIOk%^ZOl135JRc;*yA4l`6!2*9iAN*wl7 zQB9QUa1=$@X2_o+ZI(2t4my<`x`B*<{!QeY=*iqymya?nJ z`f_LWOC00Uvy;xc6fUm#^!)Ey$!P#mjR8i`3qp@b!?EbKcW{EL6ha3Gk<~no9(LgJ@FRRh)fE&zxTu8D8T$S6NPknkK7I8S zcb#!vNQKLNOmKI!_Zt2=(H1~Y3Xe?_UU0%K0WUaoa1qo*NGc$N?;<+J?WnsQuo&11s<-V4@${<8Z+r$?YwHS3N%Zz+)f`H(_UsWbcm#w=}wW47rmnnCkS7> z&~3yo$FmIg&96tgA$!S0T<}Iv=ONP~JVR_Qbhh~M?&YsVs%iih1TdzGC~MUlz(7L( z6lkOoapiQ=SftiPL?3ppAzY8m7 zJ05o4`B{a4N!GJVhlKqu;hg1z1J6(W0fV8B-d0S&;;rJfyNaL&?eA(r8@w+HX7o3y z3UIJ?0o3??j-F0XmAT^~STLx|3{|!eFOB@k18O;lHUP5Fii7|TD))1p;b``{?Ji@r zeKe!@;IfX~M}c}6>R0Kh;QrK-BAdq{-O{GD{CeMelVX9osQNm*9XAZ{B^6sKdu3R&p*;E77PH{L5)Rr zz(hoJ+4win$-MVV=Wb&h-$Kbtd!w@37*L5hPX}_#MXHt9mSil z*GRd9ap7+?)90qU|;~q2eEYb_R?<*oQcNHsb?n7uefiN`kY(?AI|lbSJbeXk|Uw?;Qq8G&+5L@NjRC@Dg8lR74N_nPAekpEJ$t>xt z^mjCG*`EML(=bx?=&P0C8$BKNq`h2cVoe0JE4sRT*Xy zV=}%4@eT;qKYe}6LWA>c8PzS|{AR-SQpPa7J%LHD3sGLC1_XQ|Xw#G&GIXUsw%Tvj zSWjnDhnw7LATJ91vh zZSghf!BG+y5k-Qa6U5OX#!Fm67H>d!(I3RVvmevAT@&RfoZYBp!;{2UR25LJhFSvo z)itN5_fP0ww{Iuclbg40uipIn>(#&CKq4GZX%xnaZeR|L+-7JTuBmajR`7!Pu3We0 zw&2+F}IOaT|+J z0XUr;@6qx*M9d)+i^wMYA>(EAab+}Ux?~B%utT3SwfEKWmugPr=0W^E4j#=)I2>@c z5r;7xwG-&$kfBNv3II4I0?>P?ktt~nYs5BGt>Sx)-egowZa#-gGP`pns=JaOGCk+@*IB4=2yMR3F8N=Q!%~m4iA+^sk(9wHRa7bu zq&PY-LXJiA9pp8Z-mX|5DORqfyd9M670gG*M!6A& z794*b1{GG;guS`e7@_pyB1|0k)T@cHQIH}dxq&&Spo**mZ}1Bu1}f5ntb z(rQt9G%OFEZlA_(Q%dB*GlKt*NaL)jv?E@w9-fCQw8%(UEppv$FD#5!wijRjx_IqI z{hRys|8CX){o&&;+t*f@qa1;}2W$ePjmq}B-Ww5O+D#38%zt1LbpLU?fjSJB{Ynkb zk=wX}b63w3M)6v*LEWRVa@&kZK-3tVA!$dU1qRB->eEr2O6RC(R{uK|$Jnh>HqGQ4 za~7;##xI&UKW&y#F3bE>8gK1H|CyRNIe!yuv^YmNE^cRyu|&33HZt4eG;73q`2(M) zVOJ4zo^a*T$tYivm;Oo3?1W78tSRP#wSB*THJtMUt;Ac(K7*2Fxo4g41m4zqo6Ol_ z0^Rm;o20oTe@*d71;x12<16(=BuvJ{N?K`~xeFwJZ$Nqn32yBo+b0zs>=ii}kz9tk zWkhm1hHC`W6;i6tFp*PJu+vO&hs0fZ62eaNxsO@C{2kmfhRN5Bn|!Tz1OJU)7nk8% zKwS*`Bi&U2M#PY#Q3pAl-~}P$7gg+z$jMqVeuoxUxdm3g_79V`zHZcNu|2HB!ZF&(e2B(my_ci~+QGe1P)9k%EaB09k3_ zSKA|QdORFJIT`CU6jo!@l46x5_PU+CzFEKX3p>Ym^zIje(FaavBKV~kW_;X(rh5G) z-LfFyH1OqjKsCwq5Yfnbn^)xgqe_)_;FzzjaWtYtfe)tCTd{|r?vR8l0nAN5<3(%P zsb9ihCd@}|jog)FN0RP%mr@`LYEJ|hKz4Ytwff@O4l)AEBE#vdR3Gz6XQ&Dtsjh1= z3bIzY2y#*Xxb`P*JjL{+KdUy+N3on?!kKdsO5BE|8U z9iI&Z1yWv-1;CMMtf0!PN_1`P(F1pCa{Yo1%?PXSa}zUmJd+ZFAJ&~wGTQ_<^E#h~o- zg=8do^4wH=hc3g!Q{puoA*}7%HXMq<;ETP48RND|jrwo5#aaRe61A%XdRxcM+@)n} zopls0w%e}lRI>|Y0{ll|AIbMzMi3>+aqC~H@Z_i}rRQ02`U4~ej@E}!z?gr~XdG=+ zYpSGhO%~T6x3Pc_@{Tk1m!-(pw;nd1|NNxMh?J=S+d&#cS?&E?jr?KA>$tV&FB-AG zv_{Nbq|S<7AfKx4X{!HHg)`$H-2NIu7eX+BmLG;v{ny4)Z;u%$I2Rt<48NC9k#;5ynw)^BGGR(Zr$QbyFQRBU+MOT0RHc(j`fVBd;6| z{nyc((IK+j|Id{O>ck7dw0k=5r9GOg2kXXnn8hVi2`pW4mXZnRRqQgg56MAqu-odb zv9fF4aRQi$2A~F%T4WNLOE8}Y;5Vf6L1KHByavn>+yG(sR?yp--RS^m`tPkJOZSqG z_ojJDsKQmOufhbTM&E_H7H?4+Fku;-SeO*$22llC2iaK4_98S~r91zMWbPLy{q2Oo zg93q+-f=}l_B)Ml{9;x1xca}LvUFE~bdPgT__!iTSyDfA2M-fp3JT5={n8oiY(cIp zr{{m@m?n|*5&18jzZTWhi<7MphWm<8zHAA}BLXcZ6D5^tgep8)ZU}{tfZj{5#34JPbEoQ+N^yp8;X`!eR8jo86u-Hq5s zsl!o~ic1hGMm)hJlRD|9YFMH?{f1BG=+=ARKOMx`@6Hp-Q}onLJ3jjR-`@aLk`VIe z9Np>zCGmPu(!Qg&@t9SYUzxElBT`*ab_JX+Cj{r1nw-hvs&U3;o73-%>E)8HB3KF` z!ObQTEHs;BHaFlY_XwHvo$vHpX;So*xhP?MSRM9(sOY4Yj}yxaQ5UM3J4102QbK2S z*f8sJq36&TGL~oOqB~IBPr1)Fi8~U>qIOCP>U3z;B@3lhh=Ka2eiJn<#)CnxeF(oq z^jI00l96O5V7iRW8?*q9Hb|mr!N=Sb^P8!S*6Ka@Y$x>||Hr4bHEOcc1GCg04@8y! zuYQ~qB?~RG4CyoUdjf>4Mj!$?vn+!Loxw9{J7#CHJ<}t;&@n;W*;tgo@oeC%Rj>j{ zWi&`(>*AXhL5FR4A#f5qUjn-X{R?Q9^P1{{mM>NihiR$EKfwboiULS^f2LPfcPc-Z znIn6E#43s1LE1vEC|}bQ?t@W1lgqv4+uitk{g}m(j@zEnNf3)KQ8^p;DOSpaw4(KP zIWKg?YdW2igx6r1r1FajuU6aYCYNW$%Be_Dg$jspK{t`Lp9rXUX!vw=a7O#Lc!~$3 z{oD5UPINlYpj2Pn5u=cWPw8=o(jcf_k-^WOpF^VZ$rr>x5mq(SRi&4_EDsF_RQSeJ z_!TL@GY>)J5re~V3l^So`>jykNj^tW_}S!6SWqJ8i65TLaK+AXCdu>IANaZC8ET31 zQnK2(-MFbca%Bu(`re2|ov>p1dOlT_5mR$FnE(wMK-TG`Z`J4E{6z72dnriFXOPq? zMMU1O>ilX48=;$KFA+9CO^{R>3aZqL2d@YP<%Xy@xvjNU2HdBPDDmOf;(?2l2%@vBkt)o6Pg zb+FA56Q%srrko%LW>;03K$?tyQ|lg7sk)c^txC|k)zYTY)Y@iRMFK>5{@N=zNafq4 zOj)pddlsF??U6bNZ!>bAKh< zoRcG$<>TxVC}gWX5N8G$P9S88bBfd~&vcYBH&Am5Ll`4jmt}MI5fft5T*QAEn-Y7F zory+uIWmE^@_ZS?qHQk~;)rvZvL2~oQc2clvy#G7*veSU@_82Z&s@`p!d!+y)D6kg zxpEpsmHDNq6g#tu6*J8omcoOQ`xYe z$PUb}{E=POk8+^Qc!9DKv9aMC1Mt2IN+Z9K>WxMxNUt8J;yXiA6w9e@qq^NVb$;QB ztQSub)=ueRU_rd$@d0zHZ%1LV0YiMex% z$})I@F=Bg+_@`}TiDH&NG|M%$AFG(71>xh z=t`U(FYS4y7lWBteBp2o;GnVE_&U)-0SG4_fSCU41kNrXl#dsZCr@AEgQ_|f81>FH zdCu0b1BPxw-+dI3(Td~pI4au|u+9JZlag7LFNZ`A?WGUN<8w>*c0M4AJ9Gy|7x)U! zK;`Z>DA%kQEsen`<9}zeoNguSJ0o20R35=b=PH=YJS}9_?v&lcWS!GARf9}_T0I16 zfV{oEbn6;tczyGR#D<^X@;hFZhV8+v z#_HQUjT>mRdONNCR6*cvPRpE#7rn^fnplPn`Sim!mdY!Hw#hC3_ej4o(gZ{iUo#1cd-=v8e-W3!bo61#}l< z=#KgeQi=Jn(|Y^9eh3-81AU&9{kA0pYcUl@n5i}jIqHxK26PC{fO8ISr0JGRQAT=u zB4LPpFarv*2eMlBg*A+aD_$z*PnE{mP6hgzfXNVmg^il8bWL|ORw?gX7LlbL{~4&v zNuJBA83;(Rbq3p96lI?^)67dg4NBALmf|z&!8%7+2gP~LuT%oYlN2(D>-sOogJYzE zOmH2U!dGv&TH=aT_wGqo?t=N-W6FDZ3?;qAQ&4>X zy9Z#F{pmgAjlJACK<8OdkF8?B&zvS~(I|p#}p*LMmpw1%=>HbNvLuD9bTY z@nlg<`vVs2ro?^JY7Ym`qzHE$-om~G^$GU6skJbh zl8Jz8KRZi{$ahRtVId@~wqzIm_S@#x%jTn}Kg_m!EzJIh!C>~o?D5GiJbAb)_?|2> znf|rp0~8$V$qmAX6>nw(_`D^pd$S+!&3Z?(P|bb7f1S7RZB zvN>$C7~e+$)g)PzexkeA7(sgnuf_w+M0heLTE>q9*)Q2;V27U^O$GoS9b@a4l&FdIz-mQ+Yuc)k>Nvntm|83qwCM*H{@cK!D-^0BF ztQl*vf>WnLHRe-na+#I%jU&E~S1!I@Sf{W`g;oXz?5(f{SOJ6S^plIoX%SOz!!=@A zmJ#Z&0EKy(S3O_0D8x0;C?kO?p!VGe^-$8M2QO!wrYay6!Lqr#*sNp1a=J%_4%nn{5jGS)mTt`i zXsH~HZhw5cIGpk}#jAw@r9%r)Lu)@y)8;{+rEYj!z=w{lc(#E)X^xV+jULn&021!M zW^!&dsKjW&HNG<|^L2lC;1veeHjZwuC7t1LFkB<*+wFmUQ()pj1CT2?;?}{ibyS<> zw$niZ(WQi?D0p^u78L#I^Orw8T1!AzhC^UcOA9O%11zW3MTV|N@gWr(R+Jvx6yhG~z#;2nZRUVWSUUj4U5r=lqEZsNSuowtct{OU4VIr8k@dru&tGy)i$Jx`tHrI2 zE*m$gG8E7k>LHMh%Y=7CJ*g>(sV2toErSUJJGhBy`V!)lZ0-^~&rAP5dtcws){X4_ zclZ>ij$0EN+aXDFyUDtH2_Y$40$d<%c0+57ZNM92Q@;eVX`avi{C+c%j&#oP%K_5R z-R9mc$9fq_qtR$IGa8Y{>Jvyjt~Lg(VVRQxOA{w=IOcJ-!dk@!XUkTi6?yP!i0dw$qxS%3t76g+j8a;LA+uK6jZf}BLbM3DPKkk zrLvmq4OX+fp#Xa5fRNcE!3CZKR1nUQsnsbjN-_^M+T zrlr}b6Q5;11w?3(Cn$oNh3Jb~6o>dx7{M-3a-9*3#lJ9cRk@pWEG?Tg$^~tji>E)W zXA&&}+x&BK74unBG;MO>#?xv!8NrxovB}B_v{ydv_n}&Cj}W>S;=fTbDQ)o>fu&>U zmOh$pQ#BqDU{-CEXv1&t(Oubo92rDR;H}VW`uPJ9@;#C)0y7x3Khk) zq3IH^*!1O87z7P_w8KPPN64&MW$n@Xqm^0Q{A5DZTm0zx3}9fp#SaMj@R1R=O2aR3 zp7xQa7hjYPWZPSq`j2zf9o4x}+Ee$Se%@6rLn?zoPQmDE3#lA^3P3X# z=2lKMPufj!nc$uWPrB1H?10wE&m1>eW5|nmo-kBd)q(IlwV|WI{D1eAsI@?$CVqwN z6CFhU$3Ct*FNTPn7wQE5J?~<{jPL@YPtY%@K1(v&6haIROXZ)sca^=Sig-9HmGy_Q zN~XjLPE(^32kZd9fDo{PC(4?A$SV*?fFWIZepf{>X`YSQU&frb0xGJb>Nhx?p3AWh z`|U7VUwQP9!W17h14Fqry}#z_v^CZ`8IU`M^cH5ZhUd}l4GA5xdnBb0i7;VzMONkP z4BMh7;G>SlqP0SRTe}Y2-q!0i_gC*F*A#l9a+3qFV$1 z0+V|HEP>Q?wd3dC)SSgQ(6$kO9fryl8hmgcF9fPh zk!d6B5aq_h3@jN@fZ*-q9=0*FU_psz4UvMtg8+4=uV=}9DlD&bQzYdSzz<4zZE3W80^8-DVtAtcF0)I!BYD*lXq zMs4-Z4$2x(AR`QZ`;HwB7q41Ur7t>~h*5j+1}UZiZyl0g$%ZYT4u)9?l``{lK$P;qUEpvoS&0{z}utU8lQ@Kg?*XPZ3{iQ zvTPq`R8LehyN6NYSX+UoF=3BHxOwx?yrexrxN#xEOx&srxrVE64#_411%WK)WScl1 zQ&L0@${+Tyx0DapA6IcEt77#baBX+UxDIgJz?zB405>p)>hasOw58%5 z*?RpHA?oxCl8E~OFQUN+!U7Z?qV6|2QUesoG{r)6dj+;fBz$e z#27BV0m;Qy-__2J?eJ!)L za;AhE2gVn>Z=`x39zX;qsWLtls~;6+md<$QXlw>;w-0~eLEYq^D0CWA4LB5j{Z9jn z%OReh#_uzLG-H=OSib(7zQ?5<==0$WB5*6OdC2X0v^U%}EG@ZnHEdT+cvNQII`Rvj&=cfz1qf8!K+=(`zY= z=9?QHE+)}d(B)XFiTSS=5Kit>1<%0Tj$SsPYLIZ<6tlSwMRNi6gNNNl;ysLG+}Rl( zvNV=p+NM^zXD1Ci-y1X?iPX(igI8wu24j#cFA-Re81Y^K@JUl>SIC3~6bv%OOq54l zbmh&^i>`~S52{MO9x(xazUlaN-s$*N`%UG#nZA&n$(}XY(k9du8{6b3*O!gb;Jp=) zA~1{4k}M(9dIlp4FdLFjMrntq|1-xDuqy}K?wxWRkj^qif8mQ136M5Qcq}lR_}*TE zgyf#cuRVgEGVGtC=3Q0PfL=4PpV2!LCL6nnezm(t<`ww3cbSJePRq3&>j-Sp!7gJ` z;;ANUOCIf+(Jdjc~TG^wWaxv z(ngLL04d-x#bNo(%PEF7%1%yPnz%YsIuVn7s?Zc>t!S7OTPFo69&_BBf|x>4?k1JJ z2gn2L&|CvF-@H|YRClBB(;YD4AzYHmINrqW>Ybe_5dko0IbMq}kW{(ZlDLa7AxpbZu%KjMbK9a}cQF?wCO{7j(6IMU z>PBp5hI82hEc>+Jp7N>E&0Oxpkg2@$?3hG#ei?|g`Y{sbYqiF6iI*U0Ph|TSs zHj(Qmj!1hJA|SB9UkYAelea^L8wCd3e3x)Z;N%N>NWEV}zYhoT8eL)(2@wg+I{vd~ zi_HcGi`xn^8P}+gZOYM08TEn4%TP{p(9|0HwD!DlqJl~8vq=_-qwW^iRxz6 z5uDZ>Gz`tVSDAMxQImZzdR)184o6HRg$@{o)IECU!5LoNYVR=ebsJY<;4QJZ3|AK8 z5DsS@8mpJo6%B7sc4!xbaX=h|U@N?T$9e-bIH~j}?~R}V#(IrnH`@YhM2imqSX+b= zLyRPPAr{Ipq`+$8JzR)hzBGOo`P&+UnLRHqG9f@DyTgaGDrdc8MKe!xDGetR`jmZ z06dEauEB;l2y$Zdt}Ap9GO~DDYQ_i08=ni|zt8r>#pZEEk^FK0!@ax9`yZpnUvVCT zsf`|kI!lpPDSGou^z)J>i~S1kWhE+om8w+CDD@cLJ?M&Fib-6qdA$7K!8hLom2i`W z*J#9qqjiMpOm7RgNn`s|feWk@a~EUuRt;QaMln63khzv)SAt%(VatDc98J1gL$|QS z_65!_@x7ZnE;4L+2&Nh@J?Aimae`bp#}>Qj3>?MzA=3t@<29A6lRczL&{B>7LG>MzmK*DM&9BbvQm_jL%CSHkOy zp2UX7vwoD~ZF{h^K!>xrHzR+; zozCyWjYoIh*)`PF%i`)n34ZDjxusl$PPA${z$|AoXyfV|VR`+At%hEOBEtZw_?%R& z2LHZEc?AbR#205bom8GK+xVBto+R~A%;W#2iY9uNP@y0#ot$@T>F(<(OfUPPGo#Zp zxs+#K9_Pc>sV>GRmi@x~WRoq!_&sJziT3jeFmnORBfXfBei{KL3Eapq!v6cHy<=#rfTlA7!M)szWB1eXtm9a`RWchMj4ZpBhQ@ngK4Bd6~zjC1m zL}50-CAJciwom`KZjLI~voj_8HrM8qRcWsMDP1wOMLo8sn~Yt+R2QFZ<@z!eb7Nux zv(-?l@KeMigMIPY^NvR$LM9&*jq+dulsxPe2eWHG78;m_nI=dL?5x^qzpM7f>N0rx z7FPlsAri$+Ia$fckw3KnWJvx1weo;n1iyns z5bV&l-8uGXe>m|zoxMwkWqIgJq+}iZl11F%FU-IJFigNPG3H*OV3V~MTSn-%aeoVL zp1`X%8h?ErRcthlC_EC%ljse@B;X+NDXY}v2~bHKwjvP**d+gg_AUgx>j zU_0DHC!Bb_vMNjH&6__rcVh36m5Qd(v}$`3)BES<{vV+gjyJ;pgw6e%dyhWz=Kjs{ zy+1d1qsWy_#IpZCH}^j`_l$6R8EOr0!w!S*O)qOV_XP$U6?NLMR)D393jTJh;H<^j z8gAF94cRAQO$tT5@ZN`gPGU#6I8_v}jd`E(P|gP(NM2NJL7z8B81={SiioRD2ldrAl+}|kF5C9p$aV&oxaAPBkTb(9 zp}gQixuZbZN<5m$G3P(6>};-YzQATe@77XmG`8L(`v;;|DvAAf|3JJZ%Ks|Ced0Zg z*NA>RY#h)zdlb32sW0uqJz~ht_i&-T zLjydFV#VWb|FF?DwQ!g8Oj1QzyPSH_WG{j5Ug-I&D*jd|-N+^=`A`Pp|Kymr$ z*)bG6Hn4n%=f?Tlh*!0B-*35NaX0U~mK^ydq=2s7sjqv;|(;ame-{ez86bs%c0mEZ$< zIW{ENc!h9hMxX#mpj}OD#BmgZIIw{izhDxq(j`|Ly;eXU)nDE`U48aqXZPnf(a%*b zKm6Ta6u*@HJJtQ==-JBNO7%(g7s;vDd#Cj}%K1NCaa5IxezkSNZK3{~mG!-!Tq`*i zxnKvJPlHIrSGN?$WQnP8>aq#@-hlFQp}D2J~;QW=HF0Gn0w)(I4LfZ#BaLz zjUE~#1z2Gv1|_1bHL)d1bX1532)H7yK9it`9}B8m$B;s?-J_G7xr0c#1`Rj^HR4yV zVuwh^`_YXkXanPihEn+5QtAJd;ESuQ&&2@;3Mj&yz%WlVwAwI`%dT+>$J36)vyea{ zc%+G&XEOXriBb1_uzS>g`Ww8}PDgY}>@+)wTCMW4HY0eFw+|VJ194zo2Tg=S`0#ca zhU5efTcCpgXQK)e$B349B=Ib4DA_Z_00pLy zL4>fggDPJn=Gbt(cWce(Sn6 zsX*ML%aWQOBaa;J{{DCSUoA)bknBaC-Di}`W`sZcu~o^G%8cKB6@b5M$ajZaF+Sop zQ^4)@h%@Ea7n*LFq z=^;u|d<6$i=q@UlzQ9#RrMf8(p;h=i>oEjs`-s7m7_|)-6b8o#eU7La+CNjnbuN92 z3XvNhh&UJ^OHMeTb96sB|0P_4Q3^l^d;|bP1j07HRPV$0IzAQ&YJ3Ewh(>@^QE5;^ z5>6pPs%@|AeNV%%Mn-xd!W~@SO;>pD!|2^a-3A$z_xb7D2weROw?IrmB7(XpX^HK4 zlsHFs1s3~<1-$@#*kDhQg|7r;agv;P;jofux}$zs8FZlhH5TqCguo;}u(6_?BO1ev zp^KND62;eLrY@LT4WN~n$7gj+<<82^Kk71{o^IuK^b;@AFq9<117nu%SN`%%<>D^H zcRW(w9NmZSvpgK3-WJfXYk)v;+mq3P)G^N*;99hHN|A^hXdaR9Di~n!D}<(w3&KDk zX<+gYnDX`)QKcjmaTUjZ;EqLX*gLDdgw;SUTwyM>eZE6`P=V^#ymrU#_Q0Duu7(4R zLkh@WB!1Hgxa1*N-kAgq9rh5e@T8B>H?UY}oXrkK3H&_3qm)u1Lz&3Q2X#J#5|V%9 zg-ib%@7POKBf5+9U%CxytJk5|Tdmij3X@wHi!K2=xcfX!nuM3@n_D|9SBw7gKX>#- zv4W9fr=M^e%dm4);uAQG_Pe@@V83fonLkAI;xYBR$T=b!iTf6>!ttL-1-Pr4exOP7 zoiGq?yLMeHVkWj3oD~-tcp#k2Gn!-E#_I8~3GP7?4sUVUr3o^WyIN+7lx<*6F%fX~ zZjMJhdsm`u1o6k01HrRnnnlIbVu@Rr7GtdPaVVUpxl{9zjhBBxzvVMe%K;)Jv95LpiG{poWirQh^h3Bm~yi?U4++lDV za`wNHUw(&u&rAw}H()PDY)6u1oZlc}B9MP{*6!mrp*}oipVj~*-cJHn9T4oc9R!(^ zc9Yfsd)m-d9LN=OFlr**>?Q8#{F*f@Iz8xnn7Iu%Bm5P+oj6ik%sfZmA@i%Wij0$WQQd zvoFU|?g9i&7ckl5OfFb*5GWa!*hG=@_c4~t{d@QRCvxGD`w$A69h@id_=@$@2K|xP zAZC!M3nnoil$G?fOSF+a$14&HnA#gqaT)R)BDs_|hCGu$CZV#ZIVO|mE5I8-Zo8&?Z7#mA|<>_NImqIP{voOgs=X*w0~zmhFJV^fB8$QssT>4 zxjg5&PFAxA^du@`qdboa@ON}&xnmVKHtW06aqK>(Yae}76rRvWGG86qqT~kX@)N2F zai-z&l9@B-K1zrZV47Pknw=^fdm=F*%{qHz$j81=B~1@ooi`7^(I>0T7L*~J26E`E zUd|NZ9eO8;`!iVWW!aN|6f9A)tl@<|{(W2>9#WIq#W{;Nnk@Yi$q81L5>4#^FXMP8 zRowwkKVB~{$HzXjhShbb2|%kU+s9_dG#bw=_{{TTRs)Qm>}u=dcsAa+97!u2A_Pt_ zNj8t$@I!6Z?+kVww0+xkdFPSzaj`lc4yqUe179>iuDI(44rx<&9^n={O~%~Y$0$Md zp1{Fi_>d6`Q&fWXA94J_Sh3lQaK!tjc)EyJr%06<#=>;a^MG0rw!4M5w}`MnPXIe4 zv6wzgWt_QCPPZZm(0AQAUW^ub`i$Uq#3w#{{RaB1ZyWiEwbCJu(BfHMJK!hVgEjjDea$}} z{6DD#_R$sH#zArS`!zI=_a&Ek$B7)Z5*5k5`H5-{npna+Pt*>uUu<;=SU7MDlPcgM z-UlBMzybba8rRlbn00ITr;BQAA-3mCL35`_= z2%2hB>SFK7XVwh`D@9)=um?nl z5t2Yc#tV2@*CmuFQ3j^g#(UW-qJmFb$71#MDhF~hj5l8#{TMTorhHiBQL74&)zX12 zXZIN%5$R#01>aPDu9mCErGw%JC*6nIB-gl6&1G5bDyN zzzduMm8u`R7$HDuW;&>7%@2ODp^;e7qAoy1Tbl+S+wV7!q^Y4DK$JlLFO4$=eXp9N1Azl z6SH?~fY+C}GvdGuRTIvKJhvn4MvE?2C)PYoSV7Tf5mb-uO*B|zM7_oG!n5Zv!lCMr zHBU8m4D_b@QtWB`hRSW27x?Or9FTAZ#rSaWIsvZu?6F)u0*(NWaB!}~{tQhh$(Z3v z8AjiSrO~iN%f-mFaW_y&JJ~tnld8l89;Z8rAF_2~OmfDZ@IRd<;^qCM8gX$O%zH=f zSX8<~8%nuV5en`J?Fo~|kmY>%9 zF8tIJx_$+M)C|EhOFqq_ig+*Z4^DDe`iN64-DKr?bFW;SN^DKoS*Ajhdd^aoEhZ$9 zhu3Y==Oj-qFCB>ZS1IB?j9aWFqz5g~ZI@6f?f~6cZEUJ}_YAJ^jXD=A6Q~!pEWzM>vI~?)3B!Kjt+D zzQK@EE?A#KTZo}8{U;x|6rafx5YM5DbGAlt|7yUF2tx){a8*j)C++v*wAI!J&#)x) zlxR+L)X$w_@)1{Y2p{A|>tB55mG4PY_vS?R3l+w2Fsfp&(w*Lu&s|#WKxiW<$Nj_Y z9hvg2!Nr^9`wyTT;cloc)HoQ`;7HV?ID;YKgmpPaDqBTxOf^u;MOO_S(f0jvI0qsf z>Qa4Pqs-vTR??oIG5B=gL}5?4X!Ay)rvY$oA6B9&Om4j(;o8S zp74UFo`#V;)I2&o>%-JbBa9kXRNHINkCI^ZII}?uQW) zBNMvNRFusjm_rFnjar$^Dc}r3oZdorW+?Mi4!MS}S1dt7Q5G{1H>nNOlMjt+kU|9` z<9Vr`y)FBaRVH@L} ztJifpuGC*{JzJyg`t^hR-lh+9%~a}CNwPRZgc4(RD#dtDQkWY&-u%b_|LCE@Ge=0< z)eLcV;%Qj=BMja?=VV!L>>UT{#4``<_@${+l;%F|Wl$$5?|Z(etLH78yo@em_j@?+ zSjQb7#(yjQ+IddtB??L-P%)l0?%(6vMv~BMika0WD$Q6Rmm?M@sbo>flop0^jeHuLx~cAKDltKd}W%5dwD+POO;p~+vQiU=|3}! zmSACrhr&`cggp$Wqp>nI6&AMlQm7aG zN3W@c-d(qD1@e)~xaQT*FpHh#W1iZK5tiqaqb|FEez&#n5uVjr2FJ+B+#zGK+>?Ud zoMBqUmxHcl2-{E2DW8%qT*B~Ug}3pHZZni^#YkQ`eF%#IUKXQI65lk0?;KPnFsTh; zNPxFKg<*vL6lhE32lszlD&W6S;kTvoDUXu(4~M6nGp2e!qk;+wnH^)(r;X!Iv!)Le zOCO=$C_~vwIMlg%-~ruamZ6ZqDp8v;-s^G)(v(t;{1SBGXS`72*5bC%tW8{w-a~j4SDwt zPd4&CBsFC6q(T$kc@^C5;N51)BOlbCEEE4?L0J+B4(^nW=5hN|DgtpqL7M{ux6lDM zzB$bweR%cTSDwn?g(UtA<~R4@5Cfj-nU%>%VtrI_Y|k#Mr(o-g88D=)?1}UHJi*_= zxb0obuE>`MPI03avoA(VcvVuq!MXqo6A_TNR-WzEcV2B8V~ZcexMpK`ldgGJ5HkR4 zG_EwtU!;ojMZqLjkNW*5ycL-hdR?Qn@56yl9;YC8wvm(f;Q?m8BMAp17i|=%+=-M+ zNxXfC>wRd{-Zz6w)v$5`_w>L1wZ5{tw)Nb5xj;jEj~1#+@SfDjxLO=K@TIDVYYX!9 z^x~a`4|K7hQ^=qVpY2|B@5#c)1%=2+M+g#r)T`sUxB3Worm%G0Munn=U&3gxEA-?o z7?g|_i(60s{_NGu?Fb$;^zovJC5|%A%Y@E~jumn|XrDy|gZs*oK`XAPxk4WNX&jAO zM;vJJ|AW)0%*Plo%eH;SS&e_NH&A@T5!y_IEf#k(ER2#sjh(BaPajCP6ycGFUj5NG zgn26*dnL{vM|dSh9|P}py+?(|y@tH4Dn9vuXDD{imRDC~3kI*D)T8t&?rg&De1KBX zT>7SsLd^Q8r}ykd|1yECN=*}6UBy%4gBXCLxV~acQ>C$FazjB4XZ|>fs_jv;8dvnx zAdmwQq5#+%G-?MDE2a7iJg6CzA*$kLAT|nw8C@KTL&MRc_`(7h99*Gz`*P@$3LeMV zFW$d%2VMs&_zw-ekZBJ5r^+bC{g@I-rqazwsyI{Q znIOYt`=9=v3!1yUd+TNq!UJ~5eQ=(O-YwsxOT@JP1%feXR6 zq(i1nMwf~;k+<+K$c5+~C=jo6Wldzsmu1MaXvGQM|Bedk^k}!A$ve{l9GW4YGIEtO z|CaS;2~5mX&K3-E?^nJp8~Mx}>|}SzoE$ej_bYF{{RBVun!aIgIf65G*zhh*LG0BM#PXcnMp+kYM?f8 zdR)C`lU%Y}yH($lG#-iwPVUO8tmfg-1M^x#k zcG+2qsK5}I_Ls7ZZGv)B&>Yw~-D#}a#F2e4tisdY8b-~BRd+^J%uQ85kT=?Kw)t3FKaopOGff2KeGjD3dPbA}uSV+V{IJfwEz0-~{qDypn0H1^R3 zvM1R>amS0gD@qBRRreTuVr|;P$8}D|Wws#h?9jAa@~Wv@dTFMv2)CP5!4FLt8UcA| z5q1Pr1bkIw?|@M$OhN1W;X8&2!HRqLu<|Lx`^;ozv)I!oB6e>lM!e@1^g+f)ci8KY zL-1d`g{0?4wk{UR#62_MD&RYUK{aa)O3cM9@XxSAr)h}@%AXT~nc}B?+(PPi8@7iN z%LnuB`a0KuEEi5O{E}Xwb9d?ZVSHP-T=`GBX@m+#XG<@)g)v)V#w}6V4|?rp^n^NZ zsT}AQEK8nn><6i*PFj`tB<}=;KzzXM1PKX6_L8ct0|+K2@kCaL+4-1))SH3gX%szU&$8q=gSSpu4zdzrS%yDhnv7S8Ssb49gBjqc zVtIR#ccb2aNdi!^^H^8xVgeLf+Oo_6Nt3`ACW=#{7B9FXf?3O|$1%_{#4~eUC*HS5 zXKDb3p?CW^HNd!0NJVxTp|_4T1N?k!`uDHK18 zr^NJ`%_8Fb30urm)z^45e3({ASR8%wO&XurcA7IyZ9QE))qc8&4u6hVu9S!7CPEjqm9dOWR22!TVivL7!Dc)W zpKwjI7 z=fxVO#aqMnfD|GGLd>CAp^WSnJEy1ZRtLck(I|u+)2?kb2npHfy@#Q`cPuV(EXdg< zVTv1oYuh#qfQSGQQl~9c_r?szat(Ng_aD%MxjBd1zA}J@9Kv6{al=!IAyrLx=q3#5v8qBlwR2ZLi z*eK8eWp!0T_lslG>M9a8o&i&IiIeX*QxdQh$0_)MGFJqeSR zaHh)u<-7>3Pn$gBKvy^T>pk6dknKDZV|eNSy?I| zExd{-)x$(`O-5P+8R6gUXba~i1iLt+3r-);tUQ+V%Lp3Sr-p5WYomkO=^3I>4ZHv_ zco*d-xW|S3BakrWsUCGz*#zlJlpoEiN zJIc6?Avs(qpzV!UFV;8ft3U3hz_D}`t?bs_p@uZLSpG?v&|L>U(Uh{N>}=e=AXH!r z|Buf#`eruuQ9cv8rjPeOan+-6_VyU@5gCROzL&TSjnMs+79i9$tSB#W>5XhRIEI)) zS87CSIz@m$SNjQh23%QNwc`Ex#RGS+pvxl}3?WQe*M6~J{W^3PKPZ=z9pU?xAJ^*J zKfGAo+I+tLB7NEtcjh8qx1{eE8OUO@L4WZ(k;olZ(6Yc~>kMJWG%>MR%v+)krBa}f z0x0|r2ay#Rj7T~hRkUSvOqSUC^W9nz|9KM07ti2vxTpo<1SKKFL5ztcnAAdx_t&Mc z2Lnke0l=q#gGP-4qu}VLc}Yj0al32Fo=1>~QfOSJO-ONWhA<02R)QcUO#wq63~s)LroE&#p6&N@RgLx_Ev*JJUz9?W=W=oB}5%%e`@@MP2dpldo!r%2Ck$d`XZ3rfk;dRuR{LdUV{c{W1)r{TL=CaF%KW=~uJ#7cv0;!h#VZJLv@4Lm_$%$DhZ z&frVxgx7ef}4-wC2N80C6oSSeuLIE zpD?*rl4vI8|3EA-)qQ(-%ozgkgLo-CX zpx&<~NHt373kQHKrdDxC;$spB^qxFAlUkwvh^_?i{*#ZiZFobnmvD^h6`Z7;v@LsW zu$N%}z;0x4<`ongqb4JahFT7e#CLDu1cmTevkhmYv=) z-h;#q%-mtJUR_Z!*;0t*z~+z_RG`1)nZz4uR4zA0a-FISu&Sjf8&|V*r|h|A{_$J0 zEVbH+6={-W4ccf;bK}**ovO*Xbt|4yt|~-+LNsXnkF$EzfU&1V{!kvc~IDZY_d<#KaF%Sy|uM5JlJ!kBRRS@G;(?X(OWXpu8_Ve7W-XtsQwkldorL z+Robly;|Q{dlo)5K2IZsu!)QoB*`{V_+8%~cXO7Wt%GoIP1=WsQQpz`0WA(J_w#5Q zD~#mM`Ntojhg)9uSl+-BH;aJm;>n##nY91<1=x%?Qf3>fl#^N~U46o_o7HN^A66N*7jDJ;za}+<{Xw&3ru|GN$in2}otyvL&3D$O z?)qpLk($7~#U@7bj`aO9R$lg5RIS+0E2yu<~?z%XK!XxTv#LJJABpUSChU5b8 zM);n?JBp7@Ru&dkx(JBfgYPhQzxS*koi^}5xbg6bw>XJR#-F4gxD=<`A1*kjevxR5 zw*sEn?Ru_OjK~JxNS46PXuP-3W)IgeAoJjiyKu^|h^;o>+wBf3p-V&TvmBC8LXgRE z?i7*hF)_4%Ao{%XRtZlwCTt)^9W}AAsG1UFuon(-*o3MJ{%QR&!h3SQ;iYyY?+HTW zgV#3HR1u=o06#Aq2)R8Ri?p|Z9P|zIGSH_PQP@sSOca^(L01u?`DonjE>Ky;gc#?4 zfVp2-*y~5U(iry|ZhoMizn+XnXOFAZ^Yilxuj}Fs-M6FuS*1TXu3Dn6qLS*KzN;*d zBtgg_Rg9^hUZtg-pQ6{20%_&e+&VVg%YCtH zOeYbEI%;GE0xr@UjmMiDAKj+78(id;gB3Thfb$~Kr5rNSH$rfiZBj3-X{ z>7QPpGOfv7V#*Sh*?FcyQ{=jYs%_mCqo)+ErifM32xmU=>e^cR1cKJ;-p)oSBW6ii zEOliOi$G?|S6(6AioApyCs{#BIYJyt1Pz$1Py*Fni(KWkH3z5u+>TD(tj!jw@(u0! zHX+MnCf?0R`{T*Drb|<h~%udP1{_0A(e<-HZlJaGE-d52u#vWT3YgwMO2dCNjb?SetIE^O-+-Kn15a3(W=|q zrU^%rDPum-=vrFw#3IYmAvS(cySW5iq!hXJaxJzBs8EM{hG5dnsaE1sQG!8LjR071 z9=0MlO5Oe9A|ywA-lC9& zLtMxx58B7=i|9@L=cRq>`|A6@y%>)0A3)r{Q&}o4Tp4yf1M+Xr*LToVWAL_dikP>j zd?>IP|E4ilThB4H(se2c>npFGts_XnEFGbiyR!VMU}j3NK{1s9f}|TK#Wu#RPJglh z>%>>M^kV^i6m;`pPS2-d(j|aGyehPn#M(-ELr0%o9~jKlY}s|*VO`(eZ&_Rpsnv{W zy4>m&3aIu*%C3LXtgpcJr*4MI@As$Ixnxx{f@_gh=N;lT%BiXDJ4rRK!{MBr{{#3U z%I0i#OXrcOiDW66esF*KC5G;){|SDHH-`>xijSg?k-$^Y&rnB)c)es47aM)L8KZk)XS4o>Iu$m>@U*R_#Z;`-;8*8Q29Ev?Tv zs?RH|>yTy$>v5rgWN)Of{wKl0zun%~_a<(JsQ$YX>wJ>B4&YiO^*Kj)oq~F@_m>vb z=j;0)Ku%YTsPfy%=`of5DW@kc8~vx=AG$eoa8u-TA0vVI?PsW*9H>QVYqr#$Dr@ARRQipR-|>1?dvMgi<0^9~-LE9X zdoA63Nj^1kv&H#5`qLco(9u{Y= z*XyI_`NV#YF0V!Q&okERJOE^l8$%H{ z<#>?7O(6QGa`m9#CCiTBIox}4w?yvv9aQ_*abkG+a&KkEIe|s4b~+%0>1P731Y{=f z*A0>XPfzja_a!7BsrPyH>>e_c5{$hcr@g#BnIx~1i*!*WA>n+z&(?7v?Qo#;Zg`Pb4Fb`91%+S>qex<~dW6_HaEB)tMQY zEBpG0eYQl-aa}1{(vvpA86c3X0RR&Nccn5yri*h2 ze{(Zp0^cX(KYAJCk(1O{Aur-d(5~Cj>Pfr#mX8*Icm{kuq1QOW`A=(@x@^G)>)_kG(L5uRe?Yb*E;r%)-`mWKf6|-tR5n`0rt{hwx#`R5ku#&`pYLEW)43%bYB_gpw)JJZ!Wg zG(T=fc986hgrdzxP_QPHbWv~0;-lw~VjmatZS-2KPy-rCDK=*ktnHnOsv zzXVme&dftpw(uM@Ws6QEDOX@7MY)nw2+Eb2o1VDObx!#fNT&yOHj`iZ#dA?s(9mVc zYwgFC-Sw9%FV=R~H-DIe#=`Q~MrgrUER=zAz%A#9cdAYW;G6zZerLT=3-B8MkhfC0;->-Qn z(knj)J$j`lQlnpHCN27fr%<9_%%?*uduNCYUX|3q^wBA=L~V2HdZN^OFlX3>y^>c` z9eRMKs}R!#p;t*K-Vl|dNCCPGE};$dYJXl`UK+oXbb5Z5uTM!~SIE2(6a4;8(aa@_ zB`E0zY3e+*{-@B99F{XxW!_+a*Y}Woa=3!R%kTbmsjITP=G0cVcnX%s`n-a*0v_dC zkgU0bmfME`r@qQNue#`W?-kWF9s-i;nsioJTqx42Z~Vf{5akBZoEw)s=LfeiqJl}% zmy^@;#%!u~_|)^LJsd@hezo%BTHWiEiUaYpi$Hc#IR}Z(qeVRVB=0P0*!e&x(|46c znKbphA4_%;v&Rv5H ztY}e1bF3aD<8kqV;`S_uGZJu6R~Xi3ca0MUB!quixkXpaXAOs&MtDMQu}+lnXs=Ol zvCATt@T;UC5^T0Vr8g$o_W}})Ta@UR|o!D)TBG#~qs_@=CdzCh>mqPC0>B(UdSxdNZpzM%>lHvg!kA zH%|XOgk6K2>9VdA$|33s1R+{Vs{hw=h63#R?%K|e>#J)sPEcOStDT=bK+{i8>4K1P z(}_3awk#~~j~_HihH zq{pF&bklk8?W5@w!xD4T3JX7hpWcLm%-S!ZIbRs2s z*?8M#UexTLp7wjyIgcF`bR(^Q9Z_mK`0Ec~ETz(G_z38wF*to#l z!q@1$-R=b-v_W*B*NW2#a(FiywmD;_xe{7G8+Fi7xvYt}P=Ya4(2w;IuQm7jqi8&A zAC0^0PG2s+nrqaRC|W;?Iv5jPL2cm1wj0rV+~jWcd!-S;oHu$HdOv#GZlB$am~+~A zkCLbTcWqwpZnprTGeV0ftbM4M7y$iV_dN{F?=g_ksNIu(0uuV5Xf%jE5~#d(3phj| z^2>M*6yv~+T{Aw^8?=d3H+F6DfMop+_j2FWkNW)*uCoq0yx2R87KiPT+&}N(1LAcD zGYPb#+k-);)dI?K8Mue`y8TA0(>vC=;@sagcv=F&+oPq(v?1^pYjnfWDqSs>Id+qaXr-u*RNmhV& z0q1Z$iq6~7+g|^i5WvpP`*^o>&>w?NggQxVozpW8fp4o45qE`(+DAv7W(RXX%GmAS z6*$C5j4wk4?2~Ptg#8~F9G^soq#3RbJ9b%e;~vI7WY-kCY=%Y9M<8?&lF$(d4ik<9RzKhri`Uz7 z^cz}eMezSB4XeNGFTQD%|GiTFXZ>gMaj*OrJ}i5uR#~d2TwrZs!9NY6==7% zUnH9Zc*&97MiaVh?>4)D-J|#c#;;!Y?DQyzzBREuh_O9N0)8)}oZLZe zi>D}hy0ZIyeP!pxkI0tq-K|$Ut7~@{L#S)VR12yIvV!a`&bqzT3NzJb$@@k z20-^q)ic%D(*N4dXlnd2o?$$05CNFLuVZil>}>C&?XBJQ*Mf{zU+@&;Br%9W^_OJ7 zxOS3hHNRVeNX~oon|uzz@)qvM52A)Def+Ebf*CYhMD-9Fik7Bh-|M!`N{=3U-^xIK zsR_RzUfz88_%pC`r&!gS2E`Bi%f9Fu{q|e*RnP>Q~b z1rquWv^qyeSj)1Riv(AYjZX!Z@2ZGvQtgewzVCnc)v~HmqsLDo<>MI@6{M>7N)@sP6ru_`M@4vATbE)Yy_~tpMkOCX`eKULyF0!5f z_S{TXWFp(uagTc%cS^%^J?N8oYc2pf2%NI<|AW)0tkR+kWnsb2gFfTVbHT;t*5(>; zA8AsJ+e)i_)EIY1bxp#Kx`D0u6!Lq7H`KYiwlCUElUs2xy~F^pmtHHm7v%A1`Lng> zyS4H&xkj_PwfTJgMg9AQ1+)+6+y3FdhBf&fxnHkp3uZ&^ka0ea;0ye8>*?QjxwpDo zIjG-}_8)Up+`u}$F(ZZCj+QIYjtY|8<`G||-5WxfRmN9*#Ty)r?x5Xhy$5^Jxlc`o*gGIQ$nr$pY9uj3Z!!kSO~kJ?W4N4Dw516%M3N z_bbu%pnZl#8R=-At?xim{t2=o1?d(9$rt=n)wXk%S-(&MfNsCEAbY3jme8GPbzxy+FG#lF5M9UdntubcA6~8?^f&&u zwo`wJfHiWOMQ|I;yAXOgvydEHKgJh1wD;oo6czs#6+kjLV}LFoGwc@nxM?>=qoyW2ZkduywETRStymr*kBK+_;T!-#*}+F03~J)Oy7dB>Wl z{}~1vV|xz=?KRzmQd_Q10;XKvp(Y#p3}ZFeo<7j9P~K4nwSV^^CLPdR*uQLcG`V=b zVNZnf*%2Vuvk;zczVW-#R~xRsYVk+ znmlA&yT{+uKljvDUmrH!wMGBpB__%kdwyIgDh6#97UtH5Hlbh>rELO2A|8*mD@`d* zO(&E$!O+Ck9zuq}y}q&wdpq^!Vfp2S+h0V*-S5{nHlXEv(e5FtB&~@sC20G!NbbN2 zEQ%d58j4|9I;A1Tn`78uV6s+}k5M0*BUW4OpPs?EJBa$@(HShMXM=ug+*IJUFs!A< zSWd+zVnUCPk6{o+ZLb7WO3-$iDed-;sULzpvwhJSj%fImYPF*V;~{fqhjnAi4$_9` zOK)V77G%gUKRU`G3d)L!j|`6@t?35{r-SWfAeH-~*oHqW60Ygs>8#>I>XWh<7Rsp;uiXWE0E)@T_@DXP6 zlTPzQAYj%p<)c9Z3S7_}#tTwG9A4;#pLK>}KTx8?YJww(C~>zEtY37Z%1Xs_`V;HIW|!)o%M&E3)o9JLIH=e zF#99Xne1FHt)yZhrMDj!X|G!=EtD)}Ndl&GdjQ)bJpdZ;iol;CZ2$Pv95mnwGlb(n z7w#3q=zpT>csQscVtVzAHI6C-N%cByhri3el55dw_GkUgUBLnrytI$NIU3Ph`ay_O zkf`dx2k1`%4+pVc45*@3jF7$H-Gftl-59hv7Y-N@z=NoV7F=U3yoJ*dR>UFDOqZ2^ z4^QF%^rAEu>$zDMMQ@G39w4*NMWVK(*9X#psLUYu!ZkTB2jX(}+73xBuQ*emvkSUO z^gxISMJKo3tCegHJ&r&=d=w#U_$c}kk0}^PmuZ#&_Ip{)GKXzSoO!FdE4)5f6lxqd z536F~ftnuwZ@Un#9z}zf9V_z1Y(fC_!+z_1tt3teDaeK5G9mZ6vWDY2KuxkNhv1Bp z1|dFdaK%AXcwJmBz;sr4ZB6h=z+M%ZYP2~xt`(QnYu34D46qM57ZrG(h$9HP37h>b z+Y%~Xkq7vTM-O#UASn$ zj{%NKu*Eq#D}LBs+4~;X@U~ZWR-j8Y+Y_wj;N)%zg=J*-S!5c>1MKn%{{xSc=aN+9 zf8l;2V|<+2*=RQVAPDgwJkAB-H+77NqC~e!Pl&sZ>M9CX!RNbRazC}VpV=U5NDYM-8s-m6z#<<0^UYq0ngZkeS(q2_r9 z#@}<;is^}ltvrf0`u(>YK8=VFa84-lA(H|DhC)xg*t$DxpEV$L_6HTnXn3ZkcuyB5 zoyV5m?C)29UW)FJ{!ZTmkw-P;%c{a&jYP`+b#|(V|2*N$)Pzi8x>K9`u#Of9SaM;y z1#~Iw!9Y@Mc11dBh%Ht>YwCfcCBTS?0F@Z&L<46qEblB_BEks7C6`#Nrio;Qd0SxPK*zb-Z#mc#*hmiU7FS!qt;pi}mmJKU< zMW<8GFH;;lF=XRGB}k?n=*EXC=0II+XMyKRo2ad?4fdaXxy8l+_L2jBOO=^?!G8c)k|E|+&x8Tmx zg*&7P_+DAEEI^>xIDm3LBUn%HBG4+D+5)~GvkFXt4YVp!#Zm$i-!ii z^Xb}gPYxsSe^Jyd-dW%#3T&xYIwdD%izFc9sa|gX8r>u1xTM-LDp{6LC_YTciQEu- zeYoDw9=m%Yx!r93ic*C%%comexJVvc74nNSQN>uE#<9N^C)>~NsJ0vd|S zV8YzS;W=e{DQGhNW09}vtfqL1yT&dX#vOE?mE&&fs{V0hCyhU(Y^#g@d*k4YVzvuf z&-CGgahG1MIalaqXxc>ACIv}km|pn?Sp8+ZzW_A)ab@GxTDk{@10Z8X{mi&Di3p-f z>TpVBy>jP9oNeTbi{aFVBBAl%o zE$aK4765lH3ZUp;uYvm|04BF1+ztk|jWxa~N4)~@hW&*4D*gJpcHeLcY&V+3eP;Q7 z*6CTaFaoC(;2(2{clG>wXSh1?LzbfMmI~0Wnt9s(RUpm_!KxI_^Sn zqYpok*43#GCtfDq%rmb%HQx0h35v2qm^+WLW6lK645woVgOKFxtrd7}4*IwYQe0fT z1GyOV$3vz+TOtSSBOmPlYy1zzYSEliBZ%^5Mh8(Nup)$WPFZSpCe%65!!LAtlpCZ| zV1?XImg!H*BUU_NgrPo@QmcV;e`$ZQv402t-%cANKHb=hNHYQt8V)Ib5C4`~1-|Hu zm}68E{mN@3I~f&2Vc{D8V^t+KO;ys=0Fvn41`jn+HB;oUtp_Egdq%HQjdw+~VT;x5 zhu6MMGWu@Y2h_rmqjrG*h^)b`9B>~tO_RLj)KZIHr~Bv++CZq8zh2WeCmub3p0?E` z*!GLMvI0*&I5D$PLHO&cBnif=xJ&U%^=JMMHvy_k#Zt8Y8|2Mf(Q8}i_5NbD3LpRM z98NN7RD5NwYYoZ_3{X43dB>R*_ZOQ$|TlNm_MNI`etfB;*tfOB`2V^-bvYO$>2}fzlVB<3|k5yc0Y~cFWAlhm4@I;+# zXSjUQ#Rwo`Yipa=zk5%r66nN?+u)I>((6+P}Aa|G~p= z9{ta^f3ZO1UJQ(FQVeeO?5Fvql@=D(R=?k>uht^@yJ`OJ)%0|KU{#J6Ml-*Ne+%WF zT$NEZzLY3kyx(t@SO)XE)Wl(5!0pvaw@Oc*+=BeVR`#fWqD+h12-LqcEkb!#zj%Kq z(qgMnvo}$Vppb@_*Fitp6P&HS{g&rJDxO!?Uq_EB%LmbSkz+4HUZ~?Yk2KNeJz0=$ zn}L?fP*oYTfp>GESme%sR4i6-k-&cPNb63}(D#`VSbJ`f#&;i36&Yd_#ivv?deUSW zbnNsk%6jnp^<$3hi!y$>Kx5zqN?+FlaJ?>c!(zx`|K%L6J@uiw@*?$hdvy?w)Kk6X z?TCT3co!2pA$CXl?T^m;(Q$u-=^Cmv26r3o@cH7GcwX~vbclPm(Sf!tjbcb8+0~dB zryMmpUDe9mj_%)yp8fsB_IC8w2xs$$5kOPVG<<&wA?YnblPf$Nv}wQP@f?>kDH7mH zE^dR2qVicu>u6`qG~&B`tpUtOf#kk=Or zurfrqOM2N>I2`H<6n`{q!;FZZwwt)jVoH}pI7Q=lD2OF&8SM+wt;FH=$lv_qWC#G* z+i?#Nn?Lscs(gqfkdOnk6Ev}~0)+vV^5ubai9lRPWY3lv;!dij-^dMKcPR+O9iC5q zFwz4%KT9s4xG}%5!IJqz4V^g=2dx=NXx7t2N2-fvNiD})Mv6(iDg{Co;x6b$;xa%J zADze^fJP0}b_yi9f~3k_<7R>m=(@EOhL{qb{=%{WtYB@kd=`p*j#iBH%E-oq}6jxb?Tc{q4>0 z;^(D1kDokQx+92w@q1mTjo_q@#6N#`FELZLszbUHY7w|$w?8NtC^HsEhtFx5+Al5$m zA6SdlaSIb(f?NoUM8q*u4JehdoPuFsz2k);KPfKp{o2YioE-fUCMhlh+X9@<0w|Ic zmoP@hU9TORghEBmO7VXe7SP#)#S>UCMTo%cj#ZlI1t$+9;w=Aquz=NO1Hu@o4W5DG z6{=33xNQ_nsD8n&cuwtt@MgOQ0gsI#cYC2d|!RFgeVUu*|F=?)hp`tM6l}!xh z0b!tWEm^iXtc%-Ut+2nqSdS$6lB_JKygPCb2G*f0K!&^r73UsaExv^Q?yW;KA7>_aLt!7t2$uv`+mso{NS zL>=L=y-wd$?_!q4{%JRK^Z^zuVO}~8BoM=A@5RY2T3p4pbq{eYo(~XRZnu9lIw!k$ zPPZDF%e&a6n-!G;6oT!avC2bjdBnOyQ&$cd6TvMo*xL|$W)}uQ`u9U?h3IEi7;d6t zcj?jv-x289pkf1`fGE~ELL870=MrN%J8!`^LqAFji13F~84~oPw6MMjYcbq0N=5Tk zT6p;bLV47;kz~F~3oAeUfS>qpNu#DP!oxm)%ej%cjq|tO#+`S=P{%^6W9#yQKm;8f z{GE701EGq~p^GA=tQ*dWu$gknLgsJQ>F{GCzzpF~s5%%GTW?2jKfI^jU-1bD(_bzx z)&6F}H35b>p&f`>!@8VONAbplIf7E3{6>ogzM$frT6!%7YZ4_2W+z)%L=tgwG|%+1 zU7F7E8{~7!*(h^T^|tlheEJSt3Q(<0G&yvcNCfzLJqNliAAbq z)LF_$ofDknOX83j=z)Yufl8#OfFt(ng011yk(dWmQ~P{)fGOZEh+AYhf}52Ru5qJY zAnifmq6jZ&kWcqzKRyd?rjFDe#4a&b9h6ctZ*29Bx}7E+12jgekw3W|Sj;E}6Y9Fg z=^+H}{@6xGeH=klUoI`|;qDH;?n&+LS&2svy}#7y(JeyuI%t-tS~6{s{vh76VqnSr$#tJZy z46W(H*YJ)G7zHm#PJ@PsUo~-TFoKSvz$rV8*2y=6PJ-f{EkpPq1%+A=S6y?S&n-}5 z>$lRF*-l(9dGvn`79ltN5Sy}ik5&weIxA+H>PFc1F@PTS`emc0mT$BGmuqapm=nu8 z#hXbt3iv0BC%(Nr%4>%;Z62*G(b4b`Y6jW1dq{^oK@F6jEveA(L5}+0dGKUnFJ~za zWX`_P$cVT-3r&=`a(utwN{B0C4y$R-xsqJ~?}G!T*)? z*6Gu&*Hk;=3aJcR4`re_ggTI!p);nazY5UpGkT$w19ML}BO|YGuJ4tdCh7J<9L)>b zj`#;GgUxzld_kj~szJ;T2)%%^2a)mn?eeSFauJPuP$Fz%W*Mj2p2+Dtz%>>d7^zf* z$1Yql0R;4?Zp7kj(1zb*UhiX|zAm9Z>k`70Vt1IrSaJ+_nkbb{M8S5q@t%%%qFZ(V zvyw{-62Q%hHMP<~k**57LltCjcQ3vseU#hK=_@Gps_;8hIIsY5Po={(l7?t=a)5-_ zG)J!Cy?uy5#w7sK>Asl-P%?4=gtufJ$0W?N#RXa)W}KQ6R1!$e>h*rQ8+|$M&q-&zE!s+t$4k!9BdO(&ND}e_NQ_Cll50@A zYtQ^%;Af6LaDDo<`8!AT7dvY>$;Z^j-#MzUCF@H<4gk-S03;y?fQ-Zq|4G${YBdqxxy%qTW1h!J#j~D_wF9VA$z2WU1dFmzV<($^;lm%Lit2e!68!Ad%V2yaDF+ZZpCUjlY~9qzzzl;cCjm#v%Fh9wXZ-qU;~1MIM&~0i z%*g?AWyc4zvXiT7{rSeqi(v7t>}XmJFuQv@>jBy&AqRk+l}&^K_J^S^u_Enb-|TDl7jI;Kz{gr#BFm$k{|=&^&<_JG1wGUJkIU@av8F#_DRGswv{om)UZF zfI&s#X1x5`3N>_Ph17&RHO>PAhi}&5inX_^CGo zaduLZw(K=ETc;mE9nU1tImn-iY3&DA>=|GG+@tV+-93V8V zlDDcPAqM~+F#RF(caG{WS6-~I))|M$>w`ok;Tx=QOk#3^C4_zt3mB{uk3 zWv|lgd2&&Ny*lq+1vn0&KAuwJK>k(0^Rn-Z7PLsdM!>N`BtWiB3?r*Zjz&Z|+U+;r z1{@(y%>nA!?mu3>+FK7KRGXFq%;w9rXY07U5-&|n$pKS zY*c064OVPceh%<~hOAB(2Dya}2^@NATpq?dhTd$=E}f@o(PY%dSB+0Ed1oLL}81C-F+7!cG4q;Q@hwTXqU z($FNjPBrEi%+a77RdU_<>6ZYfy-A_SLiMt90EY^93}Q-l)l1F~%Ky&IgOz2qFgBw_$`HSno{lW01h^8sfU75=?bBd?0a4RMg zyve%^*x?DNigC##fQ7e3I>ZMhF4KfQc$E;J9e9_U19Ybc=jhI;K48avj071u0P(Odr+liy$ipP`w132{e(F11N4;$>b-uNk2UYI3WW%a;BuiFee8{Yx~yV zf7sIc14N8wr+u_eE|sGxJu+tMauQj2fm&Z?kNF5h>w-AHN#4|`BdSlJ^Yhbl^bRM7 zEY9d9=KvP4QGa%Vj7tGD?^3rBEnIt?4L(&YM`PF|M7x+g*ZArA!13mTC?7$)iNg|r zCUSFt9^$b-s6mr3z2qFgrr8>jc{#y`76gCB2sq5m0UDw$-U3gtY%e)KFkTt;J7|D0 zIR`MeO8J7hJ>?0(t$HW7ul6xi4MxQgi1yd+TLp=WTwg}}uAGV*K z16&p;o0bENQ?qzvjU!61WG0o#(F`ORNW4bP695l$@_+>Qnglb<$^%sTnbE;Ko&)5o z=vfHGq~+*K7TS}-{iHHEn%Q_(Uw!@Br$|l70m9d8QHD(d%*xLJ-VHL*Pd_~eIGB5r z9W+TffTZj`30qgPg?Y+frTO#j%oerCRT`lKW?~Lf<1%Hg(u^9oX0{X;%hyBtDVns}DQ_EhVS!d;#)n-ueG7YNTV`4LL_7#9z)5xq={BoCR z&X_?aHsj@A27I8Xo7hOI)Mc7-Mv;ll1SN7b5m-o)&{LT?04L2PN!VHWIlw2)B}wpE z`8mL6T1=8{Oe~b6A#5d{(I#^*oKPfJBY_eef1rwxOHBGH7m@Jk-6X;{{i z_^Ve+@Ugne|HzQ>VF!v&^anbG?27_ZvaPfJj3R+QeV($OpF66FuQ~q8C1vSz=qH>| zYiUDak@Id=D)c~E$*Q!`oGc9sa#T@5Ph$MAe!uus?_GS*3m1RH6W0EH^blX3KPrBi z?JealiL42V0p!^E6VFk5*k=toda8pMeq|kLkeoV&AkFdRciTmz6W*<_DQblKTB^=HCdibT)eiC><@4!@|Uur>)6HP#P&Iy5Kt z8)Svtp9vw$c11`YR@IKrERf`X$Wn#2Uj{r8KU2!f1htbhXBAUTYF3WXer9FG>PpSc zqJGohB+50}6R6kZIy@xRRcO|uVpBScl1)~Mnoasdik_LT$5r$r3Bpmf0g=&^#5tYxyj6#$?`FFrbc_@uQ&xi!Ve*&TaVwO5JEygk^YM`PHUcB8eN(uacs|$bH z02BsfB0`3y5(xekY=nA=JjCERvs$-}W!08|IT|SEcJxf*a3B;B#Q}}KQRbK?NCnlhUoV%QhLdue}l=eNUHE{uPL zMGPmi_)5B*{YUrMC25L?6W$?1no(0JCmCx4Lmq-qvtrf!UhDgL=b}75 z!%M8)?jhcr)Te+D;RnwpGEz6fY2z&+i5tprlZ`|8kKvs>eXV(b>jO9xD6=er$BCed zh=@xi@D&M@X5p3@bg6)dc#$bqV@y*i59Vj<3hQ%>uQZg9r({v)Uk1qiVl}I!YH6QA zCczJdn=uZijfx}z^vsXa!o{$IP&ZfBR1<^`nTZrRB<&(%DR5=p6NcZN z1cgFu?|%;w?U><}7?6vIGw~qJqr0-P^DSdUQ^K~#nB@#{J?M{*PbBgx-@cRx!HCO_ zQ0)77sifIBL&#Hxfr=j|)^MXA{<-^o{YQi@N7!ZasJIIV#txwEXmhLnVq@!RefQPV z-93puCOgFT%IXh%TegH(pyf+nP%yxdY`!#kZ~f&OqM|bHLeYI|)(%376n9?gk3J7- z_$_~dDESvhFV7nU6-e^KYud1h<~WL(4FbdQY#N6=v(e)G5T_Y61Q`W|Q#rx=j3y$P z2}OuVT490>vU}oUHx_Va<*URb7S~cxL@%=_HubhdCkn6&$d}JM4ali#;!_bon$W_}}LS z7u0be@yIZ4;T(46Mp{ON3}8WH(`O+D7*vXZzH1CS(2}$fvFz={A7@N$zT}_rwf(hD~-Z=v*sNul12B$&BbWq9CNig|A{eSk}wJWY8$@lJe zXSvq%A+`}Vpyndv+ca*vUE(4!jezDNOOGVu0t%=RRN*SnWh{O7^ZQ3+=FVLgge=)T zGiQ3uSk&IRGb1A-A|oOrBPw60JA_oqis`kfRa&UkMjNNjOB9QiZnIy+O^lJp&I@CY z72h~)nVOG;UCZ-H)17M3tH`_U`mxZer2(|^0B`ICxwp^RxH`yOENCwbFimHC^QLhJ@9zfan#0ZWQkFG_C}gH=?7?X!9IhMo>68Qi7gP}6Yds=c{Wd_6lq`;~2^ z+AGYf6*{Fdp1=p$mLhv>{MR7*O(cf>brpY2{V~{EsiVRqew*u6v zf-mwyiO3`3L7FN=Sdl@h)!}+78Yk4;p)N1A0+kw@e$>VlBYGrBi4}qt#aPNwHImXq zWd!|c+bL<`JLkpR<@p7vx7*~0SJ7cEa`Q{%iMNwviRb77%&gOSVRN8VXVRX?5wC&_ zmMQv#Ue$0zwyf2UPC!#T=^U*L<*R)}MQNZTP5R-fQ(G$6^{Pb^aR!x!56_wnE|4zJ zpI5)ps6Gv*uJVotP3TqV11GA^pbCr!O*q5J7Ofi2`FWhFQ8SS&lOj;69;$2}&r~qa zij7Yw_qK&JU-cHp|IXuIvpQw8L~9O}gQ=mY>Q?cYRV<`Vxjp!va%I&1vP9nFS(mj5 z62QlyJn^)(nV+C2^4((ot785eYK5m7gpFddr<}0ODM6W~2sP&9i7gu?KjJ)op1eA5 z^j;KqzWYu9oWBt18KARP!t=5H57p&vS;JU0d<7Kc#R@68J|({PCvlP_R?RWy{f&>$ zjB^06y!ntG`p1UYLvK@jtg1?Vsh=S-EpSMIJDg9Tj@gPp^-5R>%nKtJuW3L<1H@G> zAP^c>yv1pd@{CRbu^5BCJr9Zfp&J*5l@9cwRZ=>&tjIos%U)!w9Eiowjs()(%BM*N z>!{R1W0)!>MsvW(J#8}23L_j+ZPAkZKE@Gs*;PK_XLshmA!+|DRU|!pa{`l4le9tE zHL)bsLyKoR66&=m#`7~yv1}{pHh-a}9bSWAE~#oDQ>vwE-xnROk4z&B)RAD2C}CZ4+yU)A=8zA)dDc=AjlzgO?Loso0<^I|R?B|Jc#~RPN z2V+$FF8-R*LRW}5A>1=U$KEvlSY!NG8}!{lM84G?D2Egzsh*yi#?Pq*C+wIww{?nO zQ3Tu=Wll+T=Vt+ZOl%Yluax_^7_$t-B8>5IwN+C~Z>&;d_6>eZl>|1pEk&;`23wdt zn|Fa>PFcqsfIa#JU$J{bbqqgPyJV8}ZSTMZ* z{PRL?Z0aGJ?>R5G8_+$nN}ki3iSxd?dY)^WT;l9iIbZzsug{b?TwGnUNI?EX?X*TV z@VT9*V^)IabBKNH`QlvdqIRMePk;LS`R&i==4uPj*;!4V8vg0cO&BTK1gRp+dlG1i zH);#*GwYJ-C(nMJ|N7say`zXJovQjeM30g%&*x7$6;P2MO8lts&rfqcI{vL^ZC+{k zcJ06iTX^qB;R^vA2Q`QQWx=7+Bu7JZ_d1Bi1k6Frpt!!F!#x0nLxA8MAZe2?H6eLy z>^UXni(-TS2huj+ze8CWsJNz0yl>S9Xa{!r@Y-`uAK|-UBvcX*WQ$Ole9<&%vNKie z?6UJd;>eQNXePLniijCW|>HXo^Ek|7ufl?F=shn&hJXdvbX?X$_ywKUXsYrNz6u-xn>)e}}I5@#jBJg{sVg zbkVzi+VX;6JgRibZ$CytKulKV6FVuq{39Lh*gP3q{|oanXuDw|^V5QKsu&v!-|$DJ zfrkEb5n%Xp@l`y*vgc`gf=h?m3$l9P)U10m&{-An`scp5HbQ?5{=pFA`948ri2EVL|`c^Kt)s;aNiA z0#77oc@zLh87!)U!FI3C>IqP&{8d^MP9;uuz<#KPCk7eel zb7-}tq})0?2YXOuE-|D`Otvm5j;Dhs^P^BhFP8Jwkn|KjJe{QzBXSakVP~etTC*ke zNLAQ#RR@P)H&&sxaZ+hIdW0 z4=+n~+61vF9Z`>V5OTeF#>&3)SzJVIAD>W7jwDhsXg*#~26?N&Em~5@bg?YiD5~jp zk<4J#DxAaxW}k&zs3j`Ll!WhD>qYZb3oCj{%X=xmUHIan(WMRRN*Ul|dVGUha4U*C z9U1p9q)zFA9DXMKdNTQOAF_H{zE_l`B^}M;(^x`$of56|_B=gkoFOou->xO~J5yP| ztSHq8IJ9jxDO7L$SF%Y`^OpVBnL>Zs&$+@i@Z;K%RNi9=H0`N$anM5zu4vrqs(3c( zqXm%1CZ0__o210yqOIKy6*M=`5KUL)J{r(k^Z7pXxds^65y^C&SFO?JBSx z`1FEx;f#*4?3P8JnKq|TtlAh=Rc~ZijN0^E8yaSSRxN|&sbcv$%ix_XpJ$gw()Q1! z6ZKn5DmZ1Y{wz%}km#hIOg?}6YL?>y`ncV?I3jN>5y;9{eOI^xpGyao2VD>}%`q9X&W;dNVCC za~H@a0pgav;CHvfaC#1eJVCo6=#WQY08Mhb;8UFS&DX)gh@ejuGsV36(IgYHt<&dm znzu>`rp*smKU-LjqQCr?ve_zIE5%XoK#pqNMH3-_!f8JNTTL`ihj#0!4^S+JKkSn> z$58xHK^L{d@D^yKTaIb-+Ukr3MYo4+HUF-TQJRR*9{G{50+H{{*A0$akkx{P8eD$9 zW}!C-_kAnlwZF5ux4pD79nLQ31aKWvbOR1n@OnMK`)k$oxCZXml zPjxu8XtjU+A#YP1SfL}}bKT(T5utUc<|V)`(n3d6ExWk7>@CuXi+Me_A4e)MsQ;zT ziKx>`>3@!kWBj4!l)OaNc*#(`1S7YK^>~sg2_%sDPuJCFJt>c2L(%#m4IExSpZ$z( zCSgytw@7=56kP1_dhL{n8Wi^fEOFJywnpLfizAoi&7GOvB_5&an!3U$w)0kD_E<+Q zc1Y%$V)63=R?%m{vO7k3tk&i&LQ z2&+5~ABw8uSh>e~UgsPJC!(73C#{tsGe$@p52IEfA=s{QIBflj+s`JPVvjiyVyyCz zMAMBC!*vp!!deL!EAGua_F7*gcm-(WyfV+x^fD!-0ZNil!tBXfXG~F zOUQeyJC3-8lw11G-0iSE%$`C&_nY{Iu>Q=Fa3F$}$;;bw_F00>r?@y#eqaPEis0p6cWP#2j z&@e16CSBdLiDPUJ%urw4nzZ3=Kl@S=|Ms)D{?D`9p=2>1!+~^fv6caCIScfmlr^*t z`OegCRD5y7mv42zVMiPj;)*z|OWSJi{R?3-IPj+RokVNez971VnFRxV0U?_?VaWM~ zkR=jcSa^>QG#vex%ayXhMo;mvf}z#kU%F*6ecqLBhJ(J0~d1qbVi z?#7CRV&bt(%cnohJ%2VeH)nt7$L+b>;}gX*u7toRgI~*LIwSVh?jUlliM$K0ce(Ui$p)TbshIqK-S9 z&=fNmP+zm?9GF}bT>>Wsei(Rz0|r>Kap#`?q+xHrrB3o&N+-WXL>mMpPxj4P=qWh; zaec4vD$!@KV z%UnC?fZoDyjpbTUb)-ODv00pQ)|81kdW>WwCI7w<{xnePQ4^HdO5?>2{NE~OzK^5j zKzYOXrXLP}>u{K=yG{A#OX}d6Cvsra9Jv9P0f|*e;&3@2qrZ)<`+@V-pNq@XM?n!2 zw5opC2Z|K7#0Qy8u`1i)mi|AF>9S|(i?t1+Ue?#0LbN!j$<>8o^w0=HD73ac$Q9G{ zZrJQA?Sn>2yNCZ+UfbT^S{x65Bxu6#YoPIw=X~tc&#qTo3DyDcrEdwAERUycW1x71Z(!RN08^D1cMZ&_+oLQHW&W} zBzMI&baBZ3CZB^;JHN0xrrnt! zBCeu}G;<)hlcq6d)ZZnP`W1k* z&F#io^pExJjkS&Y3;p1tPR5Y)leVI3W#7)sWYEeXz=hM3v0}K|{b_o>i=G|`cm(}k z=MwIt7o#E>FugAmdcPbG6!E2;8hYWl=DGb5A4j}@IUfFsFUm#uayC-7V{kXd@p0hJD^SbhxPV~!v(*#7?E z-ub{DHms|Db{t3o~?H}eoKdANI z{?KPM{qQ!jt6sQ~_4a$_TVwfi9peX!yUd?RvHWtNY1lFQnun*Uxv!Kr^1st7?Q{9- z@^@-d?zrVJLwf0NR^35UZ&4HTzT&U+T3^M7-XwogX_jNBY??n!&BM0nt-_D=GVELa zGW_tDw(Vz9UtC-xEQc5+GkP=eYt)479qSjq?Clm=JR_%93{mu0oxj;{ZDg`quZ`Nd z&SI_A+^ZH2w=?dx&8vSB67?Yh_*ZRfjGs=?C%9=_5f5`069H_R;pWO>JN#3OC|x=L z{vn zleuG>he??=PqZ0w!MoxOwIcG-<{#TC$v!}vh|i%3^ccCAQ<}S*)+k-wd+?}O+30#;In5go$6M{zqiE#oxT+sL2(fBUL z@cZ7tUF45QU=BI_GT}eD%tK%Ii0Hg0iSYeSTxbEzU}g>8m!b%J#`<+8^0C zx9Jenz#936BMPe`JHIsgBE+H8j)$hVq4;#(0NXY z1&$5upq&3k!rc#toU^t4#yO=pPh9yi_OwS_9y-6k*-P2f#d$k{R73x2NIyjkyK-4k zX=@8L9>&pz7yiUi>!)cU%F0<5iIE*Em+3^O4`t_L>By8>w^a zh|QCL=p#-d4?V|8NDCt;o{NDzz!#yxb3Z^0DzeV)Q(_GZjtJQ_&>3`YWas*oK1%%Z zJ{;=HH+!yA_i*NprD?(74_8CLxeiJRYPUEWDR;*6#LVb#p+)erk8q?Lj&sk`VJ`W5 zxa+pSRjj!=^KYB;?zD-^2&~e9uA{Tj@qdI`YJp7oix)bN?EbVZ5J0jPK2*HiZU?OA zjZ0L@a1q`C^6SD!#m_P3m|zH^d|6L}l$+NIst?Du=&ib23@qI4BEnv`K{>OvSan4a z*rmx3L;&@0Y@DFD&pF{ljC1k;0}CHxHliDjHAzRaP#I0Bt7f=!tnP4uRJx;1;dTvX1TJ@NL7=Irh1$J1s7InmgKyvN0LniRVZA+=alQYI=}kabbr zee~$Y8&BDI*q&2;TiI^1S2x*d)ck+uCSxm~v^@(HV3W9N+VgZIzarmIka?!lTNVS+ z9Kst{ItdQW_tEMt{kCU2&;v`M7pT-iA0&Vx<0M%elSut6NrK}{wCLTIb~v%h{s`~d zoUCPC{$W*gj2SP@%UbqEW^al0(@Zk(DxGG}ukSf)IJ|e8>p87!%EE?DE)8CT?tFBP zKkp~n7f6fu=lM%Ih&ykU0p;2(e++@XJecTDL$hz$R1S|%L{M1zzgl9xce^eT*vu~I zf17OWW8K{&sT-j38+Y!p06#||~F%rG23zg4c#@&|) zSIhl#KZPQunkaT)gs$d(;bJnTI4n~aP8Bh~A>gfh0zS)n>AoaHlFXmt6s5QLc~bwF zu8l=@Wq-_Yp*c%hgHV(}od4x#B?a2p+~tgU$sAz1OXczNeqO~gu$iz0v9+Di?E?RG zUH$A*M_aSKQ%=C>q`;kX@uq9%W0Tm4^MCovx7>XA%U`~;|DxdX_g}bbf!=EWG)lq~3;v_}t90P&A2|Z31?6;FJ0$_JT zu1_MJ+HVR)CvdG2g~j$}t!Z5rON`|tYj*QOh>k}OqruiXVwDIp8BR)q!V-$eZV(~d zIpN-(;0pW$yxbJ03zAS>wa%2?O+qwVhH2|t8duPJ_(UtCl}t#chn@`11cJeCh_?%$ z0#Dg^q=5)S+!VC+x0eB`p#+dRWJO%Hf$=V+6o6NjIr0mgA77mb8FFy^xVHOXb8ok( zZ#*eD<00?U?vwA6GTkJVnL(jcWi2{}y18OYE+JdNhb!Al5BQ>fZ*6^T_lc0Ty0*Kq zva?gHZf+Ayw^iTXU0d2)r_RLI-Zpn^R?zRXAuuxl7`;|DedXwoe}rr3l2Lr{1muKR z6Ei_kb(+LJ$yPpu&)-kF^wF^EvF6Rl)(+d>!Sdx=+T40V_yo|dDZ>){=_ByHxC*gD zmb3O*2dRW|s|;(WmzNg{b91j=y_%(x!fdB|G6&0uU3zmT7iY7lm*@DDjP*JPIymD) zB*80$g2*TwoQ>ik7b9A~OzdKC`&r24h zL52d|d+9BXsg3}9*{$N%Es|4NhNtzld%K&P>mg1{?|!tCKT>A2xB0RqSrFgG-#&=@l%PX7V8E&Ed5{c3Ic|jHLYS@D za}^6w&RG3RX1Ge-&}+LRF&NU&%-su;kHy`U`H#Ci&Z}(vP*Uzr1fEVYvu`mklTZFg3PvK-Sp)^2YaemS-etAMVV= zP+B$^Q>e@@%^({O?W2u{`U1}Y;+AZ1G*ZSqDGB;sbt;&9`vv@`$>bugXj4EW|Qts=JkCH?uR|w-vZlgju_NPtQ z{?f-pKyjT@cUX1YhwKRV@xhK&Ub5CAx~;n#>*<5o$UpJV!T?bPEe#dvJA&|e*Z;eoI2jNn9Q3V-sq@|dRrJ?Mb zP$o+4A3_;;g#}c_DIYyMxOL5VQ2rR{wLy?NynsqO3A{?3DH~(h3k|sBWTO$K5V_eP)ko@HqAe6vVAAz%YgXS*C9cA6uXkk#i-;2EU0jIy zl8$A?u@WR@nIgd+kN*f^80f_`i`A#BBJK%Vhut zR3FpOm2qVW`Z+w~LYMD=)xl!9v1UyZ0;0~XHy+I>pT{vvn35(dl*vTgs!nHAUd&o zr8BQ&XI=T9c}E$H$0!(KBQbdqV8;I-$4CTCZ6_9Na0*};JewLX-ruiKpQvvt!}gh2Ib5w3`R+ZZ5(po z_mc`}ve=}zTdz1&eE0yiv@82=pKoaG)tPL(VJ|fBBd{)QMpUeX^pbTh2vBrJf?eQ*PtIcJTUyhptO(ni$Xz2v)9z}GpJ(3De=}CW*-AdiWA=pwq=Wf z_k7XdM{eq|C@5u0VSA|*Ph_-A9y+U~2YsD2qG!qsGI~Xf=@0%CYfeaXkAmqz6k`P<~k{y1h7F z`Khnhw3Ny-yXSZWrUMw;v$P zhZ}gQ!B=HBm?tcDZ5EI3cE(Toy)VC@5d^K$1AV`)^l36(fI426(`nQ9`Fcre(h{>c1LVn8*+2ZUD33%P6to&~(gLYOfL;*Ox4 zSF7?2T6&{Q4F}w06aVa+fJv-2>ZQinzG{Ey7=wlRoO}ZagRgUx9i8FxZcF=34ou8c zd&nIhJNHVCF@HSdYgjEPjTV|Vq$jkGzHUIx+41ncaL3^%lh(RW$J!IhwgZYD0uhwxZ>z8K9K^!EQys}dF+|Ne? z-`_A9-2u05{fw*&$aOZ zL6nl<*zap3xPsf~f~qAZmV9r(^aesd$76S22;rac@Ac%Xkll1C{pp0eXdePj1Ma=tTCe4M4=1r ze}z%boE=tC6Lz$Wn%xo213L|Hl@B7x$<#|6of(z}$KmV^_Qt(e_8p8l)Eg7AbRJx2 zCJZ=5QG3Z$8&j|MbtV;Y8oon*SB@oywi&u|4iCP7GvW}4)^q^^8M_g%KTtW`usiDI z&>=j?0Ka^gb+qPuUu9iQD+yR+WQ$2n%r9ar)wL1t@@37r1X5BpM?1w6V~ONd2qm1X zL;Qm1%{i|~L>~}0roIzsK2u-rb0x&W>&Kg+)aZo2eZ86yUE_5JrF)=5= zRJpevv)}4!)#W~xj4`Mzs_NOKcdBy>ltOl2H`Q&2N1@cv#GkwHNR3JfJnThv*e2-^ zNXn-Wbqh+UjAEPIkZuR6rI&qn%<41Ulrprf16a?`LMSIBPs|(6AnZ^}JBDo?vTV@L z&dvSR=~6ORQ3jYZ>HFlQvk=CCg6dVtk@Q<1+;CxXMKE%D&)P7WsV1*<+z{X(E2u5S zd*P>-z8QoZqc@%aC#+Ei?}sr`$#o4hkBkD%i;?V(u^FP_FS+GtvoU$dyQY#(%h40> zwG4ugs?r;k_K%<5YVaLylAs%nk-=h2>*Rqi1ZorEa3H%@8T07@w+qgpcYWwe^r779 zeB{*OwrUS8K%(0zB?Hn0cxJr#gFg})Q$?y^GF{o}ItGa9CGB#pv{Jxh2ccCY46GGy@vGiG&i4dncrqG@od-mSY*F@N{}G3D z0_GFIQF@om^_8HhJRb&AlILj)iOW!pg^WG+`jL~GhroD}Nq7?X%K0fT{SKUaNzKHP z!!uTSRBoL(1jV*>7Yeg6Lu-1LO#+@2^;l;__aCu$N0rlE1gHv;Tr+4G7ShaH(nSvd zT5UoFD3@qbWs#gH*-s4{1rbv=?}`aQjn4iX4_e}c*o-XdK90{l0mqb?r}~Jfle7JB z{)-&yd!q4H@tuqQ{J1CjD%mQ?k)e|eQ|;9tDtdCRyjIc;y){RL3Ap};848nJW7p5! zt)m~J6HEp)A+>`G1a=^JADo(&9P3+!_=k5+(Rlrq>^-!pZ# z6t0DG8mUWf5})$8Ypo^ulb>ZWQcWU}DOZJJjw%cYO-VG8!XNSn26?EhtF-!G&x8wa?ehmM{-LL~N*yYKW;AS}my42G0Eu*`YUp)X6^ox-A~ zXjvUJg-fl1d4}jDgtH8S#p1x)`{7F?w(6sr+{Ob&T_ct$;@B^;eefD_#$HHsXGOUF0ll`sy|(9EIkAZ_$)NO%rDqQ$0K5H2!X6 zIGudJhWZpJv3NNhurmd09P|`J&(h}l`pVMozEr#&uCu;ubvs@xI?7=`B8el?(M!&t z@xFV21}B)ZRD0*#<;qGqJyu2NtmjaNnKZ-1-(99e!<9Bl5$*z!n9}T97`YZvsTlq8 zf^&^9FI@%j#0-tA*Sae@m#zm8)JK=>XI>^-e$LFe)}4%a<;?1|a+bXO@AtR1xLBbo z#e~Y5LDAB^X^SeyjAH9OZ@s3YrR}-(RZ}0=S7+>IGW=p!+jbC;!Y}3`2cIZ+VZBw= z>9r~u9&zf#$uk(`J%q|goRl%7^&lR#&RIRPp$xWweuqSQqwg^CzX%+^!~5!#S~YAF zZ23B1#}g1wAI13{RYew9l+hwAJKY8GT{rnag(9G#9a=$i?iVFtag1{5KfkyV(r|Fm zV=|^42^VA1y%@V6-O9`D$%CS z0_yhJANJ!17QS*V@*!uoeJaokBk42kG5O40aD*c@y^yDyS?KUYcY=zza0|NFbJOLt z4~1#}-^j%sy0m>Ck67sH4IvACfHZWP0J9(s$Hwz%2KXo@emGlOS|^g>8#e95q=yw-_t7AyS-cC6X&uwyDzD zAI(GD{>usWTE?)mHd{CJ6hvF0A>+bd*GHPr6xt?EymHnB@;ljV|2G1$Ns zO(+h^tc77=g%fqzg~(2tjO3Z^`5bRU$ZbE3F^^Q`IySt=MHCjC65{;ST7#laQ_FYcq*u_J#+hD@2Rkg_3ohOG23pL*?Yd5>aIQ=mo04H?wzV z=f9?@xg4RB4uvWoe=+{#9rNibLXfVoU=NV1RD2Q5J&~8ywlfsOc-SS6mX}eZS|#=T zaIlEMp*Xi8Xm|7u`$W5VZpjGhV3XcE!l?nxndO7s@EeYgzV;}t87kq~VS2-SV zYh81`h2;UsJNDAgA{WQ$={|ogYBTs^@pc-$e5>?RyuEdMF(2Zrb2lD{_#pORBm>Q! zb;7=)b|sqTzu?WgS?;`Ar2e~j)z@;&_+ta4m34^B4fiitBt?90 z+$W^cwIIn79ctAMYU56+x z{r2+zO!Y^%J3Jy0FB!T-2obiULhT2o$2xFl)Hi}s6mLOeMZk+nho)OQx~^lH4J2$W zkB3~Ux;i=bc<9zkZVTS1i)3&N9}nI|twL0!v?j*DeNYYE-;L`fWLg=S#l6&2CMW;& zC?}-&FjCWX^NwwqI3gy>m{KJFzqKC)5o^;Ar57-$Y)7`OxGLKt_Xf56Zc@uYnrY}bvVc9pI_VzV1PjVdj;SYiyQ6Rh8rqZ~eMPeu>a#7`IO& zW6#sC&@b~C><5GYw>S>Mr}(lwRvo!nclW`g`ug5VwEX2ykQdAD6Gq2Z!MRmbHT;_( zyDc@}*!cXP7oUyamDwDjmxM5mulV)e=iK;RVFbkS`2gl1oQ`f}n{BV{4|5Gok6Ti= zk8%!?nby*JN6!%iYI#?b($Pe2@-2nOqzyh)CYHeuvgFF~rCdyhr+D0oKP!u(cVSM! z=yMG#=bo+je%LMd-TM7-(;XZB@nea@T{IbUl6T$rjN8CY8H0D)4!}|j<$m}G`+sQk z&Ct7rc`Q#l59xmxd;XwU%J|Wm4w*71xqe&|PZ>Xx7Xt?d;qM{7;#0>|#(_RvTxIOB z{(Hq%#sLO!gI@CS@s+Xn-#f-KjuX#-J>*GpQZBVm8)rFstbc8+WrS;BCGk)a|M{un zEk_RX2gF>)vEwpVguw36mPbfCS;9fcmI^4}$1^Lk`yR)0{; z=JkO5>*6*?!S&xRcC&9He`Ne-96Aaq4r6}z7|uB6>hBcC8T;>-dmbz#cV~!~)Wwb8 z7Rwoj*mYz06UKAKo_BuVn9iZYd`w(t>@Ybje(%`MIN;7Fi|>p*{(do@aRiY~Jm*rJ z`0{HU9Tv%-R%cqkQry=6F0*k)gQq?%qzdY?j=e3W!whP|H}Hr8M>D99Eoo83z=Z zwgq!}3}x$NRyTyN2*{3oga;lkqLlsQOF(Wr0}%{HKjv?jdWYkw96(*{>2BL4xuq|g zX9OoHXp;m-7EG-v5&J@XZ25_03Aj`mX^V$a;s81!HaJbkLQTR44r%eK)1I(sd&}Gh z2#zxTXc4;##B>p=ArQlD^$EBz)ao5_1^7$~1@=6GXn?{I#ZO>MlZpr@9ks1Rhr2r5 zzoPVJiB8s0kzI6QHVmJumPUj&rGNE{D_LOgIM)O{8r+I6q1vRgbx|g%d9Dt12Vijl z-@Bd|)!2<^E)a1%*Hf6UpW2W26a+_I#6^lo_q+z?sE@2t+hAvuW%}i+MaD-uHFSSd zmX+a=Csr@2q;2J_hIFMOc$Fy}H_m#BQ3@UZty~`-TGlWaY}z8@zWkCfX?&!XlT-{W zjHh@9;uI{d1nyfb$kS^fSJuZXtEp|M_uj={#=eSe2xXJtDDor_=b-52?v({hDtyFb zLBhC-U}XY?f^@A~43MDEwIT4TO)N&|#KHk}9?V@oj!nX9giGi=h6g>}BeSq&Zg;|j5MQQrrQ0T-TjC4f8X4G zxVEvmy(l8GXWJ|P+*{iw{j;9T+Ow^D#N1b(uB@(?&lsDAHaLOR+(>MDl>svSzEE-* zi`W$aA>EqAAX{_E)?=ddh%=mQH`>HUwy(|)l&~)4w7cU<8XAfvHm8h(Jy?3QGi_a{ z-@8O5hGrc1g_aJ`EA7E2mhbVhGiQ53cn>-(Q@ZXL2o8;p5)cDsKeygP+YpaSWbKcf zLQNNkFFgZmIhw0eKaz6|JrA3|R^Qoww6eXkwz)A`^6PXVv~R8N-Cx^?ucr&@V$AdZ z`e&MrrN|pG&&9EJhkRJsm-diNdn_z@{UJ-aMwNiIjg{^FhnveQy5FKQC4Ru{n~Jtb z-(}D?xT>WL`IeZkSsUyCos);6vi^T}uQORCjGITFSxweafjt)5u>a^#)Kc*94_bSYjLF+gTz&x%Ip$4Fd%Ej30@z_+V+}LZ;Mba0HYF4(l;qWnQXMYzqhGktZD@=!u0&zlO z1Ks%*j3EHqe5M7)u%Ybj*zniPM7^RVNKw$LFIk#wVff<3iDTa*&4tvZ2P;eeFpN(= zs6SfS-}=XWUoJxMU!0H_QAQF)LKKsaH1QtqD>;v&T*AT(Jn4kGSRqTp>RhD3a>Q20 zaD0IMgk2zdxO3kpJ*l!HQJb%JX__N)14H5SsWj0I4zpi1C(LQqIO4jbLheaZ%gjr$ zjk)cT=Fq9d_<~6QysQ&cbPWNuxm@4hS^mfK z>EfxYp|8i6*NDvC^trz595s%ylxKQJFUH{C!7d>FT`n+gZhu%`rQZ9RjJ-<_kXt?? zVoSwZJKf>KJ=$EaZ+sx!BgcB#A^llz_(0{ncI(^sS9Ws@)hWs1&^Ef~nF{}#rt+J+ zFQKo&1%WdV{d?;xJCm^Dv_;J(N}4h5FE{++Z;ORJiaWb@9;0`@T@(YQA0Ng@X~Y3W zqT`#gQ0jzBPZ;T)3(NQz^avQrx3`Oq)_23BfiqJCC|EE{uuRWQrUCgL-ij7R{|khwluPK&4)M* zbd_zkabE4Y{2+9-X7bL(6Lom)T3HexT(mU}NO~de5M|MGHy_T_;S=1ySKnEgF6GpW zKD`l%NxjMc7pcs8G`dSv=#Q$@*HC?=w#@qh37$|c;Cr@)63LpS#mBilud)+LC183Q zeUwrgv5F^f!^DAuq;nk(e=7+Ec!v^EeD~YQ2*vEOtNaMD*4s$Qvb4Ls zK5WrTk}UiBNcz!GRpPNHA5J;aJHzxonb;91A4EJ$35M%Pr-Za0dB2r#1n5wzu@@Q1 zL_6E5m*WQI1VQ@^)SQ|8X?xG*@vnZth}%Fia>gHQK3pjk@zf`qy57vqmh{r6_{@dz z#%kfZS@ta@f?+#Ao0=Q>{g^~_629r(s+d0h2TX3F#NZ%CK;;OnqrSJiwwbFPjjN+pr=OAsRNF#5 zCY|oao2rdAl(cb)0Eq3#bUjr4-hZ^Vyi$Qx?wI$(8tCZ5wtpLIIHdk6u;Fk>aU88| zuaZ$?Cr7R2@;O$muJ_`%Pvt248xB(TJ`)eGU$!Vj)g-N0(Z52Ox;+Hh%iC*rrzP`_ zx~;nzD0)5!fIS_Fj>q$y551nB&${8!U@v+&x|5a1SYNMk&gR|la7aITI=Z7rbn`Or z(j;g`OIY_8$?eBN3o|P!F~L2-O1zi`Ps}}dC8OT)~mtp z>}dvd3~9p0=G1s7~H`#%GbnPKh) zU)1XN_q8wK`q@|c-uvMpZhhZrqz8oJv^Fi(&UN1$X+|hoYn$~t zrsKxW%Hr7i{jK#e(d9C!OEy;a_cs2yhhJ@3ejFIcTH*CJO(y*0K;UU?SmOj|5PtDURQyQFm)dAC0hTx^urf2IyY%G)_01Z*(8EE%NvN3to#;L&n zolO;eUcx<0)5o08cdsOW9I@`lU0os8WqW0kw@)8uP-JIS&xhFpPpcr7guSJFr;m5H z>(GFL3Cw3|K|1J#&KwF=(5s7!>dUPy)7JFb8>TNve-IeUUWSHx9sbN4@VQXbRvk+6 zFyd@b+A?DxKTx0n%i!}5M-1R{?lEgHdphmDkH^vHZw@=$K#irP=sUM+D+LjD4W;uSZMN8B=Go=bkTC0-i_I;!oQCnCHTv8vBwnA zI=?aCI}cDMt^?Z|ARTtdx&&oBY(kE2O32}T-v@E!*$D=gVV#4a$5@Fv2}?&c8QZaz zlaImibnzHa>z9{QwVSSe_E}&)My&FmJMU73go6Pd^D3|m zgvaPkd5P_uMc6g#YluULoP7-suUhUj&duXZ?x>JykOYSoRA*bZcV{F%WRiS5FwfxV z7f9F4ln5v1ZJ+B9=`(D$pAAfuYpY=vKIOnf;UA3Yw1$b_5;8S(dYXDJcX!h$56*{Z zT)$mQ9W;{mmRBA?f-f{nT9~BOz{^ar6!0wX40+zj zN=dpg!s$NM|FqXjds*42-& zPe~BF)@bQm$lc?gk}(h0Ovtxb=md7k&z>=Gqyfm#S=m_HTwb}iwjr-u%yL!epw>ek z)Ml_PzV(pD#WT4G`ci{EAl;p3>&qcAMP~S{rebdv2aK+0Gm@e;e0V^WT2(zf9oZaV zW+{>UP=08SrGN;wex!rOOIMPAUowcJyoU;6vyuqXlaHc-`lFpEJG(0nZ$JX6>8GK9 z2>;CpAPs(_^^dJbFMn(?a`mOtCX4d-C4tIN@1cWA+maZnk3WhcRvy)N*5szxS=;!> z4alO}{?pJ#WjZ$_kSZ8AqLRudqe-RGY&gAC{0*OwSZ0Rp8xq)IQ@^N%K& zt+mGw>suc{G1&*7j%3Oi-JE7JKyFMl56Fx#XpxqxfKtz`*C$yI>Bd8YoBq_jzTl25PTN20pgARiF0CWWod17Z7DK3Z*BkY zd+Te&OG|?J!8?8iyRFP;h3)pAvDts7z^5FLc4u&Z?`tDEj{AD`>k`j&V(MVr%}amw zr_$+WhH+;(%r#3XwXSSfa%J}Hqd4;MBNyP?X<23SkI?M0#-D~0%URrv3o`(2#DQh| z(cD+IDJi0lAj%U(JGJ^0QhSKB?i=MjMA6r}q>TO-A4MLf``D3LWdm;J$-Xe!3x3A( zWpo2bjPt+#zU6@QH$f6_uk7rt?-KSjrN@ZA&$3zceeIJi!)E!QBF|an60+=&g?K6Y z#Xs;F%|jHojECy6?9i8PWbQW2q9t!Tq+M@V)J5R`T~1Hj=kRCv&Z@{_We}Z;jRaHLI)FT2}+Y5@&pX zcC^OFaRFhHs215{UoM{hHhoC&3{`|e=YuOE4M;CFn@si5qY~}?I?u(?#Z~WANBF-h zlciy7vaZ7G)*zwerdLEf|Cp;fuw@xgCdZQE#e zw@Q{A>ZpvZK7O48tnXdrIO2_#I5Zx;zM($)cY9m>)+{gr>lMNW-JuQiSH&66*FJ8K8z-fYPo%0W@xF9pJs-m~N@{~WpGM^rUA zYMx)c{#1)T#7;?Lyl2f*yK>dbM<1mzE!TG*EU!G=dt6=np$lKO&6obSuX~z;uRJt# z?P)|g{Ec`%H6Kj^sY!(hP_#GqcDMF+Cu{L)iORd{dSw6a^RLTC(X(DYN!#qON9YIT zE0QZFwN-g05BNgg`bQazV`e5N_1|P}}OZsC;|*W+5bN zX`Iy_HM>d}u~7UFvJ?DJ+fgbcJvwh49i26~U`IlL?%^r9tPZ(3*QBkky#BzR5VHm> z6c3uj174jK|IsA!^RK7=YgWI0=rzuJSM8Hoc8I;`n&(IBE%1j|NU=fh z#~X2(>xZlaDqDX}QmO`dd`Mtnc>+rKV%u76;r~H-*SGAtSvrvaWodKk3H7x;jIgrS z;_=b^|Ls@b+__WD|1$sGw_nZwFaKvK{N4T}49&_!aMOEdWxKe)Le`J^da<>4kAPq5 zAX~h!g4O(gf#u1P!sUk5=0W#LCBoTU1hPDs9XGW1o|%<3bk) zRV>CrRAYqoQRndL9O>ubaTI85lN*UE!WKoR;8)#QdPQ!yTJ7m>me$KE7{<&pWqKOx zzFDl3NR11N#Ad5_tvVsu!Xbzt1D(>`De^SrTf^@dK2rIPb&IEdQ*2!w03koA4cQ~% z8}pFtEx3iGX`B$Gp?=J(%K`#r zPgh8~76kKYD2LRV8V?3`; zxLS~L7~O{{y-g?%8;O)i%VpM+CmPWm}PH7;wA zq$hb1xN!`I%S4PzmH{w}N!>+I#n%(6IvY;G7&Q12pp=3@T~n$0bV|o^lr-0GlKeH5 za>na#A~BToN2ntaRr9hYsT4khW1xcUQ?)Vi)yE2gLJNZU<3b)_S}$$x?7VWka_5w* zI_JbYt7!s77;Y(LC#qEWRHGbqpch@m5lx*0mg?y4s z0%Zw!vOk^s2kk^hBe^c6ff*v&S{go z=Yhtw$UnkYgJd6T(O$ml%y4z>qM!!uY3FF6n4F&yM@UhzPBc<2p-b#HdDmJ{cA6Op zv|KWaJX&0<(en4~t*UyT)l3VbN52c6! ztgh{-TO%3-khCu{y^t&t*pQI)CrQ!cG)oCqw3WXxqSZhqxWfd6Z`2@Th71Tktr=)U z$14-AHdtwQy53-`c0p1Z+cJEs&PYCF`qR$DNGb5j6;ACG|FavvNvKBy^vu(o$p$vW`JTD18#%+Efjz3@@<_ zRv|*|BWaO>Iz$KRk^;tj0yi^-TAsW(%0?kfI|Oo<%~M7*ic{!a3(`4|pcHF0YVjM% zpP)d|9@VfB=2Dze<*wNUs$J0q!V9?t6>&R~NjSy0UZ9z$K70&N=F%?ewXP~ff#R|c z6bny=l2G+o6OdM8pi5D8CBO@>>(&LsGjyr+8R0*a3M@r6E(es^K0G5W08x zc%#(RfaR;ofQaT$)qGIbjVh91p&Zre*R*^y4{F185=){T)y=p~WqPKwlR*V%*XW-_ z%E(kUAB2Xmn$j1SFb-90opxCIs{W@nh~uWgghIO0MvK5OvkUyRP2?in=p%1Rn>OyG zoRnNoFx3uXapDzP)d^S)<-3EdC^teS_6|BUVA-9LS|e85O07i!kUAG(Oqq;(Gy>R$ zkd#E{HGR?v*&AzIvPgn)^o?%oB_BiBf$E}Ah~(!qEhJbq`w^=rZVFck9ZPH>x(XR_ z)oB9=>VQaywW7p!1@L28D*FFJ<%93y!vY$i5wZ>dRBe@7)lv*gqwDeXeAakfcBExZ zPzXu}M!gi`CB)M-!@efFrNT4jY@z9^UQPP2phPnF*l3Yyn&&XM`;2#!Y1AcoQ*sDXp|k~Xvc;;0u%uC< zrs>G`OHAqg;1nr|3Z&^Y4Fgw^FGr~s%F84v7^XDu91q9YAqgc!h7BmJ%= z!W8QpvNGBUD?fZEur&n|r*cgalvR~I;YNFJva;joKo^l)3(~e1QutykU|*nMzz4x| z#JXNIJLu*S-wk93hHG)qA-yPSM}@_}&nm(sSvP|q2^rexa480d7T5bCJW=|W@Q6En zNvlv88KO~GXEo|4$STtAY#AY}V8p8?Vu}@&%(VK?a^;2L=hjVL`}ckB5Gj2+nb1z3@ssCFvn--E-6<>MQ7&aD>pu)R5agw_cKTW zx=w?WP@s#I7GL%}XHCo|SzOLEMN z9gTu=bp%BtFHCUBngHdQK_N3kiia!hhrZz+lc5doO;KziTvQeVvcxZBr%D1;utx<2 zMHZ*gt0vjC8?`Yzo~d|+0tt`Vq#KkyQKDx<7 z+tI;5(uP96rdvpgdrtyWheo~28bYzu3&3$cR7L**?NaG)=1j+vPLiaDJ4JnCS(T_g zjqXmdy1C6yJ8GFOEOqYMy**{vwT7f))m@jm9%x6tGs{dxiS7|D>TqyVj%!sCiQ1yr zD2baeUA9#hAW;kiBQhbYfuK-c5z?5DvdL^Pp|~_sU8Sd=TJDx?{U>cDco?!F5)t)> zt)(dSwhTYQ4JW@7bnn;?ntYg^C zW6tEoSR$r#O7TeY9V(ZgIiR$gC2SpEwS!j*+LpP@kwpWPHJKvaTCQXfve8JJve5Fn zu!ZCdY%38MBFfy_q}%Kg)MivLsOigCEZK-Q+>{0oEhAc+huEKNyTQH2f{d-ZY#@D$ zxk{%|MNs%ny|RUunwjR4t-koD=1@qi9EkCTu27T%a8*69UCx-e@U3Fw82$|5vI&d8 zIwF?vMzkhSGG*GB*JuERTl(#J^4dMiNFhXl23?4{E{PmG^D9G{@Ge76N!|y{I`5{cgEm*+#0lmS6Qa z)4jP9>H7)_6k|tef&OuJC7g1C(Cc*$TZT{_=X90ujg=?+ifte6+zahBA3wOaa~MavHH$mFr$=w0Nn3n=KcQi#|B+$R#X88-QTnuWOKH;PV^COJ4X z!BBuo`%=wp!%{8aiwIdX6wMd}RfrqC1UaosooohnF$S$ckU~>rmPrx^HK{g*6J5aC zI|-ohXKV(MHef&2Km-*lgS9TFm@0-kJ-Uz2xRe}Btgbp$MT_KWOJmC1v-OKkxP+MM z)*S~|dz}UIfAh2Mo0jUpG8&Rf0VNg2`J0#W&{tD>u``|f~dy0?m)d;(us*ZKb{T~ zllnJ=JmQuVwhnm%L<*OuNHMy%0&6)d#iPkUrp~cpowHLa#F;0!La7B0t}ko}*Vc6LXMt`S+GSQHV#6bYMl)%kwRi(2bSCe;*lSalx6?*gOX-~5mqWOynq9O}U zN{ko?X-*;Olw0ERVu(O6=f#1FZ-7jY@@7teN(Y1O?&7LzMCipeunooj8wN6x29Hb~&nyyO?ger- zq13=>gS)DKUM{ce2oQ{&d+b~xoL#EjJwlY@r$-m?rI)ZaZZ1EbNo13z!R(yApp;Ts zNw3XnRWHz-3)aTjLhvqEsIGtATm(jR7$8DPi9eGko+)e?>ZHW(h7)$1l`K(6mC0BH zh z8jEtA;cbfIzA6T2%Pv&9_}ncNEG0L|p=mA~q8YlPk`6X(7{{UQw~{up+_e(ocMlI@ z=}u&Y$;HMD`G~5mr~^8p7nNOscPtR*D%1;nnHy2D<#FUOvALA2a6m5+4Jqgbs+7BU zZZ8;(yrl2aPs!`p0<`-cuQ`JR&wLn)Q7$_*tn#jV%K#!A;7hc)9V5v4k)0XB2*>Dp z!2Rv?ms{6Sk!H?o2(KgG^ht~gAydp1ch8BNmZAbMp)JDZA*>ARsEm_{8`-236iNS_ zXyWpRMpOFTC@2xcjw5P7m7u1Q9h~44iIJ5eCfB3Ol$r+~iv=1o=-l)dZp?_%3g`4? za{Q}OuS1GyfdYf^RisK=`0|8kV^n-0#KB=XnceyZvR*B6!fi!=pG+nRZi0>!*`#v` z@vyN+;|u^&Yz?S};;&Q9<=>|dL>NoiU0|00zO?M%P3-Dki z5B`uL9Dm#mGrY+`wRS?`oS=@1@*vsj`F`H`q+;h0G!8O_Duo}+P8G$ni$_;CQ2Cq= zf->*I7FiOo=sNwT;u?%1Vl%dRC62ZoT#+umUQq_L@Q4@`I+9|Wb-1LUhjXYK;n@gG zs-kG^>rpqp?B1F1aS!CnbOSHj*eUD0;Lf~D6nIi3m7(0hjE2IP=+N1diK0(G!=a_sR(t}h_YAsYcEZ$2?mwYZrj3B~Sza{wjtYC)bIaum=xZ**Iz5~g-R zWu-Z#4S@?TihZ_KfDO}-VTaAp#>yGdD2_%ZubIbIXFC!EM{5>8lSO!#BR;4j=__fE zWUJK1*Qj(LNy8yy!bo}GVOoTBhC)F&A)zpmT~d~k(gqj<%17B3K2|YcIx5SptkRXn zQM&o*BZ+H>08rJxkW-Xl@0(dX%}|FTnHa@*DxBdEPFAH-xo#2(n@=mcD?IEOROf-b zzQ=2~6F89*Scd}~x+>YONI-}L5t94x%}<1*4XMD(;ipfbGo3!|$N*~8G?@99T0JTQ z${WD1$h6rs3@F=~5=f>WA;s9{Wi?!I z)3OL}$!Ot8%?rXK`{i^=+#Ri;VNo#=k&{`ZhcqCw&%*KqJw8owilYkCskFq>E`|UZ z&+EgHUJeeEF3}U+qkWFs*?1ML_*MZ2D1AY55cBpks9CM$d@GSjLqLnfGbV8$entYc zaD4^FJw+<93Cr=}n-TElLOx*3weegw2sEv)5k(Bj$VKxIYU$(0#Aha>o#JL|rSFy} z!k&D${7a}ar@hb@hC6pX%yWe}VG~baxHXk?gbp_JI!yzp^Di`n`<=?|$vovC18Y}@ zhrw$oNX$JF;nAKJ4xj-kTG^~D=R;Ar+FC(0S;Vj}gZak^Utlfdhm>7Mm@S$RR+^6P zh%>*kJBakgCM@fe9mz!}G3IWT^i-0F6+P^B{JlSDwP7fZmD35`qznZ;gS3gFlBvS} zh%i36JcYW!kK0fXNK`BxU@AVLr!e!Yc76=dZ}PaW-K`vp=>;D-_nCl^*0++l)D8n; zWTr`moVM(grjH$?xI_#vX*cdAZTj~9Z~cU7lSy?^?AT%ZmOBS5&NfkpY0ix|{d-Cd zTZQgN@6pA#v$Z-hKVwv+wn-X^IulaHA?7$8Hj!ygJsq59kFa|g z=Hp7b%4AV}omYM#NzCS&y4(T8UN>F&F?rlP;C_-8(YV_kMZt+~eE%exUv|-<-wW-i zDi2_Ch-|)0Akn&5PrftQ74{NTu}Q?4J(Q0}%q!w3w-`hi-^U#{yFn4$pTiGT;8V0h zVNpn`9bK8$=VUAuk>x=tdm{#p2jamb$_&qNxU6ongL7{ejj98XN)=d=4=`KcFm)Ux5q~XFes}OodoV#9cGnN-AoVz$MWh`l$ zKsK!Jdv->)CsBZOYPt8_ZoMAGCdzGTwjUkTny2t+2Cqt+Y5-L)YJ%pg>N)ChRyWG zBiA@O);zfn&n?nagx2DsB60GGU&6#+ko}3Y(#ZkKX5<(1b^N zDEt)vTF-<}%kWlCKAKQ)x||=vQ|YS+pf{(AN2m;3s7%XgNHtew;DHd_Av--|6;5OX zbvXzawLY|&*~PHPL&iY1$6MFli;cgkRmkPMn{TOf9IIs4j0Acq!JUtJ7S#_z<+ORm z&0H=FJ0_MMazz~;9Xkj22i^j&U`5y5vvSqX*H#y$lW}esvmmcz{X^ggE4S@v8kE#& zITbQ2K%+>?L<{Id7WXf`ID^mjbw?K=Zf&M%_G11S(M2)zE^I;|OIL3=&=Fp^!5G~x z=Z*hhHsV#podo@4kk1^iyl8gY%`+Dldu$UM zJgcWDbmH{g(N#u@$1RimV!^t^^O93^;)%>wbA#u*(zEQ|!?am=h(el>wB;dZNs;>T zGH?sz;LVH&(#i9q7$*kJ;O-qk{Eg9a0gmRdQ0vqC{Dcls&G(@hF-vRPk8 z(XTYj$Vo@C>GR;h)pD4CjOS`bIuWB{-bksmjCIK&{t`U^XtR+4?e}vzYYg#!P>60X z1xrLi3BsTwY1Ld3%WC$Ua z)76?;wh6n*YM|j8fP9gPsa{~>M~R*cLAkKEeM-2sx%^wnDNdt0hH{-7rQCA3c>WeC zi8ei=doqWlJcemeg6Nhm1gNNY3PMc85*;Na=}Wof07VxV&N((s^rks!JG=oT8SCfd zA&1q=PAkx>>3!Uc=1?SF#nd|MuBGQ}30W6{A1UWfKuo)oR!ht*Bfxgyw0i?AFQ%34 zz)sbX>9)&>H3p{*8u3{P-PQ{TW-cJl* zI(Xy0AF~*8y46H-s1#YCeXJrh)go>MI7u}y5mYkBLaHAhUzm4!TB22`Kqx9(0Gw-~ zv6{7u7x6NC@_TM60UFR%4n9eC77FOR$PBWrShu|&(<~@!q8nJ z!z>i+3yZ-ZRtcx9%cW#vjs6xQz-1|V4?1N@W-y^J%WVA&S!YK|vDj!gJxrdj2Vhu*#yP zXi#JwF%PyvD1i>gtIie2QCdY4yEt4rZwT>uT-P%S!#w2$B{h}x~m(= zAkhO=ZIKgx2Ek`+b?H(VTNgmozdK(XGy-`j&xOrZv&$f4o3_gjzNadIO!GvkSEG?pxqDq2@LJj^D`|?K zk(~1_-|nj%rv2rjEA2qZ0*d0Hk%Hg(Ha$v?pxTM@guvD|J4>Nx$^_FD;JP)>Nxstl zG1+v(AWms$A=nBxWW^y$ELGwr5z*bQ9}+hG}ew3{y~ zL*`U!p>K!?<9WE>6D8S|C|YuFQ^^m+0J>~Euv=-K+HD;fd=TWPDW>yWe}RS7Ce2JV z0OUFkkhC{)FXbW~#J!s_iNA|kT@X0LtV$UVS18$$GUB)WDI87Nhv*G*y2{asN|&?~ z85zzQI^~C7Bo)nL;DjC}XSpH737NVmWIhxC!!t?*6;me+Vk`b7a7H0a$_AKvG6M_xWTWR| zrgk&Di!DS_r5YnyV*7bqRw+>u>!~e=&`Nn8&kPM zXIe22`y|eQm4unE2rrdx7+ZMK3fEa|%6^vNiBT-bjR58l6I&*@sH~q$Op`xaK(+-t z9IlN?Fc857215@Vz-h0Dwq^|Tgw;IffdCT_Nw?0mz`$O{mr!N|irMpMV5qpvEHKK3 zIvqt619M01V;Ds?oO@}Sy)lCk1 zzeypo1fosy>}pH1K<>zZP`=b9__4mdUEkP!qWg*S zgmm6pS*lZvz1V%QLQ3g-+x6`y#oA8HF1=i=Zm+Bqo2$jr1M1ALOsn1Yids;JF!p8X zF|rP5wP_tv7=2}9x7Z@3#@g=g%5rh{E)+^*S&#a4ZLcWq^- z*xKHFw6)W-hz3r{dofXJT7zKT6;Cp**=N|<#2zdSHUOjaLa>-8eu)eWm z>%>R3Y#lY-;>qS7-R&^%bwJG)T8LUHmRD9+mUh=3vAVQmn4P_cD>b!S+T7VS1g)o{Bw`_ z3?T&dQNItd37LFai|hX58iTV!j8I+tY5Rm1<>Ehqj5f(c{-m&!EKh1+8uDP+l(VHu z6`-^v&iXyD!P<%uj6MMbgw&M$Ww~yp%QGS{m_knW>B8zA*VpYmq{mvX173|3GCNFJ ztH^`UNl|AxMbe@}$U~SG3o^{wMx+tO4s4m0b21U&5c(_DH^DExE!TJJ>dOATx57BJ z?UfCf18G?T4i9v2D*9=|4EQwa?V;?&Gfc*>=s(#=|F)x*OG9;?Q43PG97L#>IEZb(vN4i22siiGn#}7+@g-f! zW6zOnr=zO$m#SRTes8(-6)TjvKjZ+khqo7i2qsYFJwiA6i?`+1mgQcJiB9n=mlkLk4!SLxm-d!EKTD=6o$n>FrTWke z2;0V)RW%=jb!B~o)U~Enq8P@Il4flzDIsIPON@{fLU(s$Wt!m|&aD{9jxT(U(wdKD zGZ>1B;;#xXvhRU5g{A}q5GT}DGCc2^YkN)Z039_g*QA@Op2uwVZ+1|&l*~NUdHAbB zUjD`i)&)~^RqJn_oWN}3FpR-udP&eYzBjraAT>x6NU&jTv~U8#!{J2YGnJ)BcM|YE~7Tk#fZ;`-LfZk^?gcaz=MAB)2 zC)k9i9Qi{s^vG6Z`UWH`3_{|kaYITKoW7e{cOkJm<2tNMr)OP}8ffBkHu_G&+ zN;lT+v?=EyhP!AWJdw&Rz;R`MU5gnfRKux@6Wz1U8yZeBKidsBuksTPY-nAV z;^G4VGnOQr>I<^vh^3)1^oXwlZ#_3W5FDjEkyRCv(0InFOe9)(UW}=HgMfUXvvJT& z#D=A?Clc0f!s;6_zDNE(>AWF7q~iD1DD0xrB;6)6jsx*Ic1RLvpbHTuiR<*wxPD9eL;Sm7D7HZ;@na7tYDLazNua-K+6|SS67%l9 zp-4@q{Wt2;us?I7PxWc;&@8-|F1CON(Wf}d%Z~3TL0+$Ua0!^?-KsN@9MB4Iyf1f9o+^VX(uu#_M65|nps;tP!$jHdZ*m4W@3aTp$ z`)y=u8t>HkU;d_;{|8?$f4={#iIlhgtoQoa+9qrqPbysf`LF-$#o4XX=hqJKYU`iZ z!(N>tQ`dh@{x3g#g!?}~%m1s>`l?@Ceg2Q2qp8Jx;eEH>rp*7t2j4s@N_Ay;-ZpxqrP=%~k27@_{_e&-o9QmLH;^%jMBA{Fxi9Oz`a?{`yZ;eZ^5`;b6RQ z`Tf)I?TTJi_gDb25KPDK%2RS?qnc(fkj}c<3oP3y_lnB*H!&CpfM77Vrn!JX1W-wf zD_RT$#?34S0^-IN1A+3gk>c$p1AZhQCP!kij!m)}H1=WLTj1GM%m(shn~})RxWD`N zYLBP$LAAqr>D4^4H0XGI_;BgI07xz`<=v&ryu0+9`@Fk!f$tap_0GTE`OWYh0-@ej z8!&mVZg1_Z?Db#t@mOmhl#l=Q&f=WJ2yB3=IFvF0kT%_wolQ%p6qC|}g@+Fqra;rH zmo&h#g+Yk{CxRPn2TVOcjMl;TuoR(`uRBvU7fDh9G?v5Inh`Z(YLf3YI+Ll|<}PI2 ziG?sIxjqSkg5qW2J*0z-w3_8G`>QY3SO3trtD|wz+5L*>F5SBa$oL6k?{B@{TmN&l zv4uRw4~_5oo3A$aW>5J3UUk%$U-~RNJ^Q6TZ2oHX<@(BQ`I!dj_=mr5{_^Ga>L1Dv zkH-h!SN>h|XK+w8e28?V{L|m?s}EUP=dVeDYv_OH7r`L3aL|Q{6ZOC4 zufO@`L3#dv^x)xV{jUpYZ`@{a4qFiXxV;yM4>`f*I4Bf@N*od)v(dZ2&H}qKny?jk zC7F49SW^-oRNE2~YVTbUBmn4v``B(^gFX9UjC$cPXMcOhC(s`K$$uh-j!s7GEbun* zn-}{h_~!rYe~&f87HYvFJ5*MA;~+1#44b*VC4Nqr=M8)%RG{3gmHzYn_O^_@*R zS0y2?s5=suo2ib3aAVC;Nh+6Cv<5KNd`(J#8>@}l_e8C+nzj3SP#C1i?L-haQ6KsJ z1nm*87oiEt+U#ju%wss0816kE7AhJMOkCkubk+#BEzDKl;`)f=!P9lUnHZst$a9q2 z2?yUU>MOST=`Z{*Hw$aPf;C9-eo &6An;7Z<0G7Z-p0@yB_nz6T4Jqv8Db$CnHH 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

;M{O zM2$P*WYF^J+E87k@#0izevj8z`zJHWoHk1|w|^qo?-eGrJIKC3ArT^K+|-^{`k`D} zR+aJ{O(3Y|VMHOxD+W5T z7~D$osQYhPPoO&A{~|!b#kHy`vvuXvWV4uEx9Mhvt_h@Qr_Xq>o$>2*&ZJm9!})iY09_K@z#~wWJ#SlZw=T8hCzmk8+46CM9AKs z`c`2n9QLkgtb3RGo2g}CRhv?q3tRhqwwAXNi#Sw4->28ybh}eiS6US}H68wM*1s@1 z=aBMcUZTcT{n^h_t_CAqV8uaOZJoi{Aq&o9$Hn0QGsaDYaU-W>>kf2eH>`=rzg8=Y zXeM|E{xv?!*>b`nTT`&u!1#5D195u=i*U28c@2gCvU{rPPU%$k<)D9DlSwtdMCjkanX$t8xttNJ5-oGxQ%w0e?XW&}Z*=<(BF;?O6ek+@}q_N8Cb zv=S;$Y)0oe|BXQo)SBZPjHUKF`FH<*XEyro`^#5^%#Rf>L(H} ztWL(kU{1U~O_L=RsYw8oo?sRmjUm5mrmD39>v_jr*Y= zD(mV+n)d`JRFKPY6UyjCwF!m7jj>R!M(MpGaTcn)3sQT+qhq>E*i8sdJ0ZRev{5`| zmq_m{wMOkUFWh7aol&6@WJS_=>y?Wsn0XkkxQ&_9?QPwfSh2m7WO7%eMz>h9NxdX5 z(6BbxHW&di=2zq9%GB5=(nqJ6NF$$GQ8YzNlNzoO`I?_(F%*Xna8u?%Bdy0{%j%kT zNO3+Eh(weZ_EARr zjZK4|U;Yp4&6xS5QM4u~0~tOBeHui3!H%oW7)+*A2Qpl|fq+bHGVKL^hqO%CecF{O zp^nTS?YqsNBs0#RG%-wZU2&4E7`3bo^VkyH6=RqODL##m_g!I)^RaH*>~ntC&Iqd% z>m*&Ph4K=nsSAlB3@!@C{ch;1(W3;9p`zemHEq!}B-C_unt^q!9=2aJ)t27V#-61I z12gvSb}+@wLQT;t#|(>8u!S%+>u~5pjgbq32EHf}P#{dhAuwSjhk#LF3!~?|bWSrn z72@`yP&0B#DYG^a3Ps|3m~9k5sPF!O4tx!)ao@T-Y^xSRc(+uQ$lwek9snqF7TamO z#5heQcOaRjtc@rXKDoIyO%;9UaGH|-`duiSYi7kB3;FD6xv8XhDJXOMLN~F^+u+*% zf?J%0?Hl7?0P$7?ZqtkP`qOa#EV4Hm4p`S@(S9}sT{aZwmw=c?7!}kbkwclLl`K_- z@=*kpGHW8JP^7p^ES7_xK40&nL~NyzN~>aZmMd6S?G26*9E zjMd%q=QsdiPa_)^F*C^(UNZOvA&1*$P2jl%DmCQ}jdtHffPo-}rf*Li)!KHv2*Y=SQ?cla>8#IV8@dg0 z`H)U$G^laUc%wlP(^{*yLD=+x5Ep(rlx=OSg@td|0E<{Rnhto^RFSn{Rl$uEst0%- zB_styi`1S*3n|dMup3I$kV1v1hLkdEYDl3-YFcB!A8top)?Ef=>&;WTD>(AO5$g43 zFvm@*BRlbf`a7de;5U(A#ZK%ultgc$Hj|6BVg1MfOvijMloY_VGhd-F99J4`JLXN| z6l8B1=51te&16#qI7wUL0kBoB1(tk%>fTQ`c~0_{1% zS|w;`4r7-v!;yme#9$#zin5y%JER5#a|J#v1FeE{STe;;7_jt~NQ-E{GX0 z;yNvvZieTgh(_|@++J;bRhAcNk|zhED34{Cu*gXyPk?OeiJWgO6sV7HkIA@LZod>(BVbXzF7WZ29M z>ou`?5LYPK?bEoNkYQT3DqF!t3Yevvi%_Jt$jWA=NcKXW(H{2t8q)O#`0Drj$*E8Z zlYZ%Tso6&6zS=&9fF*0HOA47xVQHRgfy*jBgWF-(_@e~tapRdo2Ui!R+vYpPFWry8hJ&g@6s|&`P%aLv(=KL(IVDN(8dYDXMnM@If`vesYOCiE zNKzs@Rt)F(rfnH<|4HXWfi8_31Z{&{BY!*}3ZQO1zD_Y+#&ys^_1fs7RC8RJ7)I3e z5aSwT)lUR#(#TeaWZ#PD&$~mwT!OT??_hma9X)23koX4<(4uK zAQ7M<%Zr4}lWU~RGI?E0fCbJ_de;h#dc&9S;Bx=A@r7T!zV3~s%42O3&dc}_-1w#@ zNXf`5T=t|lIvVz`t_MR~k833(f$AAG64kPylN_DFr*`xB`LOP%+9>+6dw!!@^fc12 zZ1a%b)GZl0b7YAq*NWY1$*=XYT&j4M(N@&bN$$WCwJBhSuWb<06OCMWx7B#pR{5#g z4ZWQX=XYeAZ$ovAdA_yEyRy)aZ}66M3}*AG7Vp~JoUnkmAsX5YxYjs)UC;EwK9>_! zqHXY`uV&2@7}E#_?5TTrq(nWBbPbghbxVTi&kDq;pC^YIUqksIfrV8mZEI=_#TrN@ zkZO-$xJ^$TTk?QmRv==SC%0jk!lEA|AbVR=W7tJdx|dMfrF(+mnxts&fnio4Vwfif z4D+d;6~YRkbePWAn02RJrEF=UjStt7&cT?ScD_L}3sX|N3c@I6))D9z9q7^e9z-?g z(PW^9EJ(04`p|-cL;kCjvm&v6xF4p4oQ@idP0~6egoN$?s9V%DC5g0l%JDnCxx!m9 zI8KHoZ1&Gm^3fm8&usqMivaDH#;tc8Ulb*Ehq<4z!w1|D+Mo z-HAifY#?HjPLc@BSud8$HzCW*u<2eRmb!VQRjV?bRR|)!Q1vAe|3&xe3K!L{2cj!u z5R*%O?Yx0#%*m6P&LsHP^y2)^Hqvbd7e~8MxG{=teA1|y821`LZcpxU;C%oJWn{*J zCE{h1G9h2w^v{nwAP)A5gNyJ;E|@BvFlvUh2Ya>EJimX85PN()xVpT#c+ngBR|wPL z3A6<1IM^jlMa!e=Lm1S!yn40~={gvZcN=?K3-u2)Ic$wnbul&Hjn6~( z=r0h5juw_wfAmo#qojABkfVvi{pTB>(P0z+!D=Bva3sHa)g2*L0!nppxu7?sTPqPM zvJNMNA4xR^91$%AYnQvDtMk4D?iBeL>Mc~WcOc;xS7a9RDCB*u=OzM%;Q!0o{?6vk zGb|1VM+mft*S5&?p=pY(-tqey+B!&F4_C-&Cy_3W&dUzsyq+R7$w2LVPzACc^SrN1(8bk#YZu+GnPQ*Jh9Id< zLNwrLXDj6&Mxb1{ZoyH~MN7~VdJ?Ph;0waZec1Q03^SN-#A`?R87+L0AS7p179&@i zslGq~Tl_O3D3Ly>K2b&kn<>9m*WFY1mewadSWQZgT6(G#g}pJwLeGBL{yz3NOX%{S zCUyBwW4rvPU#`nRj=ZB@)7*>>KbX|v2V*<@;Fs&L$Vr_~Z^_Yxxt7i?ku~|`Nc%XJ zA!lXkL2`vrX~T8w{B!oVdH9n|%0i8&Yg-2!N|Q8plM98v5BisI1fjrNu!$si2>~b) zkg454GTJbe6#t~lB$dfz--y%df?||zC0kU}amvOmRZA_78vt@aXVh3@VqfgC>?I;< zGhVc-hM_7p?4s3r0z-6w7*G-*mo%g&mOaQo?8+scFD`ZrvB#2NLqXpJ%a}$tPYISS z)z9-ojB!3<{oOYUMiJ z;jsJq+mB`S%1S`rxqhv>NUDc`VZd^_t^zru)+7Ane@$-5_NdsI;aLGjNVW||91`o4 z4hbicGHAXlvDShbFE|RDXEfoQ$PPng)0?xcvVu*K_O{$QQ)qG=idM}zEi$cR40`1w zaG%S2p0v_T`mmYw5t5Ah0-PhC!+F3;VZ^}ePdER%z3~uijd#FC{fjGv)RVuo^3XFK zVXQ~8bvd~?KYuN+0G#)`&@Ls8_WslL>Z3pXpHFoCrUaF+?r6iOmtXl_{Nk~)%x zl@I5yw_hpCOwlhm@Z1dJYXraEex-arb-&=%lw4u^^>&Uk*r#l*bKpi5xU!6AYkW4x zMUG)+Gkhj9us7PQxTlqu+<04zDcC5S$YM5oc71&{o4g}<(I1WAPamgrI+bsReV@Jz z$b%`Nn*?BntqVatTwaF$_^Hftg!KGLW}IzYMY|gHuDEl(xWW?~{O3c?HB)kshyDZV z@aPOXuUg9s)!pU0(mkD+4$fP_t^rU*ju0`iy){61B|JM=%d0-9bk|9Ah!`NDUy2^q zUTi#{Y&?F>ZRa!Ca@uKIi8e@F4B2et+~CN3sAp&=*vHs#qBy1i!rlhu4Jzdm6qXz_ z4@d4yq;gsp+CLmWRMb?G1^%Ky<)tiMj|VvXfDKT)9<3%&J=V_$M?Y|b;F@4ZDcDI2 z$({JZ7HYgJ6{p~(g3z>Nc3<5@R|*JMjui(}%`@Cr;GW}oPx`DB39DyQWq7B$3t4M@ zYj^#t&f(_vMrUVtXG6wVv2wlR9cnUV1VAgUf6gsjAI!oj>$FchqkCJihF1#5Ah9&m z>IF;Cc<`ZE89e!zxGQeT6np@H-l`6$Gc~LVWG?jMmu8>eU(l;6ah@OU4bQ zaD)ssO1S018BE1jJj;XjVb8xM-Tn#KRe>i_MbYw-u-bD#4mQ?zcb>2s#F2ArD16X6 zeT>e~#Jl)K$WClaAq^Ip6^|Kkp zV}2P3tckgpsEZanuv*Q9eNiG$RP;!H^(QEE+Cg!c(o&EMCe&TnQ-(>=i<|4-kE{Ur zsoZnG5PcymQ8xQWNo1qOL5!kG*7FAQy3W-e&B=Y&%B9_|JvLBR)eVVbc=*`PT`X>Xc+AkP{xI?A?c*!A8^zVNWC37$i`Kxb2sc_z{@q^EW! z5aylODe@^4PZ{kMH&f>-npW&Zp;7;T5~p}(IK}b4`;)=Z-u19L9vrDO3s1iD-Q11` zUv_2_ftPAqe1TZ>R^5ZXkcUNkIB0>90xw(>W60#Cr6qe@QZ*vf!lJslv2)nr(&`fu z-KIc=oY$T*dNkj*JIC=x)R1w0GJvdyodB09ZbTnu!SntL;QpZ-^cBRAqE8G!4p~-^ zzMsnVM9)UmVHXh_`8X8Z%OHfV2J{%|wHFnzv^M>VZ(S< zTcV2Kn2;wjM3`qB^3paTvJ6=2hR=4Nb%(uUK?MWn&EAYcnnuju+I;-i?XAw?23DG{ zH}(%UcXzZ-N}O2^a368g0Kv914)Ebm>D;~V%Xz*+8A}A3dzm? zP#ppV8T-BN@wUdVoKqGe_hA2UIbe*)B^1FHLd}==ZM-NS1b}jhGnWqa#{T~9KGbqO z_<_kY8Cz$bXqqK!CCu@Br@$UT3rdq@YusU(PHnujl$ctN(iB%t zkiQPrsP4^Iv*t)uf^_Y(det`x~+B@~Qf zn3pM_b*->ROEGr80Talo;~N~srS&ZSD-S4-doS=laoDo6bzr3v>(R=)lgi&q7||X;w|mf6mL4|jn>+J*p$oaOhq>HvMW&e=W&Vu6!w{!3ula$(#md3gz>}j$3pTG3MA0a&5+Z+mQuGJXKV@ zmHbgebqbZEp+wT6h4wbKV)I}nMrC&#|NM5KqFdb)|qG8Nf%utVfst$08JF4z+_h?;Ht z2V?d~5vjbLFelDU=}MZ79NRG2X>f#;WMSv0>^!AzXUbW5XHa2{>mTRO`iPzb*&#Y6 zRU&SJ;OhHgFl59V+wgF`wGU;s>>kQUE#Xi!FR z6O1DKBrb)F4)wNdkcDtqRYYHsz7FtikIgkGN<0DtUAvd2<)t+C8R`20w|KZ&#k=F> zlrKrLF#&(Fflf38Y9yi>=h^_Ub@6nLmM< zLcJiDI4)%C#FD*v(D{08Yx9XuicraC+q{}Jv;oY?7VtQlQEE2;kO_O|_9|BjriKY^ z>cVJD-`eFN&SQFfQf*FIO_X$nqladHn3a8z80Meu?r*OhRbfMXkfxfUy0O@6IX%6d6tRU zhH#m$3tk;CKgfgNg=GYGrOL=6ROVV8c58r-J?C}pO)EDi$j)dC4Jj|)mWBdjS{h2> ze=QA#`EEf&A>UaKRwEb!MrZPDTluhs+g-Wqopa#=&S(a5(!E8al)v|8E2nQm-9Qtz z++^DKjT_yZT~NJM^0+|?XSR49KAF^Y&eSZK(uo^veT60$>wdgu6v09$uIMuBoO|lZ zEr~l)`NYX-yc_8rx@bAvh0D2m&;opZvV|aGP>k}F|B*Inx-xgE|AcJu|2jEWKMTILX%}oeVm;Jk_0GtoQlX$@ zUo>n5FX5P}l@pI;j+H9se}{)fJmyUJ^Z+2ZnYS*d4;n|r(g8)J<)fZ@#vF)Z{;)cJ z^oQeW$UoQk1C#XuPJ87qu6^LQKQ};hvg2NsgK35{C_UuWasl7qjiBlIiZ_`fB5MbT zY0o&pLq>W;tgX3%R@D!R9T^c2=p(9TMr7vu#32pRHfuA8*{x*INiYV(3|JeMwmd7+ z!e@V%30?i2PYwftA>EjaGbtraXZo!Ad%WI}cKH_TMTDv@h}gx{*9wI!3-u9XF~!Xvc$F*E#^OK+^su2H|E8s;`ao379wnSZ!PCw?C64$_ zO9ja$YpK74KB^8ixD~GYW^LFwbW>_0|0*5SH4wL))HD#{?;0O9ns=#CX2iql`F^Vo znwW!wt|LTZ)Y$d3 z|08@60~)pAfqv0ALrGbUaO40*&r3>;J7}JgklmF-A_6?hxfW+cwYI|~<2(SfObMbM zw+lF7GWU)3)ys^=QlOR=WsCVbsf(G_Nc>EJs?GB$kJfcu)5Fo0T`SL31G{ z^FUAT#o{d-fqeP!8HjJvDKWR`$*M#OJX1V0&Y z3^MJY&4Civ<41})=f=~`t&Ps%H+vhMgTuAM&Gig@Jv}zcVcs!-0{pX%f?K^Q8)A|t z_V=6gwX>GYv?S+)-eb(ayBpmhTz=PHBF<0u1*~>^BG>LlXr}|5(Dzu163g@m)snIS zOa~`riIDy%eGE2PFUODhoSaIOIoTvwM!0L-3jo40<~p=S#DIrzft6IwQPA8m3pX#-3Cdla z-j4$c!O0;Vy+%}mA3K;CgJFQABdpH(>_d}_WnE1L{u9@jnxcTpf-#hz+iy1(jEGnm zp+_dfNXgq^FosIaNic>&E%dRiWwvC9jIB9i9wZ)iwo;ImwR-haU}^Mn0N1z+pJ-|S zl`BV4rn^I>6UYisF3{v;ENbm%X}*vGmR1T5m2Ppc%8Os9YKMXlZGHw)gXPjZVaZyF zIIfvWBpMw+yJLKMLI@Vei2y|Qp86?L3FT~k)Kq`rLgWn~H*gNuhs>1-J!rTL3CyM^ zk;79JS%$r)&=fAZu!O5lPX{-=X8}QUjax(zF2G;sqxNT<{^V*4@Rh+cwHN>3)L7*3 zLv(UFd~%+EhFvOB-W)?_=O-J z43{8*BW{Q7ShDK0yEV#id}}yPA0(5XQ?cPVZ4@*09?a!>zu!mjV>@*b*15zXDPR52 zeqoK$hPR>c&D`?nQY~Ap(qr8fQ(z!3OHbSuz02!GrV3G+0E75oWuDTbF ziLA(e=9j8UWqu4L1$9@13{mAF3{-&zB8rl=i;UBzr&}uLe5sNt(<*Iww<`l2MPV+E z)5#1MoC|C*Tohf3zfi;L1_2%MPOO9ipX5wDLcAYb`J3}0a{c894m2{c4-WS?*0wue zZ$8=BB~$W0tm$@Dgi|xVw}(`C=ELiQ$uIlIJzUu9Ux`0TTv@~DWPT7$l7?~}h9v4Z zf*sr%6F=m94NG3bs%#}${9-M<1bEQ9#&wNZ!3mZFzkO&1w$POKo}DDwH+P=yVq($p zNqQp%^=g846{0nI_XM+m%_l-}n}!e#(`|@rZ9*R3#O91RigZdCG2plO#eT-i;@Ztd z$Yt+)je0NQ)e49+x$!56;PEeUzRocy`k}LlTvjk8_6?8jb${R_f{s*UoVDjqHUr~? zj!YPPjQ|}=7dU_d#JG{I)|uf-mg)ir$OGA~tRHAQgUbWh=~?`wkYjt20W3R=31M!;UJmBcb6W!;Ak+>j?@3DD?mLWnWUuU$7K zYVzC6fIMfDqMO!gjGxFneBd^J6(?ue43lqWv>X1rFfe&rV6^DGOR>P_t zlKG-gyA0+wd0m7O9xb+AkjgW^$7*&T$O4TMIh+$qm9$zz$4wl@su(RS1u~%g~QRx ztuHCc7#Snvo5)%VAxf+cc=MudNS-LkLNTZN9m^6PS+S1_dxcFP#`^QKf*xtM+mxr z%bz#>>(^nId=D3l&9(ShdZfp&5kt|%YInI2;|x1(u+zoW*v&OWj2{jGu$WWKJ*v8A z*PS=;Km6lynhrxA8@NSko9R70c2s7Pg-6ci zCI@|Zvp@oqFm@?M314IU0@meTXUyU9Ja*P5!?+X9WQ<4>-EH`+Og*ygO0Qxq(u(uU zEs0x$!4EY4a2^GwAN8<7x;#Rp7lxToo>H!!m0m$6EYde`K|92HWQ#DOI6|d3^l{*djv11Kkrc&( z4AXLXQO(pCaXd_k%cy2TxW{DAT?VhbE*bo(*RfR8OkN8O1vTUqJCT<#**Xzlx8mOt?QjZd2sNrV z*ekA;CQ0gh4rP_;e3Wd)xavh2l#G_jM!_6FCBy3eE+^VGFRZEPJF%p^d{vtt=e?Ya`zZ z!UmzNp9EWI(3AXfRv@lMmJgiSUgHgMpB`XKPinJ#ik?iWaqFJk7NGSc;pG|+x2k?Q z8%(FGQPWGVJEn}2i*%a9E{|XJkFU@CxQ$Ev6pOSixjHYE+3|3sY_#x7WZ0HtfelWs z_0wu@X-w$y1yQ`Bi1$v)OY$@e?RFM3O0*VNOcDbi*C=%YoxIufjjYn|mg_8OSo70V zWhKKbZnNr0`JkD24iBuF=yUa}eP1|cjm=RAi)1UxHrQFU)HB|rC5|2H%nI{MJXEm# z>l$#LR%7mDM0&Twi`GgbVXTq5X@jgp0bjvGtKwQ z>U33{JT=MGh#f4}0DD_3Iy_4^CVL?Iz7sOSr~WiBG9N+;`pk0>o6WyyfZf3*+-5Of z)$Zv&kTlZ_E*Fn`7Ywwkvp)D2Bp4MYr?hn|aqaMA@ZGXmm&@GIss8Lwgh7gLH!Y@i z7r~1r+o6Nhqe-qV*x8N2CF0&XSr`O2XAEYHF)Bt5nPk%Q0aWag$LhRdlWq-W5{YHP z-!>FuRu5}w!965>TSk^FKr*T8`d*H&olZs4s{Wv)a_`66t<qE{}#2eFB z;fh19%dqZ(y|@{aryDi(=$SN$Bj{u%#zfMh2BKjuL=h8>X+0RI!lM$L*-CVVDsW9f zIbPnGM$GGQ;#k&7(lZ0!MMbNCI;zpGoeRG9hZqvxuN7MSBC`bqcGe{aBE}w)vvc6; z;^zFi&)4K!o`~fH$4$7_Km(Rx8$`2Ov?z+ok${{#b1ZIqfdo9YR){u@K_-3ktnzgd z?T*ixxQ|V!4`|7k&Ku5@eP+6`jI!LlXh%oxabPQrwF^)(&5rH=ue4x ztcEmwJlp1Js1_z_PB}xehEW#8JI6{j|2Sg`_>EmJ`XlJB@KP&Jl5uz_TRC;&VM#I( zGQ6D)eN}GOjJ>FrMYJP2xfXBJJo#p4ZF_UQDIb$lkINVNt0BKYcTHn7L1o(#e+b+0 zuTMF7HYDYZ8jh(mq2=A$(jh>w_(#V zmWai=b$>(5O3b&01oAa9p>H-8i9r^13;GcV2u4;(Q8O8rds?3ka%LgAlFOCiY{;+* zOG7aB$0;%O#@EQE8VqQIgBxBX%j{h>^6+$?6ATaDcaFMOBOJ=5M)Yu^ui}6@k)P-L zcEx>PoB51E&cc6Cr4oxg;d)ocX;ql`Tf?miGoYd@uUfHtE#WAIFoO zlk=`#;TW^Nzrko_BM`S;#&s$A6WRp)4xmZmC78?8=3<$$qd4OGrcdmPlQ>cZr4;?A z^C7$dF|>;2?K#kJR`xR>iAXAeO(h_XIu z*?$q;4bj^Z-mzB7JD7y@o|Fld3AB$uQ{sE-IO>Z?cbaza0D|l7 z$uIpqfEOEr(Vp%L`Z^K{FZa19v@u~Iir~{R5s-hby4Qm~98=N$Jgl9V%2SUKyhS>= z>2`SuPtQs7R58@I4U9~B$o+Rbr)fLF!Xf%U=V zN&nQ1iil5rH0)np4~Aw+H0fTTPNLq54<0XWVXred=_o(@g##f_o0eM z&?es1<7pEuKd7(b-_~EX7a=uY;u9UqO8g5qJMD&=tP{RjYHoPMC!GZ5f21z^YbQ|6 zkj`O9P)e4Q=BSm;HKAg(*rY>9W&y}hYVixEI9gzjd~FO@LcIhu%y7WMjxhi7eT|Szj`gleI;Sd7EaX}qIssftW#OP_te66R-xKKt(uxc<&`7wfwXt=YZHm--V=#|GAj#IQ0Cft{ zR;M-fU$x#L$%I(5J<9yw{qOt_JiT~zeuD=FM~fJ-`%5eL7w<29w6yYI`4z7AGXTr- zad&iv^P`&|mq){+Wz>LuOvU=r*)&wSkN-aX^yA;*pOsHPzMuY!q>ny%uyX%*D<6LJ zVCBP49(=-bA3pf-qfdTU-Jb^d+m^YZ*JxG!?(BNy!pbzh_d{`YEZugId1GupsT@MGB z{Uf|~D*)DRuFs$=;Ck6T%)Dp)?&bN-QMY>5yS(he$My45`GMQBtEU$T`?G`>a1rfJ zsva^HlD~6{pW;I*>cDWRB$S1$`=3=kTvqQ%^ZvH)hf6Eopn+VdcplQdW*=}ydqs_5UhZO_ zL)jeqtH4Vwgoyn;_6s^^16ZK1&j6Ay2{U%oi=MrJgR>+)J#t zuK4Y*?Hqpd846>7kc->k8Ud|OwHrMJm51HS>({`Y5Vkk=*S|y+ylK3(dH4-`@O1NV zXXD_Y!t+VhTD7;fkHAsSx7PNnz32OTy9XOfRdoO|kzSy*l2ji{&WRl;P3=R%8yxqp z!3-lOz&9A`^!*q-5ZlAK0Hc~5fft>+Qx50(0BkPDRuX&4Ic#oycki3coo6_Ef=Z5C z;COvz*auHRGe#GPe%q)oAjHwp(n9s|pDOWrLwttwF0Mo@RtLDy)2lxEh(1&Is>g%T z_26=$+Fq;fL*%S1u6%U=(}n8!!5VwIJj1(o;M9|<)3IYn5cObVzw>3MGxK|7@NJG# z9x7fQo!{UAkk2t=DX5puzJTSq^LXRg<_<1!tZyC6%+QcT=$I{x1k!ny8kcolw7+T2 zXQg`C-ZNH3y)>s-^&r*Vv#M!MvFdi}my=aZbIMiso`{wgYsoKmRC9{8_9Tozqatd> zoMOdX`J=uin+8-Y=M;fF341N6?5G1so>Q!hZ5y8texhJg8;u_ zuk1v$_ARGanT$h^v%J~A? z;g20WEc^q`4`B|#5A4WWs;SdYTJZ)~iSw#qRqVmor?++BmzzdQT1ff}o0~=u!rIFN zusJG4PB#KR$qeV)ar{V%IwY6oGOjo^FrMirbH1y+t?XmM?!1ncc!a42`4x3B7fMCr-ogA()1Ekc2#+EcvILoUHcUYnAV zlXY!Rqm$l;K}7t|g;<`t;;kHb%7=}Vj~Xct8Yv$)Qa-W%uk9IniS9)90}spCoAK#| zCehwtDWl%-CH4_p_M&x?^Wyb2geN35Yz*jk0$5TNEYDCrd4LCk@oXC00Ic@uDYj zVNtF|<_ZD}yL4XgP$3%DHD4X7d#K_c*6kY8$h&{_`q_#}7+j1z(cnDx!}V}@or4O* zZx(D2&suOr)tR{2zXFx3dzM)1XP5zsJ4-z+jW}ty zk3g;?Me=w6qZgHwANv)bYH}6}Y~7IIWWIt>%&R+xR`;6eGFHNp=dcN$$IpAm zVaT>5Cza#Cg* zyp(D0VcE!R9Z6e&4zm*YEyt{;MC4Qm#5Jz$Ckja3zL4p^Zy=?vUqgbBKU2J7cQ%g` zoJfckyuuW{CsGNhW4D06u-DxTdj_SoE;90-{36T%s6KxPue^v@j);z=LW6M&^R-dN zftVDRPGm|+lA)}YB#{0jkgeA}ShH!NDAiAwHPI4eg|`|xoGqSYmtZi1{1WOjp)r4R z5s?fRKDzfzCDU9NXKhCq6hM=HrT6|(P94Yn?EQXo%`NimJ_z;WE z7dClp^+PHoQv*K(oEZxhOW|;v0187+(#vxhbl-w*oJ_U-r|Z?nINQsxu<7c8URGjR z?{EfXWOs&Jlh9uM7k$pK$&xfHUIVp1z-pEcM1dJus$LNa2&g)_s+6l${<`0Lbv3{) zZgTxlv@tvlb8B;KWSmZigPSWNV1n!250wgK1e<>Bx4or#!3LT`DYbw37v2ib%GFc) zmtTsHVOA(6qJqSbE%oIqTF^R_(fME7mK%EhjVh4BECd-gB^5K(~o3z%7XLW89`qXPK?&hm6%NtD^Gf zfka|T5`u3|WBS$4rnEB&XJ5lmP~h&IQ*XuDHKG~@RF_jqUg&X}b>2me6|TfElTyMA zxM_Fl0}ehx%xWraRM~R|3wcceWu5>jZWbN8bBUAA(G`3;5>kh>&X1#1d5`I^-6iEk z)$bNg0y6a)I(sn6K$A%hN2+T%ArS@V3HCI!MdGm&eJxECWYIO4%vMpkTndk)dl@+Y z@pwV@nx!ZfV29H1L*t@N==s$#&@i)*?+9ATKfd7&acS2}>c6G(*XY8*S^wl(Yr#|m zebK6w%8zbNPvwz@tPefdpFS(&-~G`9>J#&8cjztsMfsr6)v9Fp;KTWM8lfYtc?D;T z0?&Gu^Z6EcquAwPD_1+sE>unm)uxz^+^AGX{9e2{$Iz!_b5dE3%ADnU;=Tv|Q}cy3 zLk~duKxvwVvZ%m7d`-~o8{!0|U*esV)|Xicm~ox1?p+C*aqKeA!dT>OB?c*+gYiTm zE8qM81Z|DyW+<3fD;L?Zh?8NiAs} zvtRw1zlP0g%R250!C3h_4Z}LI+@2H2~E@+f@kVf{_1; zvrGZM_CTa{5zaJPH5DQ@om>`TaG2}RSj4&;9Phxk-hV9BybF?q@^2+_O5T>>qt2nZ zN*&S5TLO*|yF4pQ8Iu-|!xoyoG^Pe=M?trYkeub2TZh9nE~4XbxD+|Tns8*H@}3z! zxslg!3K1>|s|n}Yt;WiE!XS=Nmu+ zp!5o>JrOYV4_Nznx9 zbQRZ8R#Bm#TA8>&QRih_l|cYbF-1%#yvJ2)>1U2uDi2e{pn>4jWeUU$9|T`BaicYj zV%p0aQIb0+@MrHKE)*UXOZNmE7X+JbK{t{hACc$#n~LwVZMwBp_s-#*=E_%v8HkV? zd34X^<6fRno!nf?@uaMIWG&~N>fWgaWAR(}c(bRPgR>lC8_7+$oYWnS_ML;UFn4J! zc2(n$OsD~^CcG>ycT%~L!&nC=7{^a;BGqq?Y7@0c+gulML_!hDvqqrBMwBrL9puHE zZZ!KA8#1&Zi*K&*CNBIII;k8kqku*l7-xW#S=f9nzL9qUBvlmM@h&XS_CyG#8ID^f zHdGVX?XBe#Lh+L)MoOzh4i!iM-Kf&~7+H^b$<<~{YeZHpIt8HH#rvF$SaU>MV^Ibi z+lH1M&G2g*T$K*8Sm+>QOx+B4FMIOC2D`e)kht|1UtC+Pr;B1M55csvVZgNV-I3b3Y&O{UF`f!Z-as_JCSP8RmY(zmvyS~T}M_I{h@JIz; zip2k|I6qLEA|sy&SlxNy%@L+}G2nVhvP0OICnQnv(JNcKa;SKyR3ug7qDTs8YtaEEMeNuq2e@bzD*7 zZB-xFiClCwJCOlu4X~AWCgX38ex}OHN-+lWpu-NIjEJL=r1tr1~n=F>(_n>@| zL8px&=@G&dyid~)Gq-jO9t@?p!icCBz7xVVI*kIZ zkxuZy7mS7rzLkewi;bNG$`Duf5<6#Ts&3}M$0BO5T&fyVq|m|YH zJr=!;?Nh8WI7+oQ10*9fW!#uC{mQ_=6gEw06VtHt^+=5x8eSM3H*>ge=u8_a#HXu? zQMvaI27T7q*m>fY9`!LiZb=FkCyB|g{hs!_!VlBo_V@oaV8GJRlt_)g|9}4zL;$GW z|NrRYk3RkF{{NKZeXC-)Ys|~QU#@+<(OKW!dAj+m^X1I%5ue0w5<`3<@DDE%`-774 zmNAw_Y+U4$aZCh9g{#LQbrz{7_CjLsc81`s?;q=kfEWPjN;1VDtZNR4bokS(`iSmR*-XDy-p*I4rF->luV3Sn(FrTj8aU26F49`k;Z-Enq7oF+6KzBc4)r za8vylT6GV%?XFJ{?m!w^X!Jd6Mfg$bQ0_RIi9Q3tBvpg!mNAJLs$>I4v1Zwd{?8Z-cj}8(*IfD zLF)P7l%YeaCxfFKF$9Sp80wrur{xw;>z-X-Up-u2e)a0r(yNb_2E)_k!~NwC@85s0 zyuY!&2#PH77ZNa*9YOHf&;JYncwGBq zi;@IMr#;mnU`(g?BY^gvkACQ1S&t#kC9ud5P3$1rtKMB4ivS2Oo+?TtWdhYAFmZ?= z7(V7eR(g2opAz(`PGDiX$V~`Ca)!Vu@J~h{61rg7VGhnpj5U{FsO+CBRT+Q;XrK~~ z5D|Jq!gKI=4iy#fgC8C*DY~!V9fJUf!ZsktoC`5Z>-p;Q>cRa#ed58btgLV(Lweu+ z{4R+&woWBdDlQ#L01I?Q;a$%XRy^%=M@RjBr$6eRU!8TUIcam=5s^~{6lC9|z>6NH zFJ3mi#>-^gYHySARJxZ=n`#-s2Qlp=rVZv;%7YvZ+Sh+Tu#Z3g_~VbP`T6_&Aq>Xs z5|%Pa;Sr)!Z1c6U-DA?xg!BdL4l$J12kEVOw%3xU?*PI;Di~R4$uODUxqgu zL*%V6oG!O8N?>|@!E#QI{^o@X1p+6if(kRmdXy~|6qGn3&+b1lET3 zp2GkH`x^S=f)!%(Kt$|1Lrzmm(csgM! zK+JsPaq$s{S$LwV##e(?BCY1k%}xa@JLZg|3qKXQ!*BLBa4#HNvhB6MZf-x{UXZ9$ zLJ&}i1BY>{FKCI{$CC@`{GNm>1NZATM0?xR88JgQ51Wc3`W>`QbOQ@Z@-2wyOpdE3 zYP(+Ov%gURu~dYO+Fum^{hr4P~L8o&S&B>z6i)AkOXg|2Tm-9=t*@j4lGI zO*R9J-~WI3=|?N|{r|@+DYnR7}SD(MerMjEf-Dc1}aFx&4r6YGz`d<^t&;6Bti{tmJjpO$(jo#;` zvr_~W6vLSt(c2^JMogJ6pSJPhetuwt;njfAedY=H>=3{ytw-Vjh`$rYhd%4iMQ{-$=_=x^mO|8Qs*s#zyEKPtmbAwJP2OEF6ZYWMn=# zfW40Eg%$5L0T>X&-CcU|$#sP1YYRuPO7#6sf*q0J|^#jx%WpbPN%GK(RH|x~(pp4X|}CSM|D}&{KFi?!yCScqxb6 zH3YCl!+xFCCZQz!cJNZLkePn}z~;rxNkqlXRwYPq8~&lgXr!j|b6^6v4N1Qz(Mpr9 zNkgN9*Ox~)O6Oac(BW$cVyHVfXgofrHm~IcD|`MHDcil#2!nuB_yqG8Y+}B>5=#?y zbVf>)K9F4;I_nOG@GQFg0o@MHgV|PbZ|zCvaASLK3zG+1MwT@NmlKV-2b()zMXi}B zYg>O=`{p2~CA-cJg1Ca5VTTD`zypKWCVe;algu?j%`NG+D*{;(z7dN$l;$keHb?X_ zi$$@a1z>E{o>788>DNimpt3kVc)~pZLb|1M802dVgYKDRN4Wd=|8A@wYVRCW3Qx)-w6MYu7g_R7YP{YfwvEZ9AmLl?1e-u`O0`Qe%>Gn%CYiCa;^IzPTLY)Vj5% zFn@{K2H1OV=HfCE9Pc;40M%NXR~GWo0qxre0O^w2RVVeD#VJ`zT^7L=IATnjJ`ADZ ziNp>y+S>L42}=TjNz7dyj>zB-xVm(i_ zE#KjkT8fLO=!$z|b~sZATABP+Q|qkm%_}EC42UDLYeYe9rR-2jtM_9yCz^u3XYBkg z2gmI9#@8D=_`7@X@F#1Msm8ea!hM{MCX-UdMN6iW2CC6BoQDD=&K30-(zfovj0b2G zYi-lg+o}s{)_|B9A&d`p@UMDM25{i5HUVgoIK$+=#!fC-*a1Zu;wgA46w&j~;m^u- zT8}?iga3J%QZ3KJN#Ec~u8yMmsX2pp&ozZNY7~?b$q4E1%{z?VuvSjBz#=gZq|elI zbT_ zsj8~2@$wE~txWn#{kZ9JI5!zxM<`hSR_ zK@PFg+>QNxyr~jSWz($j74fdi4&N{_Ck|G$B%7(({0qZ6yYDZmsLl*i4i%ObH5v0Z z*5r(GW{q37?&VSM92ef4_b?-ey^8^6BFm3ps4*oSuksA4u9&8dZ!}0bW}DH)?qloT zfCDMM@TeR|)SHg;5aqHnP36CWz(=f6Aej_`*bAvSg5q?Jh3Ez z#0orNr7G*44kx@YZL1QdikI8f1mx*?I9h@KXpeZW*M) z65(W7U~90@Q*%cUSV`))1@ zMJwUFeH&SaM(|n%&1!`?7$iD8HG4y9NSwjaE`O+z1HVLBf&VUSH?@kfRuvi9S$SZ%Z;9J{0$J2*l@pD}( zm40J4p)f&nAt~q%p{?Gq?k$cQWw{s@5tM)vYzGmH5iNjc%(g=0Dm?mHW<*q={SWsf zWa8QU9ZNSXF0}tPrEYNk#*XjdA4WLVB05|mO8Yl&SrjLq=K1M?xVdrbf3UwUz;tpO zNFjj_Q{-ZWtIK529Q85-Fv)gU6S}$I)0j%VAK{dEyY6PgW5=MPO#?fy0A@M6h4&qw zY;E9dp|uxE!q(29Lt)-S&bGo?nC+g87S%fs9l^+OcfDY;7EmDkd2Wu_VChzYk%73V zVR?*O1S(P3qT|ThbXZdyy$`xh)K>t4kbZA$ZEVA^F|NOb&U&{t8dGXgNWHsJ0cqy`KcPuDiLp6_o2Ww6E=j%t*Pp3*9iy+F47 z%cdzI%cQ|`G|=m@)58q&kVM{W#MJT?LWw zI~QBoJ*-%Z+1|Dq-5@$Rw&Qa&pPIHCSpd+Ts$P|}OV69PEWU7|*wlIxoj4Ta^Pp@eQUv616$5mHmShM2b z|FJOEO)1SOWChdFr?Mm`wJNT;s@i6@sEIp5;BWsKdCpTf`~7z_H<=nqYegF};7}Gh ztf1&~AVn|T+A7+dNTsVgFrl53r8I`E8xQykWw!N50?%=RDQGYfUKZZ6mA3s%~ z)4_-Xo0cL?Pg{@4l9Hkvc;`y6z$US{7%IngE^s!M&F85@7i2Rk-V)E8h;CeBb zl>6lqLm1_hAt|OfLPg=&o)4>I_sE-Ne|~A-`2PfWm}_r)|Kn^DoyOn)xc}hek3Ou$ zf582Z-{L<^BI_@b58?N2?tfrejnj7N4AT7`@0a{`38Y8{I9b_6-(y$f&IVUJC+p%i zG;czyHzWi&7G0bJ(3SeSqTlWA^TP^$z!gsTa0~J9o6p4ik$0(iaw?iuALrM7Xo)y# z8Fnx6gwo)I5Vkk=skR@kJ>J~fJp6`Nh@WmA?%-^)dWwU`HQcG&$CZNTTWkB(-t+yv z-Ghy#sye{Ed2YX-?K~%tt^S){0vVmjX@H!}CkGfugDWEFZL~C?O&{UWPo7H+pi79) zryNJ&+QqOtMAUbzLbz&;&{M;{T8x1=D?WwePIWLixduUc)l)>{#1Spd$QSU2>d_KT zzW!8+KXxD->DBTB8PUv@gtVY>r`t&kt1qkPUwB#XMe&hCtAlbv>mR3tgjs$+7*zN zmKW+;#@NQxLrNX4;of35Pqa~Sp2DqSwx}N93)8kK-rlu_HxFv}U&eNnG#%g3N#G}U zP1_jXHMA0*(1u{ayMYo(KiA{xBriU}o>egyc3M(O>5~DdKYhKrq(Xgd!_<%9cJ)q+ zI>Cv$TZiNb-lKODRKhVprO_O+Vwd{ZNh8bmKCj$c>I*%b^9v!JQ)~+vi+lL8cl<5+ z3^z8O!1dyLZTuN8>K86R$iW&XRW(N)oIAyOS0H8x9Ls2G8I0~}63{f>MJg438*5q; z=(mPK`zcgh@6n-&yQ&h#Z@;T*$2;4u7pNVvFKlW!KuJ8gS~xj~!d$>}5%@*avv&>z zJa$X{e;ZdR7!iD_dod+;)c-$0j5qwV^6AI-(|?(@f>=2<{r{tnKE40j{qHHs`&Pwf zG|WP0>u_uH@&4NW=Eec+1kgFa7$Hu^(s_4grk2(@?{*G$pYN};!h7$%_ub5UsDjua zke`r;OGikv#0V!zbTf5Y5RxX&Ldj65isRA|6c~hQVbFmQeL62``J@^Qe~`P-k)hf` zd4_ucea>bs@!lo`=$9M3waQMV|7k=ov8|*?p9P#9JqD|5Bqm9*Z?Rb3jWc3R7gEd_ zM)x@ebuWLw&y(}+=|~^DfRW!yK<%YNm4rCKT{76KVbz5N6fyYl^zTyls5B1iPq)^d zv5R-)FiSt@t5Q*nGFGTi6rTt4R_*cH!A3_CiWQ&ajacZ9Elr*;R@r=fxVyXM^%fVe zyQhz^)9KcD(kj6C*+WUMxYbtp?GA%eYrJ*Q*qE zc?^-2Km7^Lr1<->{QX4!Vz-PG#N5N*KP^6S<{Q_cs8RnE|)`1a+of0DjGWah|G#7*8{z?BxtPgNl#?hMC zG8i+D>j115eb^tkBKR(2i4>MTAgCbUePeEHXFBuI?^~@$3x3TO&(`qrz4YzcIO4qf zDp;3*#W?%YMB@_b7tBjDGph%PFR{J$)dpB;=Igz+!!NN|t>R4cxIbK-x%%Oh-t_n_ zOPKwhUtYEFPg26dZFr&hSt|#P#>?o>W`6I-9vha%P{uyfa(E)9b3~7f^(RF3(d?Z& zKm9)hdb0pkA1wXj&Kxs32OH?`+Trg0{4Apn9v#n^uF^qNxhHFfYtl$eo39p+s>O@y zlLrsdl6(8R&-T~03x(5C2kZNrdxxb$VwBn1GQCJjcoLDApSgyKa0DNl3&}Gk>x5K! z1ap1{QM|U-7zGjjk?_KNR6U&8+uz8)cd;K%3s{}!xSNpIs->`Ap7i1dZ=nK*KJVe6 zu~kV}ojHRcE=}h5>dffI#uZ#M^JEjy)_1qJcXy;ixmrlwM|o?0ImiUeDd?SrjQ-`! z8of5r@$Cl!jaPfTe)kB6jotI5iw84g3j6F_JU|c@L=U8PmKG0^lS-X%k!yLed;tzI z)zi85D17BPQ$)xAE08~NYq=W=re@JcG0y00Gnt#@=bsAdD1XRDu~ z?;cloM?Wv&|4#4z?K2@ufP(sR4eidID=NjR!iVb1xa@EefZn-saI>SI|Le}3q~YbC zf1dr@XAEOO^9q|CT?iMhoA~F?D|V+y7er{@$HC3*W6Q+(jn{?9SZUU%r~J z?uwBcA++Vq+;3->X1@nPW@q77>1lWFe8@B{ARn{UERa}nM&OC{2OnI1s|CH+$(SOF zE1TqhKhYkD#Svu}5|E!&UY&8dlco%pe;5GFSmK4Tnj?RKm!<5yK}DKF#n11nf83Qp z5k9gZaYEj`bLah?&&K~5Eq`~pT!CwhW-`Z0RYE~&4liNqRvJ--5cW;uT^RqsXGD6C;N4S-cv@dnM3YyUx|B&ulX91pa5>n~O#=+r}&Hed1 z7W5N2^RqL#nZ)x_>&d);OXYHB1){QGJxR-;O+`6P?5qf|LREDrf(Wi#YG9RF%*-(7 z0}%7QCJ2^_wu^D4+!C@hu263B7+2D4Ip>2CNn*c*8cnp#HR+(m-mvqP5E4cV8XllQ ziOFGooiw;JR{&=v#YDlCHUC~*gnr(8BwnxrVSRn;35yjVxzPoyvq5WZ(@Z98&VMcr zsynMQ7L*N2)B4tPFd#a!xVf}S@k@XBReY%q5fL`y5+wJ6v3&4n@dOL|_8!)Ffx3=3kem)r#ZXj7k$H|Tf3IzK*7x>O z3dB#%4YW2oVNRvZHOEe>_St?%_)rDHvu^w!o{FJ+I2~w1uN3_0C*Pi=NpyR0CuWCce?k zx_uqV7d3Fx7=ccrj|*Q>J$HPNeYo*gx*!U#ZT$6cf33p`^R9P;#H*&@uFkA&AHp+% zDg1$N{ot?Xhr3j5CDVRus&>ND^-FWO=k#>le?qsAgui^XIs+MkhSt~l3o?3}vCbsH zK9DZsB#H71DSLbJxwj|3W4>_~Qong7d&9p-IsXtrz{$VLS;wzEtVH_FUr5>7qJWbm z{fV@LZ?>NwZfc_aM(XqJy~mr}`mEZ|)tQa;FLyiAAN^%1Qb5u%t_g^BiCgJ~l@W;%asYHnm^TXM##QKyaP zS7+q$n!T@{>1Kwd@|4w?xZzy2pCQe+-ku@fF*k0vLjg;QWx{4V6w#EV#38ohh??nJ z_gFB^Se+4pvbyzzzXGX3KS38PkU}Q=iE>6ar5XM@U)WEU*xMyd_%FV8Itl>);)|y~ z0j7Vf&TOx3;xY^>$q#;iwZUnrN&1_qJDX3TCUv~cECKmnfmu7kGxl?JW`~xG)tznr z+IWHh?efK6t201^Jjx{dDQU)KNWw3qcx&>*zCU>&wV3tEgVhXRRL z_oeAZVyG*D#1jDW9di#ba68Y^d`*cZAd(o1JS}2Lu?*j2j5xy6WGm*G0V&P5B$i1H zN?IgML5Z)P*?Ufs8@|#UPBarNvA88><=9*f27V5QU#`x;;S4aCrN35Z4mP+Z!iWbR zc1xZnxK&TI6iK4Gf>N9U^35NsGfBTgf4eV6xLO4p5VUX>O}|%X_@$dk&(kl>p)ypj zo2JE5IgF@8p#&akxbEos;=esrR|ZYx`k=oOxtk>*pW2*-2xeE}r{WWm5&iAbhOlL6iRJbA@W5XMA^xJYB7aQT#nP}r(wV#?c91O0lFw^Z5 zc>}Z3uIewO;Q2)Dq5fK(q3xCrHlOrqo>@&k)sDzSwIA|t?0Wn%d!uz+(xu<>OS^49 ztz_)9qZPQof)8yS*NlD80wEt z42u3jiky0TqJJPg44VF8iX45^tkP`0oP!!8hsz(Z5yvTDKaqx;483FTC!ysjC?UrX zl4A!Fqt_$aNDX-WTAcxV(seRSq4XQME|n6NtfwWV41OpfeTWi@7{xEAWNMZ`iP}bh zP93$R%%_8U=FF6kIB!JDL6R5@1xZ?N7hr}$jUF912YPdt4mZfjjn(LT5?wJIr(eX4 z1E~Jy#{rW>$&Uj*HxJ>6eZJVen3-8Rz-x?~f898EnEb4kjw;%amiYfK{yq~e_u=5B zfBDce-<-1_zsU> z@%^*A#Y%VeOaX;(C;&TS?+Ql)Qi&;IeyrJEc#3ytj;gU4KKN6#c7#j1SX_kE!lCV1 zm4K;O=O_B5tM&8*Rv$TT#+zS1!p$FMV_u}QkZCXro0U?qsR! zVel!K@u7VPkc|Q4;E1it)w6KkL>YWD!Z_N1{W*>fL+bNEQY{k4D0Dgin{s@doDo!= zj5Ua6W?S;ZF~x)(lyk@V8`H&`679}he&mj{cmk82QSf;&h$Y>7^ZcXbDC0fof}`t4 zkcNc@!Kw=Vk^q8Y2G<2ZmwF;G`0K+*IO{5$JBr9iB^?e~=~=^*Tajm48Rs+d1Lrb4 zDU>{sfe(3vCJ8~l#SUv7!R9BcBd5vexfwo8Cfk>Z<&bONW;8Yh8kINIGl7-uC*D<| z?S>VQYPf=ErSqY?-ht50JH?`HXoYCF*c^`V3VfDwRPePRpUL396;re_g9^oPux{(3 z9q_#o$wCh+J=<#;mt`CizTMc=8)_jv8&V!1&(6#oVds8Xr2b;$<Slt8GlMSD|FArE&^P7R8{%q;pfR9_kcLQHp z;2j~K@11KMm{~en8a$klAvwW=d{8yl*LAp|$J>D_n05OQTMYd31pnK^|DJ;3e8}(I zTROZNh?^mgpQ}5cx51+pbMcbQTC1BS>!;G?-^>9-T|5$xkJS64xil7>GAL=A z1?wbfk;IcKMln69Bn)hSQ`PdMx|@?94uC(aHz?F(-;Ce=TVAMbjG8OJBut2NkjE|R zMPv>vZ?~8kFQQ>G{oj&1Tcl1rkHC6BsS^|aQ>9L% z07ODr|0|DHtT;*P#FBNX6LXH*rA|`lZKX~GHI3AXrEe{DVpVj^)z?XM{7vel9-`^* zF)o))qLvojF;XWE)mw9Ci_{65R}(tn`#)9Y1OnVrF;+bY7+A2`c24~jxAf{Ol}A=VUs8Rr%Ifh3bzzH zdF4s6Cof$WKzZ(%;jR^YTTzsQn?@exHEu1G^6C>MQ(pWx@sx_B^!K|IPxUd#WmKMf z3(jqkR%R17F=b!>sq!fh<5pWRt2Id?Mc|pq$4TD4^YRjJD|`|>Cs}%|=&i+#qdIA~ zW#xVoFsV>Uf4@rs6NsNnmN<58hDR@vpMGNN$D^S1^b^)WJ4~--4o~1z*ncsq@K(u- z(ag-|6CM=XRW+XcBzMcUHV^ig#M@~ar~nQR?(dM4OKKOYs23L;0{;7^_vmjtXYY%f zVZ3o~{w;~`3y!<{INcWS7x8z%x4HW1XRyaghWWizeqUbz!bB~1-EniA7qW3t{XTEB z;{y97d<`zH5Y|_|czfFX1@)piZ?=08Jj|gN&jn`zRWcdJdtm?JZUyiGPW8Si8QO*;76}mgW8nfz< zgBNiCOld)$k{>BgMY+t^g;mYnoCD(x~xi&3sK5(SsdKRuw z(?d^>?j{A%Ng~H2fn#K9!Tq-gBXJ9ci2hM>gCcgp=l>qV2PIy!9-IjA zM!Y8^2^xQo%}WfGWk#ww{tRJ&&?L)Yu;!P4{%o}1j&utasKzP{h6tE)^S3H-)+R)% z5RpK!!FX*U2zlHWkbox?)jEyf>Mtp#TpZIUPlWt2oMG&cH#pKpF^<42xZ^-~MWKHx z%IVl=-M4&a1_^qUc222EhxULW1HMFJD12Xk!qA=I`eCVDwJ0&Mk1IruVc@xH@zeYF z!3?;$hsW#@i=(>vVEF3C>L=(p?zWErMCv76LnHLwI>Fljwt@jZ!>t7Bq`il4{uT6| ztNmEO0VEx>m^M^vd2K_22pLwn^}J#%!{JNf~)fx@jINqC5H)bts>EEMmGfZ&NEJZGcp;qERE&KzM=!1;oooV(~s z$qyS0hrn0DZgH{EFhsJhB+l`YDpFBAcFhy~A%NprhhAs$pJc=X|FCz1_&4?>;LdBl=!z(Z;sQT z4G(vTw?GDnby)L~w+vhpu(@tcGsNK(l^lL_xqq}ca!?R5N6IHbLox|G{Zo+MnKUfob{V!GDt zJl#ZufEdmXnuP*b!Zs2EYtm7Cz2hXxD<&cT#(+;tVWZzg5+CDDRA8%HWNoZg(5XljFFl`XXJgK=d}F5h5GL%N%_1Lk)=ef?q1vL4J-cpQMsH+Buxa6f zFfTIQGWjS>5X3Mz?1A53;tdU6%&NZqXzAlWEqt`}$w%{ibq%k&p|1$~j>Q$x$FaY; z;7ykG`(3_F^#|UC#sH z>k9D(dq486VuWItS=!m%_$y;DJ^bwfh_?*j|CZI^D?9o9AH6*D#x3#vhfhEKIDPlW z-vL6-N1v`V-v7D3f@gxN`)}OhEh^qX2^dz@@6N7Q@RZ*V{kBJqCgtCv$zM~^-@jii zBNWc^=nRwEZb{+2Lzh%t#3a^N21H2VGACYIL@_Glmq&eQ+K3M|>L2$OdnYHoqidYN zjgAoA``YBoBfQY?@#6hY7w`WGk4O|Bhe)4)$R2#iA9H9vv;kLAR75Nhu@ydK=} zsdA|QTrh`yycGm9B&6A;yv`txFT4gAB;g52Jjny01~bX zVlRcF@A$=s@S?-m_Z)!OTRj(w`dnICXvsC>Vt@_WF#?G8&#}Uw{5KfADc=Y!gC#L* zPlFmam!AgB2M@LDuZQ4eP(Crzz5D@TTC0O=JR^$NMW5mGo)KK1~3IxQ@CP7%-n$^7@HP9ch$x zu{oDLI}0Ncj^HMlHVQJzyTkrz{}TGeYk8&>TYbJgvv%J55wjE=v3uTs*{wbw@SoM= zqoXBgJxAS(tECsiF91MI`YX`Y5S#t(-Fc1BuJ(XC_a9a}^0F3933$5paQM3V?r(Qs zQeHgkonPHmivszM+UW2?h_WYnzn)v}1p-)bY@SNLI*{`<d_Q>|IvTTM$}hS6}FqDtO)o4+6DR()+qv3HmiwjseEz z6%Wox0X(lO!XU0QYzdtZ$gGxhLefx48)QLVI`p!9$alc!fVCqiN47*umsX)pRswMC zn=Sq2tS5ro(_oPTgyU)s7s!?`2lF8NeovI-7dJQ$L<67W$D+TUw2D|uOM~Gln3YUI zh+;Fp^Jn?3JoQp|>ZS3NaxZ#7MyT#&3+ikM0^|O`zT#1(c(jVz9MhWlPKURar~_z+ zGytD9|FHVn)qZ0RtXn$DG|yQx)dkcjs`&8a2-8Q824-N>gur;>Oh=u8;vT`0mS1#- zhz6E^y!d-{%55Qe00ou+esMzgzll?%V%b`W`P!-1&KF@4FQy?g7vp{6zqaf6PQK zLW}VuG-^or=@=gCNMSB79e%g6OgJ^dYwJkXo`2!@d%r_RSuD6L20PA-6Z>8n zWXy!^vN-XLa}@ysGzN()31d%^@BThdRd=86vuOcuGbRp5=k!utU0qvOSG$xKNgLQ4 z{u1j8{F9S}%M81{SLPqY;dvXjS62v5Ud_o(O(a=d6m^2-ft4*62ZEjb)Iuv@`ryM* z7ux@9A(LJY{DM~^_6NK%oIA9_tF;>lE%M^S_Nitsqh-PXzsB~#{?5TZn#`&o!d&`7%%D$CTTrGpH|NC7gq4gO9sNt( zrzga#1MeQexNN?Kh!vzA^a&=4s>T31zd(AWzUf_cu(!$qfUCHRRtML-Ij<^r)PcQ% zdSvWaE3^lJ9n?U>LFfX-CMK0jHW7v)H(8x?q@_gu)8(A6@&3r#Nt1w$-Q}gdDeVXdxFago~}Jx|ND;{n_JsE|Gm4nfAIXLpI`h>^YG}nb#i*v{>Q8H zi%$3Q|9V*0udm;{{U`Cp$?mtny(KgUK0&DSa^E4T3m!qUy1j=RUEdT{KT&xHoy#I#v+I@|*4x9^2Hj0`wiaI^f>q zy_Py+`<<&tjZe?|~ z9=AcOZuz4q_(fZ|3Ibwa?$A1dl(Q?-Zdyu{nmcy}iyw=%xeZ57JasJ@UvOEyRdv$s1xc6Bp_!02vn{EZ+BkXRAvO| zsN18-0)}eL69`c;p(rV-w+^nsJ7FIrRX`Xt`l;k0WjQ=e#9OowUcUTl5o>_7zxcmj zEgsvC59Oo3uMO+st3~q=1!JNw5{eXYXP2~7ttKOy2GsKY01htdV*r;IDk@!4?L*j1 z8!rhe#3|Bt6kvfR+8X!*G>^(WxH4qv z)g|__T5~D3?6nB1rPyLIOF?gktP*B&go2d9ZN2C1OUxptk$#Z&fB_N+qYx)Tl@A@;8j#JX<}!di4dOXe zoeV4DT&9`2Mz3{w&UGzRAtHdQ;Rrgo+;6+SyZ*DRk84qZRDf7e;8k;CL%e|^tecpP zH)x@Ab#X{_>I6gso9Bq~#8mI!{o4aTZ5xorA1o}hgE{lprN1rXov}~9bzJhiPX*}$ z)JAnd#wk71y+Z=!n57Ol6&MSsR7>G zaemnZi?a?U;2zeD$O>3w^q7F%XM}{bF>E*?&%!O4!$+e7|7wxkO%M`-9jO0S7ZKN# zE&$p+Fhwy*;^q|pxt{`vx;gkQ#DKGdSKpEwXh;BZ_p!>*R<8%0Q8gG&vJb;i3aL1k zC@*ECvcnXB6}VH+uxxa~RVVvW(3#Q3gugf@5Uh28NT%Ivzj0i zUlntz)`Y`GQ&2#tuPj_S>Answan5}XCy&Waz=Z{o&2uq&;AaIwQ4zzIHekGn*TK8# zzyxYoLduE=7jSq9wu7rjuOK^qvn=P~9qs_TR=`ZvIW6?Wb@9D%yvZpVXHBd~-wj|$ ze6j+`bKSEx57heSyo9CAAxssKJgR5%mf6eJu?uGQ=BSTse_7?dqAwS?xWre3UXsZ` zbfbg`poxVmy4^+0BD<(v5SG}5FnmRR75(jkyWvZn93-jAaw+oJ#h@yovaXypC zS5@aCC*x|TZwahfTsDvtom0^*>5uA4|6e8)8Z{@bBwM*pj|;rrZb1ze&Y+q~b!)y< z`g8yLl^x2%IY-G4=PDU3II>STEqN^%rA1zDo7+aJ5l>nF7VNN1Hw|Zc9g(2tcluz7 zp5@5CEtpFOV){3AG(8o5MoZ#Z_gd7FF7*R?J`9=?PYYd9Bq`Xll0t~iW+5?gJM+_# z_PDZQzFW8pK>$@2Y!bhumg+Um1W}KM?LwM)m}&=Ir=Fil`)WUe*srl|a|)1Q#nEHO zg)abmz;as5d8e(C$n1a+Je+FjOrNaF$d+_uDnwk#6r@MKF>Renp5WuU*Ss{c!7Az# zxH7#kFU4Ocz-Jm-SXdD0E^m`&P5d0+$eo;yjtP6OenTghvG^$%$(zRHOls#qc?#Ip z(gJ)Tt;=Qnd3i_n{(s~5d;0jkJSK-3lb_v)n~@Wdk*R-W94?k)*HaviWk_?Zw_!U|CyDQ74sZc)BLx0?*k1jgueh%^rFx>At;bSF_b=F zfH1TY+rpw>!v&*Zlr$N{S%wgM5tyJ9aZk$@FX5z{9qvO!;^TfXDFP+V>ok5RFPV=& z>~Xq37O^cykmNW*<&7Tb!C{3rUbVv+FE++P)XYm;rK*HX_txPE3&mSl+{inZufLHG zjiUH*=6|BQ(@y;nup+mK+09aVM4*e)@`Nh{`uj0aEZ)B+yTA_|BiOuvpArrZ?pI^_ z#g%e_O@U6kkH}iP@r)@5cWnCD`U6_6cEfhmrdD;>LP4G#HLnyypBZ>I+_oxEH2}f` zBqIv?nv1FSnr=!J9W)p?ACik<@hc)9C|t0fE&x^3=C`003@izRxkglj8t0%ag6;b6 zbgz9QZWZ+nO?_^GV&6bXM|YRGI+iUaF;u~2i#p)7DuF~(Fk~p38m*9~^_*c*X#iXv z7F$He%pr>q7h48XoU975PAE{Iqgqd|Z-Z*5Rd?w=j36W7fMyVA!{A%nyp4& zZ-z7A;V|%T^fHq|=mS49Bh9#(2WPXRLJeF1A&S>oLft{F5-_2&OG5N+Z7482+I!mR z_ULSOjS&A-+|l%P_X;;l>XtA!OYOlWMa(5g`$(7oY9_YV(xW_Ll11Xk0h^V!x1`## zR7)_R(4?w;o2hm$(;KlgwA%elHK|0>%3-XwSG#jW3vrc?ye6L=z8^;h;BcId5ECru zaI|*ztwJ5Yb($7CQp+&dm-Xx~-%1Qe;54TMmL+&(183%P{PkY^^}d>cKnkO-q`Lqj zkt|7I50+in@&p}WUxSkzoQqB1uJE|zC&IKe5T> zl&f6p4kH2MamprPq8`y4z|?6X8Ni|NLAPImfpc~J@~c}mUU7*!{AJ4gI?Ds-;#r&f zYVILEr!}ASK0-K|r4B50WE5@2(}(qCr%Q!KRT<~a0_Om46OXHS`@Kx#b`|0d-F6tv zyz?-u7?U8;$?&xz>^KO0fN+GggLDMj=carg0WIJ;;HQis4I(Y90m)b}7>fgX3=yjb zTy}dB_?zr^i#%e;2*i)&#AtDr5l*uLhjo-)_qbWjsQ?$Yn?+!hoJGoZ4JMg`EIV!X zxJN1ujd@XuWWBk=;|P9`W_Q&i%?8PO*~W%$b#S5`>6Pq%C@U7_=&L0jalbP^FQG3g zPFgtP>qs8T34&J9Y(m@qkurcUjfLkoX8c#tDoW-0)4fMnwy4VmiHH|`vdzk-&sTT^ zyh_{iT~UhBOVXcsIN7mnw4{U$hvSk$&=VvKlLl~)hkZC+AuWSC{KGb!6rHZyG~HWat4>XwGt`MRxgueF(dW*~d2U5jQ0TIoQrbAL51O ztm*}@M%=|#x5Ij%j?le?)lcm)-bR;QbhXwYIGwKl7IriDoZ;^{dPt`QuQUq9FnswC5Bd1v zor=@6@4S3y;NYcODqxyu-HCvJpGk;pTreG-P_muCZH~NcWMXtIbMw>Mx8?k}h_sM< z@&Z%Yy0zQ5aMN&WV7o8=W?22nnYeS{Xa-}w9LEUbP5 zM-;5Zg+*Lf2QUU*^2Ibm`s#Nc3D!up`2;(E;wBs6X0{K+ES^MFg$B^-WDHGwQcH8o zaFfKXB5zL;F!S%m+hSZS9Ex^LW%20JhN-N-Zw1Xu#Lw!OMD=^F<`qP*u$8Z6;RA{4 zHIX_dLS()ks3h|p8x-}W`Q`5X-+q-}v!=q>{R(6EEAZl({zHVfEFtXiA9VIZYx#(TI6u(4~v;wa%ZsMGKv0h-DJX+{*mg zMdgpmqWqp;Ys+W;p8ub9e#UR4#EC5re3xb6{v<*!RS;7wCW!96EAxb8-%{_T%z{5i#A>E>r=CRR25yT9+WPXy= zf^&k;d@fv1Aw1~3f)lz!Q%p4Hl+)izn`>xXaWzrMSC!C%J<`1LGR5*`>7`-)HN`1m<} z!^d=(e*#!W$^QVC8w^Ee37DV*R4LE@z_)k*vb22f{?hV;`wy5WV)^d3%gF!m?PT4J zSL@$A|HF9mzX_Y4TxX$KlqMq&`JCVf5AGM_|G>+o?^5%>{Oz~PpYwm@;qtbh?HxS9 z_1}94rboiR|M!`l-!^_f_V&hG|DcfxWB}KHasD5^P4j=G%=qpz|9>B}GyeRehF1s{ zjz)oz6I{su@7;Uw?SnM`zrS?<-e>+l3T|&&W)XXuvt|v>z6Ay! zlwM1$mu(Wp%@M4Pza!-J+1smEX63BgHb4C1>{n$9zT6tDq!RE^JmjIckHX2f9 zqrO?++Sf9hATcvFg*F@ZOd&36>bzFx zL9unPu`wgb=%=Rmc75yVcD1sH?O<%m|MGSJ*EwvXzQL#CUvYq%V^6-?-u(l1Q3W1m z4EkncI`GC;ZL=PX-i7ZdSu9U$OI4wV;|b?l3ub6kUf>Qpulkn)V6lKen1Ky*W7qms2XV}t8H;zU zs^m*PCONZlZT6$n#_Gwp{Q8JMkq(JF&{IrKI$2aOlQIfY@vQwBHzDo&p_g^w3t6Z~ z?jnl4Y40`fvXOQ)N%mNz7o33!t+kxM+TnS!3H?m?)DCU@!~?IIQ@Osk2EUzY<=xn zV{fNkU-g9xN`a~#uW8X2gmi?htxf-LD!qg%)p zG5!1Wl;HU8-1OAqVq)5A+#4?XYc9S_~l=4~rqj zXo2Z^v7dhlxz@6!lNpi~B1U8R$_rRmnJ#ZLv-xF-$$>JhF=)1;O zYCC(bSS|drZoe!pod$rA-je7KIWqV_LcWJq8Qa3IBv$mznqnp1AwgZ0hYny9Pp z0np_>s=CZ!;mP8nrdW0Zry{Eb_P5v8IJQ3-wH}x{q5?ObtZy~;*4MUb8&HaCPd4hL zvpx>I;4oJ}X~x(>xYwtSOD`=h(vJ_e^o4=inSN(6mVON6A8gj=j6sEs8f36`L~xx6 z$XnBBI*{rOs9se+LSDDF7$*Qo$iCn_kI_6Q<|)!qfbUsD+Q5Q%@?yW<*xrRP zV;(`1gjKq~zd?#wU9W9%uiTq1d>|eSM6*VvkkuJ?C20+?DAls_>m>!@2Mc>*J+;>X zr5sJ7ORhmWS7lYHDo3)<}Y!Y9BCnq`>4D^Jc)L)}Agqfvqdcl?YJswzy z9P?+;{B`>n5$&$lgZtlW$Db0=_m=a321bKneq?yQhrIHBh7qU|Oo0%=z2#_r$;jY0 z#4H`+N-Shkq-}-c%&;d;z~EZu&+lz>(Y#p{m|G$?)l)3tPC{~4(XlPWl(&4J7>P^d zAZGc#BBnALO0o;^qb7@`2jyh3^xziB;^X8%e=WyA%=d;9fh>!e#454u*-F7uwymyL zW!rDBUL$8rF5$|0U0%BX-TlAbdvO0dOpq^l){-q5$6QNFo-jMK<5Bn`${z*7-9?Cm zr1iz6uzigOBU?COs6X6N>-U%MI%fDO!vEs=l4s_hB>V?2a^dft9wuZFGrkh4c-QoE zczNk1Klrbw+nDc$Z*U3+djkDezS`1*@0OMx{Pk{9`4s+`PF(20x65IP!}F_FTmXSY zNdq~O<^H|pr986!mqlxYkV!C_otH7t`l)cc7x$N+Sh9dB{YmnR`}e)Z9m4zdD2x1v zH|3x`XL82iJ^!+lAE9j$yk}?cGx7twxs>vAXfkICvKY=%e`w!yu7 zyNEXlAJjH}s=YuwlY15fKs0cwUory zXu2X|nT1yCPY%`^E165E8V)5j&v`L&Nj=OMxS5$vQArOOKXGS$qtm)( z@UYITy%h~$>nEUIYI|OYQ-x%Ub4bTYl$~n8zeIonQbz))L^j%5k?U#f*@#sCjLzap zW4V&fgLZhEd#8{4+qy*N;`{z_gUh4u9`J?CmBSH9`eiJ-YwT3$9kWs$1jWUJVNVVk*JUw=hfHox?|N8dlKvwcBnZ%W z&dF!FC;6Tof=Z^Np#LE#kW-cxTHKQuqBofA;S;HcCLEYIX^H&5p_*6>m*cATDa4(P z0_Q~;y#_AwYz~K0T2~e7UA3;d&pT-S@VtBUs%VOU4#y`%+z&^^CGQpU*TiuR(-x7j%`r%Ew|XdIGwOXta6NH zcIq_Nc&T3Uh>f%gktwv{Rvli%@+}Ff7a;%)K$%#@BBTO}8()Vo9$n#5l>G>9(WmtB zM9#gMS$70@Vy>hM{T+7_jHGeazrkP}$~as_yEP5;ykbKP2%veC(j!nPJqDto2p1gjrP$ZzAxH$^1Oy?A1=?YPUVh^mQ>>TX;3BN(l1&#ejvsE-a@hv zBtPsJ*gCJ6EM)0#-~DX?2z(VK3z;)NbvtKonV1AwMa&P^XLpyFQY2Mq56U%OYg>K! zvT&MhtwQ2YA6uclsK;OAaF9JC)~NB6QPDddTPl7nhnR2xiPnTyf_7B>0|0CL&@`u0 z^8(tZb|^=i38AS{>6_u9H#@;n%^Fx@__``m{E@l)y)SBMp^o!IYFdUx`@aYg;h6mI zMZAfUJj!H{cZo0pTv4Y2j{CKQXN zvQ8HT(xcm>eC%Ex+1hvYbhG~c6Aq9m9{if(f!!~Z{xZnIp$LFp@Dgq=WSfA4;p(D+ z%RX?w5p)(i1=UKE=`A?BeGWT}KIq!A2 zF`L*2iLK*8-ZXpQCB0-Zz`+zVGT;^~kuFY^7e+V3nV;f$`1nJ0OhU z0EEgun1h(67@>#{ZH!376p|f;k0GOZoKRjYF6t}XYN&OXuL7q7q&$*jpe}e{f3QMD zb|3F>@xV2zazs~Hh{~n#97DOdG*z-ytQmWNpLq^^st;)&DK;wh-sySXEPw73eSDL^ zJZCt?@{=y?^L^OjIu=X?29jHY<6%05WOPCkQkK*vQ$;tgxT~EMMBb#W^{q8i)l~~G z)*Sr6JpVao_P4hi8@2y=q26JsY9KCu`MM%aFt1AksggEp`=;`%W()b{>nn4J6MFdj zD}WK-tgR>%#wxYlwY@5k3k>mDm?p$wF2s<2*5RW{RmOs&{`M4O(E1I=^fj(F0zrZz z0d+o9slMeTBq%?m>=gA6afu3Y#&?TSJQl1DlBAzU&@Km(hr;!=@>sH?Iq{RGfmP{ zlhfiEjt4d12gad_6R}~!hJ(}AdNMue%AZfq^rXq9@;ZBsq1X%`1q1Mh+{b9OIkZ)O zQhtn9+j*^$k0jXUfnz357^79%R@U_wB06a^IkP`TtFNJzz0Pab9r_P|e$HdT+BR5j zLUL;2W=Za~wQcjkmD~YiwAL(bO_C3c(ONsFwJ32xFz#&nf((M4^CV}P@XEP{nv%pd zwnGZnV9=4vhA?4INQVd+cuqfY0rr`AA<3>Vb~lm~1FIidF$(*TECl1UEH0|T<|K8& zIL(QRs<62vUBpAU9)P8gi@0YH1t?XX(ZPf1!e z6=w1|VTMWSkMU<$q(brR>RKLac7I4q`eb%#lIBftUN0j}aJFLp1ZT_n2_AcXvu%w% zzeP=WRVC0UeEybzN$cJ{bSdEwB@6PME=6mOSnqLa5rzu_pGE4XR%HHEg==y0NeWvT zdwQ~!{lo-|&Lz%qa}bO;oL@HuMa=Mq%VpF_@Y)|HAp|df62cObPeRzr*pra0oHGeN zSy9d;*v%z%fLf7MGzm;(lP{5^hdiDYH($c70=n?ZGA1FcpFasg(i?vyI6@eytpI23qJa zwAu`xiLpIg1V^ophTg=S@{HXo{rRX4yODRLahX%ov?C8E6u2t^b;dQ)l6e37Wg88^KxMznu;(PtU7mn??#WBTgps6Vb zWoq=1{|yLW(RkWJJ+S<6Zc~$>`=FU2ZSvtFayF?*F{9y-W(~J$q`7~ zH*;I09b)DdNxKLmA#wY$l%OP+xFga|eE1WR_76o2TP>lFowP%X;ZrUT0-4Kkc65h>?40T?*+M zG(`!R-(aUv%1U-m3>b41=Q`0UZf{O`qkCtYVgqu>j2FH!FbYH)&3#b5>fxOcp)Pd+ zl~fXbB~NgfirQWLW?K}{+$hm?uqGrHK$=KDL^;>HyywuR2f45XE+30E?IW>YFor}7 zYB0g)S>U{u%!0&Fq-Q}M-pVX!5XR?O7%~fOl6QI*?@AfZ>x zISakio0>AlFU4RPX0P+0XSb*`7o~EO-r^XRY)^r-nXnrTV^OLO-KLgP2hPJBG^N~U z65+zl6|g+icRCB4R9}$q>70nmRF7-1?FQOb5J0yfThz8_p?z=UhNjv`5Wk-@`_|q$)=t zUCJS_wEXNQ`#i<2i1)TFqHErb!)?ea{ZC}7hub9@321p_F#c>AU=U2(f+326bZ$>F zh~`~d-}XTsZtL(+CXR8yG`7L~E4bt-;P`m~g)<1@$BkwK1`u|yJFQ;-tbJ+z^FL)3 zvhCXl{)-ro(Xya|^-8$`te*Yrc z&6XLDcC+;-q1~KTf@Ve})0{?R>7};KK>Z1sruNX17(_a1-z%m4Yp}?2<~SZ{g={sT zhKU&ByI_S1Q-Hy>*e7vmY2JTH)LAC?~8LO#H~aD5@VcFe2qd)eD4L!gjDB^zdEKOtF6dNpqWI zH!dI*JRFZgl2*pj+F5OUdhnfr`Ly6yWv@m3(WD-iJK^ZMgqXZ6X6T?z9qCt&0 zEQuEef$+2)5T1x`$z)-Zed4{G&#;#-uho%Y6ghd2F2_0!IMHrI$c^ONV^Rc71VYz! zqkV#7O6_w~m86m`@Lw~RpowYO-IjOrkB{5EmR#=0V(gt6YI$X{IIvhau}EgNMKd^S4iMam1P=q##HH6;Kl1U*j_%akEG8B^-0#XC5Wy+zT23+! zJC5%lWe$yLqgOxc&Cdx|xW#`;-@QF}srf`Cvj9>`3gRTYretWvkVOkbQdtqPsmK8r z>M-m8l!|BRH3_oLNlxcT!ObT8IqJWm4=47*sd7p`k$tByVW?hs>njTzvSyA9E8B~J=q|xCa)Ak zOBUP+MRB=D8-H~WHzH7hMaUDB*+j0<7P} z;Jyx17719e7Hob9am_$#4lkL|B19^CXI+$+j1V~QAp7YqGic=Y)0wjUYdR7lNs}Bu zJ=j{=+2741H%2Aakk)1UUppOPbh^pG(WMr#y34s7lnsr!sKnSGvZzWl4(B})l&4md z^&{x&?k5wV3`AEH2NW+St>uaPX3I$%8?u~IJ?1VaDT7nsvS#4N693hQTvGzjsB6j> zc54b)C*~b31xq4A#)Qi%YGcf071fnxHGEZ}&S8WL=V(0*pH6I<|3P4r1 zMp97bNxPH0r$@rRgH;zc2=mq5uV9PM7}p9odDO6!P4^xZ_x;$S2@pxKY1llyRtM3j za>WMy6q1=yzBZ8e>=jgO7BE!-1iUf@^Za8m1KlMU)=o_H%kV7_7L9lQadb{OQ#X8@ zt?RC`P%FJ$o3~|WzK5Jkf#9#U7^NLon0P=-PPQt#+DwsoejeNi5_L6a!lZVP95_Nu z>^3i$VeZJDVy;;Gn0btB{yX_-PrM>6=-{lS`Fxq)7rqK4hh=h1rGBbll0h?@1YpkC zi&^Bjxl0X@)P$pBx3-DPcxtOZ?XK_FDWoPGV{$M#J4`u!T;T!bc}c7{kHmT$A)gp| z!a*$<`}hR-Y4zw`IO+CGT*#-zMR49)W3%@2`qsWAvy28B0E1GuH%Na*Iy**p#<;>W zxbw_t#}SH7YhzM-a+L|6aynVUU~1zMm|l1ilevvXmGpkAgYrjYO9sVI6hA0+0;pM% zKd87w>7bI{Z*@@qaAe7#cvj61N_3CXnTku44l3#WRtM!y#g&W+dmw&D_>3gtjub

J9<@O|Ct2$J(sC1a4YEPfQvB_p;?H&QSjT}0y0=Y=-RMu?K7;|n0Uo3u;h2Q!MHma_*D)Ut#_sC7-lw|RcvKkE(>#_NUZJHT~vnqUR_e~<(wZwOs@Vmsn0 z9(3mgx$~B?IU*iyu+CWj)R9SL@9Ofh+ZzaVS-EJ)Ia`tgL1ipLU`dI#f>!yaYO%ef4~3_YgRyfF5AF2HdSJtJ|u zn#y`#y>4pG2pZ4F?d< zi{2={4~_>IX;9PPVEzb+Mp(I-9pP!)^t8fo7A{7ZLkp123EMXyEaT*W})l(FZ=xG>*g!$(WTBsyU*PwR3gjwRC6nDm{Fzvpf?eb4j6OcxnG>#0tpg{f@P7EA%JR^W#r zt|Sbv1a@69Ucq%s##?x)@#v!QZ$HpESiL6sekwU_$XGq)PnqKe_X(`KIm(GtpXS9okbb<4{ zXovv|?pi9sf6>H=E(Cx*-$s_r#*^*sjd~3?3t3>cwzpvV;NDyN-M&}9=P09h2Tx1J zf7N*p7_gmu5FF^y&=L$dwfr4YfOPReMsE+RmJHvU74LBT+Q+RTfV!{TE@T-&6!~XE zwSvgM^!Ai8a;%{wdd`>TC03^TjTMy2TzW_TwQPI0YG#5>`Z6|K)N#*fw{re*I==W3wG`^CENd**Qdi7{DV;8^1}z@9IK}<5_{7jrz5Fc|{n76o zF@_THP!hW*LA1KiupNy3R{J^|KGf)R8-r#~mSzRTpnh<6B=~uEg(%7o)?^`TMJ5N{ z!HF`RvI)j92QQLkATYaF@SsGpMvF=$^juT|nytN?$j58t^u$sH@I)}X@a0FjyQvss z06n%aF=f0DFnE|r%^Yp(C7YFTtqUX&Z{xBfw6_#RbThm*efbg!(W@J`5EOG>(&BRB zfz+#yatn!0gE!(aiu(~+ocjj84vS)&Cp`~LDFk%sY3#ywX#A&&L|FF8j{zi7Q%DZw zYJ_ROfl9&*=0{qV4cVfaewQ*;vrU*vYx=FgR810JX+^gIm#UYW=q)u&ZY#(=Y^WOz zRCb?;9!O~ko(4~8_~dCJMr337(J#6zy5r@Z zeXr9+V>*8X^xQS{Ha1@%0ucnB|3bJ0j*#%G(+sN|bP-R}=$@QV6G@6hEx(p{VsPcd zR-5O4QruQwpY<7(lV74aq=6R5huNfXKV`Q0X69|V%y%(MF3ii!8g#V1+BoU8T8Zop(xs=l1*p`q8J%M&Q<>VH|D|gC=Kx1)>y|*e zbI$}*)%|lpQO3Yh9k>hCgqRh@K>C)}1I)-B?&; zZedx#qZXFc>7NzAOJ9QebP1FxvM>5@vta*hJ&MSd-p;IgK_mbH2bzxZG z3=hTiFS~F?g_pM~&r@^>2P#vqJ_bcD;u|-WK<`1cgtBL-kozowG7<=}o+;~yVhER0 zlAH3-q#i2`Stkm(Q;Uds#bRqBSof%l4Q7=rh{8`Eft#=;n{8^h{&Z#gU~9jDD}4^? z=|-VrPN|!=8a82*BXWhS9BAl)zhG?GTYy0)a%Cp+mTD?IQ-M}@rjLLnXmr_w02o&NuJLe%qJ2af!^DmTUeCo0M)}>W8 zFHYQ5X&)zmVIRUnCkj`ubq