# HG changeset patch # User William Roberts # Date 1279812960 -3600 # Node ID 7ce29e50e9e185ab81c63aa7f2dba2771847edf5 # Parent fae53e47b8b44cde5aa86ce20b60ebd3b890596a# Parent 29ecd5cb86b3b39ecaa858429691d0da0391ba5d Catchup to latest Symbian^4 diff -r fae53e47b8b4 -r 7ce29e50e9e1 data/gst_dll_2001F41F.txt --- a/data/gst_dll_2001F41F.txt Fri Jun 11 16:24:58 2010 +0100 +++ b/data/gst_dll_2001F41F.txt Thu Jul 22 16:36:00 2010 +0100 @@ -7,7 +7,6 @@ libgstdecodebin2.dll libgstdevsoundsink.dll libgstdevsoundsrc.dll -libgstapp.dll libgstqueue2.dll libgstadder.dll libgsttypefindfunctions.dll @@ -15,27 +14,13 @@ libgstwavparse.dll libgstaudiotestsrc.dll libgstautodetect.dll -libgstmad.dll -libgstvideorate.dll -libgstvideoscale.dll -libgstvideotestsrc.dll -libgstavi.dll -libgstffmpegcolorspace.dll -libgstmpegstream.dll -libgstmpeg2dec.dll -libgstsdlvideosink.dll -libgstauparse.dll -libgstqtdemux.dll +libgstsubparse.dll +libgsttcp.dll +libgstvolume.dll +libgstplaybin.dll +libgstgdp.dll +libgstapp.dll gstqtmux.dll libgstnokiaaacenc.dll -libgstlibgstqueue2.dll -libgstjpeg.dll -libgstplaybin.dll -libgstgdp.dll -libgstvolume.dll -libgsttcp.dll -libgstsubparse.dll -libgstaudiofx.dll -libgstmulaw.dll -libgstalaw.dll libgstamrmux.dll + diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/bld.inf --- a/gst_plugins_base/group/bld.inf Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/bld.inf Thu Jul 22 16:36:00 2010 +0100 @@ -4,166 +4,166 @@ PRJ_EXPORTS // interfaces -../gst-libs/gst/interfaces/colorbalance.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/colorbalance.h -../gst-libs/gst/interfaces/colorbalancechannel.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/colorbalancechannel.h -../gst-libs/gst/interfaces/mixer.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/mixer.h -../gst-libs/gst/interfaces/mixeroptions.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/mixeroptions.h -../gst-libs/gst/interfaces/mixertrack.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/mixertrack.h -../gst-libs/gst/interfaces/navigation.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/navigation.h -../gst-libs/gst/interfaces/propertyprobe.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/propertyprobe.h -../gst-libs/gst/interfaces/tuner.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/tuner.h -../gst-libs/gst/interfaces/tunernorm.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/tunernorm.h -../gst-libs/gst/interfaces/tunerchannel.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/tunerchannel.h -../gst-libs/gst/interfaces/xoverlay.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/xoverlay.h -../gst-libs/gst/interfaces/interfaces-enumtypes.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/interfaces-enumtypes.h +../gst-libs/gst/interfaces/colorbalance.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/colorbalance.h) +../gst-libs/gst/interfaces/colorbalancechannel.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/colorbalancechannel.h) +../gst-libs/gst/interfaces/mixer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/mixer.h) +../gst-libs/gst/interfaces/mixeroptions.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/mixeroptions.h) +../gst-libs/gst/interfaces/mixertrack.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/mixertrack.h) +../gst-libs/gst/interfaces/navigation.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/navigation.h) +../gst-libs/gst/interfaces/propertyprobe.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/propertyprobe.h) +../gst-libs/gst/interfaces/tuner.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/tuner.h) +../gst-libs/gst/interfaces/tunernorm.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/tunernorm.h) +../gst-libs/gst/interfaces/tunerchannel.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/tunerchannel.h) +../gst-libs/gst/interfaces/xoverlay.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/xoverlay.h) +../gst-libs/gst/interfaces/interfaces-enumtypes.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/interfaces/interfaces-enumtypes.h) // audio -../gst-libs/gst/audio/audio.h /sf/mw/gstreamer/include/gstreamer/gst/audio/audio.h -../gst-libs/gst/audio/gstaudioclock.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstaudioclock.h -../gst-libs/gst/audio/gstaudiofilter.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstaudiofilter.h -../gst-libs/gst/audio/gstaudiosink.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstaudiosink.h -../gst-libs/gst/audio/gstaudiosrc.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstaudiosrc.h -../gst-libs/gst/audio/gstbaseaudiosink.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstbaseaudiosink.h -../gst-libs/gst/audio/gstbaseaudiosrc.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstbaseaudiosrc.h -../gst-libs/gst/audio/gstringbuffer.h /sf/mw/gstreamer/include/gstreamer/gst/audio/gstringbuffer.h -../gst-libs/gst/audio/mixerutils.h /sf/mw/gstreamer/include/gstreamer/gst/audio/mixerutils.h -../gst-libs/gst/audio/multichannel.h /sf/mw/gstreamer/include/gstreamer/gst/audio/multichannel.h -../gst-libs/gst/audio/audio-enumtypes.h /sf/mw/gstreamer/include/gstreamer/gst/audio/audio-enumtypes.h +../gst-libs/gst/audio/audio.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/audio.h) +../gst-libs/gst/audio/gstaudioclock.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstaudioclock.h) +../gst-libs/gst/audio/gstaudiofilter.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstaudiofilter.h) +../gst-libs/gst/audio/gstaudiosink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstaudiosink.h) +../gst-libs/gst/audio/gstaudiosrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstaudiosrc.h) +../gst-libs/gst/audio/gstbaseaudiosink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstbaseaudiosink.h) +../gst-libs/gst/audio/gstbaseaudiosrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstbaseaudiosrc.h) +../gst-libs/gst/audio/gstringbuffer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/gstringbuffer.h) +../gst-libs/gst/audio/mixerutils.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/mixerutils.h) +../gst-libs/gst/audio/multichannel.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/multichannel.h) +../gst-libs/gst/audio/audio-enumtypes.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audio/audio-enumtypes.h) // cdda -//../gst-libs/gst/cdda/base64.h /sf/mw/gstreamer/include/gstreamer/gst/cdda/base64.h -../gst-libs/gst/cdda/gstcddabasesrc.h /sf/mw/gstreamer/include/gstreamer/gst/cdda/gstcddabasesrc.h +//../gst-libs/gst/cdda/base64.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/cdda/base64.h) +../gst-libs/gst/cdda/gstcddabasesrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/cdda/gstcddabasesrc.h) // floatcast -../gst-libs/gst/floatcast/floatcast.h /sf/mw/gstreamer/include/gstreamer/gst/floatcast/floatcast.h +../gst-libs/gst/floatcast/floatcast.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/floatcast/floatcast.h) // riff -../gst-libs/gst/riff/riff-ids.h /sf/mw/gstreamer/include/gstreamer/gst/riff/riff-ids.h -../gst-libs/gst/riff/riff-media.h /sf/mw/gstreamer/include/gstreamer/gst/riff/riff-media.h -../gst-libs/gst/riff/riff-read.h /sf/mw/gstreamer/include/gstreamer/gst/riff/riff-read.h +../gst-libs/gst/riff/riff-ids.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/riff/riff-ids.h) +../gst-libs/gst/riff/riff-media.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/riff/riff-media.h) +../gst-libs/gst/riff/riff-read.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/riff/riff-read.h) //app -../gst-libs/gst/app/gstappbuffer.h /sf/mw/gstreamer/include/gstreamer/gst/app/gstappbuffer.h -../gst-libs/gst/app/gstappsink.h /sf/mw/gstreamer/include/gstreamer/gst/app/gstappsink.h -../gst-libs/gst/app/gstappsrc.h /sf/mw/gstreamer/include/gstreamer/gst/app/gstappsrc.h +../gst-libs/gst/app/gstappbuffer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/app/gstappbuffer.h) +../gst-libs/gst/app/gstappsink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/app/gstappsink.h) +../gst-libs/gst/app/gstappsrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/app/gstappsrc.h) // rtp -../gst-libs/gst/rtp/gstbasertpdepayload.h /sf/mw/gstreamer/include/gstreamer/gst/rtp/gstbasertpdepayload.h -../gst-libs/gst/rtp/gstbasertppayload.h /sf/mw/gstreamer/include/gstreamer/gst/rtp/gstbasertppayload.h -../gst-libs/gst/rtp/gstrtpbuffer.h /sf/mw/gstreamer/include/gstreamer/gst/rtp/gstrtpbuffer.h -../gst-libs/gst/rtp/gstbasertpaudiopayload.h /sf/mw/gstreamer/include/gstreamer/gst/rtp/gstbasertpaudiopayload.h -../gst-libs/gst/rtp/gstrtcpbuffer.h /sf/mw/gstreamer/include/gstreamer/gst/rtp/gstrtcpbuffer.h -../gst-libs/gst/rtp/gstrtppayloads.h /sf/mw/gstreamer/include/gstreamer/gst/rtp/gstrtppayloads.h +../gst-libs/gst/rtp/gstbasertpdepayload.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/rtp/gstbasertpdepayload.h) +../gst-libs/gst/rtp/gstbasertppayload.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/rtp/gstbasertppayload.h) +../gst-libs/gst/rtp/gstrtpbuffer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/rtp/gstrtpbuffer.h) +../gst-libs/gst/rtp/gstbasertpaudiopayload.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/rtp/gstbasertpaudiopayload.h) +../gst-libs/gst/rtp/gstrtcpbuffer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/rtp/gstrtcpbuffer.h) +../gst-libs/gst/rtp/gstrtppayloads.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/rtp/gstrtppayloads.h) // tag -../gst-libs/gst/tag/gsttageditingprivate.h /sf/mw/gstreamer/include/gstreamer/gst/tag/gsttageditingprivate.h -../gst-libs/gst/tag/tag.h /sf/mw/gstreamer/include/gstreamer/gst/tag/tag.h +//../gst-libs/gst/tag/gsttageditingprivate.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tag/gsttageditingprivate.h) +../gst-libs/gst/tag/tag.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tag/tag.h) // netbuffer -../gst-libs/gst/netbuffer/gstnetbuffer.h /sf/mw/gstreamer/include/gstreamer/gst/netbuffer/gstnetbuffer.h +../gst-libs/gst/netbuffer/gstnetbuffer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/netbuffer/gstnetbuffer.h) // video -../gst-libs/gst/video/gstvideofilter.h /sf/mw/gstreamer/include/gstreamer/gst/video/gstvideofilter.h -../gst-libs/gst/video/gstvideosink.h /sf/mw/gstreamer/include/gstreamer/gst/video/gstvideosink.h -../gst-libs/gst/video/video.h /sf/mw/gstreamer/include/gstreamer/gst/video/video.h -../gst-libs/gst/video/video-enumtypes.h /sf/mw/gstreamer/include/gstreamer/gst/video/video-enumtypes.h +../gst-libs/gst/video/gstvideofilter.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/video/gstvideofilter.h) +../gst-libs/gst/video/gstvideosink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/video/gstvideosink.h) +../gst-libs/gst/video/video.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/video/video.h) +../gst-libs/gst/video/video-enumtypes.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/video/video-enumtypes.h) // adder -../gst/adder/gstadder.h /sf/mw/gstreamer/include/gstreamer/gst/adder/gstadder.h +//../gst/adder/gstadder.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/adder/gstadder.h) // audioconvert -../gst/audioconvert/audioconvert.h /sf/mw/gstreamer/include/gstreamer/gst/audioconvert/audioconvert.h -../gst/audioconvert/gstaudioconvert.h /sf/mw/gstreamer/include/gstreamer/gst/audioconvert/gstaudioconvert.h -../gst/audioconvert/gstchannelmix.h /sf/mw/gstreamer/include/gstreamer/gst/audioconvert/gstchannelmix.h -../gst/audioconvert/plugin.h /sf/mw/gstreamer/include/gstreamer/gst/audioconvert/plugin.h +//../gst/audioconvert/audioconvert.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioconvert/audioconvert.h) +//../gst/audioconvert/gstaudioconvert.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioconvert/gstaudioconvert.h) +//../gst/audioconvert/gstchannelmix.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioconvert/gstchannelmix.h) +//../gst/audioconvert/plugin.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioconvert/plugin.h) // audioresample -//../gst/audioresample/buffer.h /sf/mw/gstreamer/include/gstreamer/gst/audioresample/buffer.h -//../gst/audioresample/debug.h /sf/mw/gstreamer/include/gstreamer/gst/audioresample/debug.h -//../gst/audioresample/functable.h /sf/mw/gstreamer/include/gstreamer/gst/audioresample/functable.h -../gst/audioresample/gstaudioresample.h /sf/mw/gstreamer/include/gstreamer/gst/audioresample/gstaudioresample.h -//../gst/audioresample/resample.h /sf/mw/gstreamer/include/gstreamer/gst/audioresample/resample.h +//../gst/audioresample/buffer.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioresample/buffer.h) +//../gst/audioresample/debug.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioresample/debug.h) +//../gst/audioresample/functable.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioresample/functable.h) +//../gst/audioresample/gstaudioresample.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioresample/gstaudioresample.h) +//../gst/audioresample/resample.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audioresample/resample.h) // audiotestsrc -../gst/audiotestsrc/gstaudiotestsrc.h /sf/mw/gstreamer/include/gstreamer/gst/audiotestsrc/gstaudiotestsrc.h +//../gst/audiotestsrc/gstaudiotestsrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/audiotestsrc/gstaudiotestsrc.h) // ffmpegcolorspace -../gst/ffmpegcolorspace/avcodec.h /sf/mw/gstreamer/include/gstreamer/gst/ffmpegcolorspace/avcodec.h -../gst/ffmpegcolorspace/dsputil.h /sf/mw/gstreamer/include/gstreamer/gst/ffmpegcolorspace/dsputil.h -../gst/ffmpegcolorspace/gstffmpegcodecmap.h /sf/mw/gstreamer/include/gstreamer/gst/ffmpegcolorspace/gstffmpegcodecmap.h -../gst/ffmpegcolorspace/gstffmpegcolorspace.h /sf/mw/gstreamer/include/gstreamer/gst/ffmpegcolorspace/gstffmpegcolorspace.h -../gst/ffmpegcolorspace/imgconvert_template.h /sf/mw/gstreamer/include/gstreamer/gst/ffmpegcolorspace/imgconvert_template.h +//../gst/ffmpegcolorspace/avcodec.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/ffmpegcolorspace/avcodec.h) +//../gst/ffmpegcolorspace/dsputil.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/ffmpegcolorspace/dsputil.h) +//../gst/ffmpegcolorspace/gstffmpegcodecmap.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/ffmpegcolorspace/gstffmpegcodecmap.h) +//../gst/ffmpegcolorspace/gstffmpegcolorspace.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/ffmpegcolorspace/gstffmpegcolorspace.h) +//../gst/ffmpegcolorspace/imgconvert_template.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/ffmpegcolorspace/imgconvert_template.h) // playback -../gst/playback/gstplay-marshal.h /sf/mw/gstreamer/include/gstreamer/gst/playback/gstplay-marshal.h -../gst/playback/gstplaybasebin.h /sf/mw/gstreamer/include/gstreamer/gst/playback/gstplaybasebin.h -../gst/playback/gststreaminfo.h /sf/mw/gstreamer/include/gstreamer/gst/playback/gststreaminfo.h -../gst/playback/gststreamselector.h /sf/mw/gstreamer/include/gstreamer/gst/playback/gststreamselector.h +//../gst/playback/gstplay-marshal.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/playback/gstplay-marshal.h) +//../gst/playback/gstplaybasebin.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/playback/gstplaybasebin.h) +//../gst/playback/gststreaminfo.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/playback/gststreaminfo.h) +//../gst/playback/gststreamselector.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/playback/gststreamselector.h) //pbutils -../gst-libs/gst/pbutils/pbutils.h /sf/mw/gstreamer/include/gstreamer/gst/pbutils/pbutils.h -../gst-libs/gst/pbutils/descriptions.h /sf/mw/gstreamer/include/gstreamer/gst/pbutils/descriptions.h -../gst-libs/gst/pbutils/install-plugins.h /sf/mw/gstreamer/include/gstreamer/gst/pbutils/install-plugins.h -../gst-libs/gst/pbutils/missing-plugins.h /sf/mw/gstreamer/include/gstreamer/gst/pbutils/missing-plugins.h -../gst-libs/gst/pbutils/pbutils-enumtypes.h /sf/mw/gstreamer/include/gstreamer/gst/pbutils/pbutils-enumtypes.h +../gst-libs/gst/pbutils/pbutils.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/pbutils/pbutils.h) +../gst-libs/gst/pbutils/descriptions.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/pbutils/descriptions.h) +../gst-libs/gst/pbutils/install-plugins.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/pbutils/install-plugins.h) +../gst-libs/gst/pbutils/missing-plugins.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/pbutils/missing-plugins.h) +../gst-libs/gst/pbutils/pbutils-enumtypes.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/pbutils/pbutils-enumtypes.h) // subparse -../gst/subparse/gstssaparse.h /sf/mw/gstreamer/include/gstreamer/gst/subparse/gstssaparse.h -../gst/subparse/gstsubparse.h /sf/mw/gstreamer/include/gstreamer/gst/subparse/gstsubparse.h -../gst/subparse/samiparse.h /sf/mw/gstreamer/include/gstreamer/gst/subparse/samiparse.h +//../gst/subparse/gstssaparse.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/subparse/gstssaparse.h) +//../gst/subparse/gstsubparse.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/subparse/gstsubparse.h) +//../gst/subparse/samiparse.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/subparse/samiparse.h) // tcp -../gst/tcp/gstmultifdsink.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gstmultifdsink.h -../gst/tcp/gsttcp-enumtypes.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcp-enumtypes.h -../gst/tcp/gsttcp-marshal.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcp-marshal.h -../gst/tcp/gsttcp.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcp.h -../gst/tcp/gsttcpclientsink.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcpclientsink.h -../gst/tcp/gsttcpclientsrc.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcpclientsrc.h -../gst/tcp/gsttcpplugin.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcpplugin.h -../gst/tcp/gsttcpserversink.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcpserversink.h -../gst/tcp/gsttcpserversrc.h /sf/mw/gstreamer/include/gstreamer/gst/tcp/gsttcpserversrc.h +//../gst/tcp/gstmultifdsink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gstmultifdsink.h) +//../gst/tcp/gsttcp-enumtypes.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcp-enumtypes.h) +//../gst/tcp/gsttcp-marshal.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcp-marshal.h) +//../gst/tcp/gsttcp.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcp.h) +//../gst/tcp/gsttcpclientsink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcpclientsink.h) +//../gst/tcp/gsttcpclientsrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcpclientsrc.h) +//../gst/tcp/gsttcpplugin.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcpplugin.h) +//../gst/tcp/gsttcpserversink.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcpserversink.h) +//../gst/tcp/gsttcpserversrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/tcp/gsttcpserversrc.h) // videorate -../gst/videorate/gstvideorate.h /sf/mw/gstreamer/include/gstreamer/gst/videorate/gstvideorate.h +//../gst/videorate/gstvideorate.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/videorate/gstvideorate.h) // videoscale -../gst/videoscale/gstvideoscale.h /sf/mw/gstreamer/include/gstreamer/gst/videoscale/gstvideoscale.h -../gst/videoscale/vs_image.h /sf/mw/gstreamer/include/gstreamer/gst/videoscale/vs_image.h -../gst/videoscale/vs_scanline.h /sf/mw/gstreamer/include/gstreamer/gst/videoscale/vs_scanline.h +//../gst/videoscale/gstvideoscale.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/videoscale/gstvideoscale.h) +//../gst/videoscale/vs_image.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/videoscale/vs_image.h) +//../gst/videoscale/vs_scanline.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/videoscale/vs_scanline.h) // videotestsrc -../gst/videotestsrc/gstvideotestsrc.h /sf/mw/gstreamer/include/gstreamer/gst/videotestsrc/gstvideotestsrc.h -../gst/videotestsrc/videotestsrc.h /sf/mw/gstreamer/include/gstreamer/gst/videotestsrc/videotestsrc.h +//../gst/videotestsrc/gstvideotestsrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/videotestsrc/gstvideotestsrc.h) +//../gst/videotestsrc/videotestsrc.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/videotestsrc/videotestsrc.h) // volume -../gst/volume/gstvolume.h /sf/mw/gstreamer/include/gstreamer/gst/volume/gstvolume.h +//../gst/volume/gstvolume.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/volume/gstvolume.h) //liboil - Since liboil port is available, No need to use liboil stub. -//../gst/oil/liboil.h /sf/mw/gstreamer/include/gstreamer/gst/liboil.h +//../gst/oil/liboil.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/liboil.h) // fft -../gst-libs/gst/fft/_kiss_fft_guts_f32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/_kiss_fft_guts_f32.h -../gst-libs/gst/fft/_kiss_fft_guts_f64.h /sf/mw/gstreamer/include/gstreamer/gst/fft/_kiss_fft_guts_f64.h -../gst-libs/gst/fft/_kiss_fft_guts_s16.h /sf/mw/gstreamer/include/gstreamer/gst/fft/_kiss_fft_guts_s16.h -../gst-libs/gst/fft/_kiss_fft_guts_s32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/_kiss_fft_guts_s32.h -../gst-libs/gst/fft/gstfft.h /sf/mw/gstreamer/include/gstreamer/gst/fft/gstfft.h -../gst-libs/gst/fft/gstfftf32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/gstfftf32.h -../gst-libs/gst/fft/gstfftf64.h /sf/mw/gstreamer/include/gstreamer/gst/fft/gstfftf64.h -../gst-libs/gst/fft/gstffts16.h /sf/mw/gstreamer/include/gstreamer/gst/fft/gstffts16.h -../gst-libs/gst/fft/gstffts32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/gstffts32.h -../gst-libs/gst/fft/kiss_fft_f32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fft_f32.h -../gst-libs/gst/fft/kiss_fft_f64.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fft_f64.h -../gst-libs/gst/fft/kiss_fft_s16.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fft_s16.h -../gst-libs/gst/fft/kiss_fft_s32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fft_s32.h -../gst-libs/gst/fft/kiss_fftr_f32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fftr_f32.h -../gst-libs/gst/fft/kiss_fftr_f64.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fftr_f64.h -../gst-libs/gst/fft/kiss_fftr_s16.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fftr_s16.h -../gst-libs/gst/fft/kiss_fftr_s32.h /sf/mw/gstreamer/include/gstreamer/gst/fft/kiss_fftr_s32.h +//../gst-libs/gst/fft/_kiss_fft_guts_f32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/_kiss_fft_guts_f32.h) +//../gst-libs/gst/fft/_kiss_fft_guts_f64.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/_kiss_fft_guts_f64.h) +//../gst-libs/gst/fft/_kiss_fft_guts_s16.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/_kiss_fft_guts_s16.h) +//../gst-libs/gst/fft/_kiss_fft_guts_s32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/_kiss_fft_guts_s32.h) +../gst-libs/gst/fft/gstfft.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/gstfft.h) +../gst-libs/gst/fft/gstfftf32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/gstfftf32.h) +../gst-libs/gst/fft/gstfftf64.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/gstfftf64.h) +../gst-libs/gst/fft/gstffts16.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/gstffts16.h) +../gst-libs/gst/fft/gstffts32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/gstffts32.h) +//../gst-libs/gst/fft/kiss_fft_f32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fft_f32.h) +//../gst-libs/gst/fft/kiss_fft_f64.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fft_f64.h) +//../gst-libs/gst/fft/kiss_fft_s16.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fft_s16.h) +//../gst-libs/gst/fft/kiss_fft_s32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fft_s32.h) +//../gst-libs/gst/fft/kiss_fftr_f32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fftr_f32.h) +//../gst-libs/gst/fft/kiss_fftr_f64.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fftr_f64.h) +//../gst-libs/gst/fft/kiss_fftr_s16.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fftr_s16.h) +//../gst-libs/gst/fft/kiss_fftr_s32.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/fft/kiss_fftr_s32.h) //internationalization macros -../gst-libs/gst/gst-i18n-plugin.h /sf/mw/gstreamer/include/gstreamer/gst/gst-i18n-plugin.h +//../gst-libs/gst/gst-i18n-plugin.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/gst-i18n-plugin.h) //avcodec -../gst/ffmpegcolorspace/avcodec.h /sf/mw/gstreamer/include/gstreamer/gst/avcodec.h +//../gst/ffmpegcolorspace/avcodec.h MW_LAYER_PLATFORM_EXPORT_PATH(gstreamer/gst/avcodec.h) PRJ_MMPFILES diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/ffmpegcolorspace.mmp --- a/gst_plugins_base/group/ffmpegcolorspace.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/ffmpegcolorspace.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -46,12 +46,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/ffmpegcolorspace SOURCE dsputil.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstadder.mmp --- a/gst_plugins_base/group/gstadder.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstadder.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,12 +44,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/adder SOURCE gstadder.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstapp.mmp --- a/gst_plugins_base/group/gstapp.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstapp.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -39,10 +39,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE - -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/app +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/app SOURCE gstapp.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstaudio.mmp --- a/gst_plugins_base/group/gstaudio.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstaudio.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,14 +44,8 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE - OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../gst-libs/audio diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstaudioconvert.mmp --- a/gst_plugins_base/group/gstaudioconvert.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstaudioconvert.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -42,15 +42,8 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE - OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audioconvert +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/audioconvert SOURCE audioconvert.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstaudiorate.mmp --- a/gst_plugins_base/group/gstaudiorate.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstaudiorate.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,12 +44,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/audiorate SOURCE gstaudiorate.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstaudioresample.mmp --- a/gst_plugins_base/group/gstaudioresample.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstaudioresample.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,12 +44,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/audioresample diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstaudiotestsrc.mmp --- a/gst_plugins_base/group/gstaudiotestsrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstaudiotestsrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,12 +44,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/audiotestsrc SOURCE gstaudiotestsrc.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstcdda.mmp --- a/gst_plugins_base/group/gstcdda.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstcdda.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/cdda SOURCE gstcddabasesrc.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstdecodebin.mmp --- a/gst_plugins_base/group/gstdecodebin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstdecodebin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -46,12 +46,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/playback SOURCE gstdecodebin.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstdecodebin2.mmp --- a/gst_plugins_base/group/gstdecodebin2.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstdecodebin2.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/playback SOURCE gstdecodebin2.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstfft.mmp --- a/gst_plugins_base/group/gstfft.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstfft.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/fft SOURCE gstfft.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstgdp.mmp --- a/gst_plugins_base/group/gstgdp.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstgdp.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -43,12 +43,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/gdp SOURCE gstgdp.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstinterfaces.mmp --- a/gst_plugins_base/group/gstinterfaces.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstinterfaces.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -46,12 +46,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/interfaces SOURCE colorbalance.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstnetbuffer.mmp --- a/gst_plugins_base/group/gstnetbuffer.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstnetbuffer.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/netbuffer SOURCE gstnetbuffer.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstpbutils.mmp --- a/gst_plugins_base/group/gstpbutils.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstpbutils.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,23 +37,17 @@ EpocAllowDllData #endif +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + USERINCLUDE ../gst USERINCLUDE ../gst-libs/gst/pbutils USERINCLUDE ../gst-libs USERINCLUDE ../gst-libs/gst USERINCLUDE .. -MW_LAYER_SYSTEMINCLUDE -OS_LAYER_LIBC_SYSTEMINCLUDE - -OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net - SOURCEPATH ../gst-libs/gst/pbutils SOURCE descriptions.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstplayback.mmp --- a/gst_plugins_base/group/gstplayback.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstplayback.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/playback SOURCE gstplay-marshal.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstplaybin.mmp --- a/gst_plugins_base/group/gstplaybin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstplaybin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/playback SOURCE gstplayback.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstqueue2.mmp --- a/gst_plugins_base/group/gstqueue2.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstqueue2.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/playback SOURCE gstqueue2.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstriff.mmp --- a/gst_plugins_base/group/gstriff.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstriff.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/riff SOURCE riff.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstrtp.mmp --- a/gst_plugins_base/group/gstrtp.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstrtp.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/rtp SOURCE gstbasertpdepayload.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstsubparse.mmp --- a/gst_plugins_base/group/gstsubparse.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstsubparse.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -43,12 +43,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/subparse SOURCE gstssaparse.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gsttag.mmp --- a/gst_plugins_base/group/gsttag.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gsttag.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/tag SOURCE gstid3tag.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gsttcp.mmp --- a/gst_plugins_base/group/gsttcp.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gsttcp.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/tcp SOURCE gstmultifdsink.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gsttypefind.mmp --- a/gst_plugins_base/group/gsttypefind.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gsttypefind.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -43,12 +43,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/typefind SOURCE gsttypefindfunctions.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstvideo.mmp --- a/gst_plugins_base/group/gstvideo.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstvideo.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst-libs/gst/video SOURCE gstvideofilter.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstvideorate.mmp --- a/gst_plugins_base/group/gstvideorate.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstvideorate.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -43,12 +43,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/videorate SOURCE gstvideorate.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstvideoscale.mmp --- a/gst_plugins_base/group/gstvideoscale.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstvideoscale.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE OS_LAYER_LIBOIL_SYSTEMINCLUDE SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/videoscale SOURCE gstvideoscale.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstvideotestsrc.mmp --- a/gst_plugins_base/group/gstvideotestsrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstvideotestsrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,12 +45,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE OS_LAYER_LIBOIL_SYSTEMINCLUDE SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/videotestsrc SOURCE gstvideotestsrc.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/group/gstvolume.mmp --- a/gst_plugins_base/group/gstvolume.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/group/gstvolume.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,12 +44,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE OS_LAYER_LIBOIL_SYSTEMINCLUDE SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/volume SOURCE gstvolume.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/gst-libs/gst/pbutils/install-plugins.c --- a/gst_plugins_base/gst-libs/gst/pbutils/install-plugins.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/gst-libs/gst/pbutils/install-plugins.c Thu Jul 22 16:36:00 2010 +0100 @@ -355,7 +355,7 @@ #endif #ifdef __SYMBIAN32__ -#include +#include #endif #include "install-plugins.h" diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/gst-libs/gst/riff/riff-media.h --- a/gst_plugins_base/gst-libs/gst/riff/riff-media.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/gst-libs/gst/riff/riff-media.h Thu Jul 22 16:36:00 2010 +0100 @@ -24,7 +24,7 @@ #include #include -#include "riff-ids.h" +#include "gst/riff/riff-ids.h" G_BEGIN_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/gst-libs/gst/riff/riff-read.h --- a/gst_plugins_base/gst-libs/gst/riff/riff-read.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/gst-libs/gst/riff/riff-read.h Thu Jul 22 16:36:00 2010 +0100 @@ -25,7 +25,7 @@ #include #include -#include "riff-ids.h" +#include "gst/riff/riff-ids.h" G_BEGIN_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/adder/group/adder.mmp --- a/gst_plugins_base/tsrc/check/elements/adder/group/adder.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/adder/group/adder.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -38,13 +38,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net - +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/audioconvert/group/audioconvert.mmp --- a/gst_plugins_base/tsrc/check/elements/audioconvert/group/audioconvert.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/audioconvert/group/audioconvert.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE MW_LAYER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/audiorate/group/audiorate.mmp --- a/gst_plugins_base/tsrc/check/elements/audiorate/group/audiorate.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/audiorate/group/audiorate.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -39,12 +39,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/audioresample/group/audioresample.mmp --- a/gst_plugins_base/tsrc/check/elements/audioresample/group/audioresample.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/audioresample/group/audioresample.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -39,13 +39,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net - +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/audiotestsrc/group/audiotestsrc.mmp --- a/gst_plugins_base/tsrc/check/elements/audiotestsrc/group/audiotestsrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/audiotestsrc/group/audiotestsrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,12 +37,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/createelementbase/group/createelementbase.mmp --- a/gst_plugins_base/tsrc/check/elements/createelementbase/group/createelementbase.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/createelementbase/group/createelementbase.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/createelementbasevideo/group/createelementbasevideo.mmp --- a/gst_plugins_base/tsrc/check/elements/createelementbasevideo/group/createelementbasevideo.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/createelementbasevideo/group/createelementbasevideo.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,12 +37,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/decodebin/ffmpegcolorspace/group/ffmpegcolorspace.mmp --- a/gst_plugins_base/tsrc/check/elements/decodebin/ffmpegcolorspace/group/ffmpegcolorspace.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/decodebin/ffmpegcolorspace/group/ffmpegcolorspace.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -40,12 +40,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/decodebin/group/decodebin.mmp --- a/gst_plugins_base/tsrc/check/elements/decodebin/group/decodebin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/decodebin/group/decodebin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -38,12 +38,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/ffmpegcolorspace/group/ffmpegcolorspace.mmp --- a/gst_plugins_base/tsrc/check/elements/ffmpegcolorspace/group/ffmpegcolorspace.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/ffmpegcolorspace/group/ffmpegcolorspace.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -39,12 +39,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/gdpdepay/group/gdpdepay.mmp --- a/gst_plugins_base/tsrc/check/elements/gdpdepay/group/gdpdepay.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/gdpdepay/group/gdpdepay.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/multifdsink/group/multifdsink.mmp --- a/gst_plugins_base/tsrc/check/elements/multifdsink/group/multifdsink.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/multifdsink/group/multifdsink.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/playbin/group/playbin.mmp --- a/gst_plugins_base/tsrc/check/elements/playbin/group/playbin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/playbin/group/playbin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -33,12 +33,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/playbin/src/playbin.c --- a/gst_plugins_base/tsrc/check/elements/playbin/src/playbin.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/playbin/src/playbin.c Thu Jul 22 16:36:00 2010 +0100 @@ -879,6 +879,7 @@ typedef GstPushSrc GstCodecSrc; typedef GstPushSrcClass GstCodecSrcClass; + GST_BOILERPLATE_FULL (GstCodecSrc, gst_codec_src, GstPushSrc, GST_TYPE_PUSH_SRC, gst_codec_src_init_type); diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/subparse/group/subparse.mmp --- a/gst_plugins_base/tsrc/check/elements/subparse/group/subparse.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/subparse/group/subparse.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/videorate/group/videorate.mmp --- a/gst_plugins_base/tsrc/check/elements/videorate/group/videorate.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/videorate/group/videorate.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -41,12 +41,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/elements/volume/group/volume.mmp --- a/gst_plugins_base/tsrc/check/elements/volume/group/volume.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/elements/volume/group/volume.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -29,12 +29,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/generic/clock-selection/group/clock-selection.mmp --- a/gst_plugins_base/tsrc/check/generic/clock-selection/group/clock-selection.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/generic/clock-selection/group/clock-selection.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,13 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net - +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SYSTEMINCLUDE ../../../../../../gstreamer_core/libs diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/generic/states/group/states.mmp --- a/gst_plugins_base/tsrc/check/generic/states/group/states.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/generic/states/group/states.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,9 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + + USERINCLUDE ../../../../.. SYSTEMINCLUDE ../../../../../gst SYSTEMINCLUDE ../../../../../../gstreamer_core/libs diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/gst/typefindfunctions/group/typefindfunctions.mmp --- a/gst_plugins_base/tsrc/check/gst/typefindfunctions/group/typefindfunctions.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/gst/typefindfunctions/group/typefindfunctions.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -21,12 +21,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/fft/group/fft.mmp --- a/gst_plugins_base/tsrc/check/libs/fft/group/fft.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/fft/group/fft.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/netbuffer/group/netbuffer.mmp --- a/gst_plugins_base/tsrc/check/libs/netbuffer/group/netbuffer.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/netbuffer/group/netbuffer.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/pbutils/group/pbutils.mmp --- a/gst_plugins_base/tsrc/check/libs/pbutils/group/pbutils.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/pbutils/group/pbutils.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,12 +37,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/rtp/group/rtp.mmp --- a/gst_plugins_base/tsrc/check/libs/rtp/group/rtp.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/rtp/group/rtp.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/tag/group/tag.mmp --- a/gst_plugins_base/tsrc/check/libs/tag/group/tag.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/tag/group/tag.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/taudio/group/taudio.mmp --- a/gst_plugins_base/tsrc/check/libs/taudio/group/taudio.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/taudio/group/taudio.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/libs/video/group/video.mmp --- a/gst_plugins_base/tsrc/check/libs/video/group/video.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/libs/video/group/video.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -21,12 +21,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/pipelines/simple-launch-lines/group/simple-launch-lines.mmp --- a/gst_plugins_base/tsrc/check/pipelines/simple-launch-lines/group/simple-launch-lines.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/pipelines/simple-launch-lines/group/simple-launch-lines.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/check/pipelines/streamheader/group/streamheader.mmp --- a/gst_plugins_base/tsrc/check/pipelines/streamheader/group/streamheader.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/check/pipelines/streamheader/group/streamheader.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/examples/dynamic/addstream/group/addstream.mmp --- a/gst_plugins_base/tsrc/examples/dynamic/addstream/group/addstream.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/examples/dynamic/addstream/group/addstream.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,13 +37,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net - +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_base/tsrc/icles/stress_playbin/group/stress_playbin.mmp --- a/gst_plugins_base/tsrc/icles/stress_playbin/group/stress_playbin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_base/tsrc/icles/stress_playbin/group/stress_playbin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -38,12 +38,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../gstreamer_core/libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/bwins/libgstcamerabinu.def --- a/gst_plugins_good/bwins/libgstcamerabinu.def Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - gst_camerabin_get_type @ 1 NONAME - gst_camerabin_image_get_type @ 2 NONAME - gst_camerabin_video_get_type @ 3 NONAME - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/bwins/libgstmpegaudioparseu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/bwins/libgstmpegaudioparseu.def Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,5 @@ +EXPORTS + _GST_PLUGIN_DESC @ 1 NONAME + gst_mp3parse_get_type @ 2 NONAME + gst_xing_mux_get_type @ 3 NONAME + diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/bwins/libgstphotographyu.def --- a/gst_plugins_good/bwins/libgstphotographyu.def Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -EXPORTS - gst_photography_get_aperture @ 1 NONAME - gst_photography_get_capabilities @ 2 NONAME - gst_photography_get_colour_tone_mode @ 3 NONAME - gst_photography_get_ev_compensation @ 4 NONAME - gst_photography_get_exposure @ 5 NONAME - gst_photography_get_flash_mode @ 6 NONAME - gst_photography_get_iso_speed @ 7 NONAME - gst_photography_get_scene_mode @ 8 NONAME - gst_photography_get_type @ 9 NONAME - gst_photography_get_white_balance_mode @ 10 NONAME - gst_photography_get_zoom @ 11 NONAME - gst_photography_prepare_for_capture @ 12 NONAME - gst_photography_set_aperture @ 13 NONAME - gst_photography_set_autofocus @ 14 NONAME - gst_photography_set_colour_tone_mode @ 15 NONAME - gst_photography_set_ev_compensation @ 16 NONAME - gst_photography_set_exposure @ 17 NONAME - gst_photography_set_flash_mode @ 18 NONAME - gst_photography_set_iso_speed @ 19 NONAME - gst_photography_set_scene_mode @ 20 NONAME - gst_photography_set_white_balance_mode @ 21 NONAME - gst_photography_set_zoom @ 22 NONAME - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/eabi/libgstcamerabinu.def --- a/gst_plugins_good/eabi/libgstcamerabinu.def Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - gst_camerabin_get_type @ 1 NONAME - gst_camerabin_image_get_type @ 2 NONAME - gst_camerabin_video_get_type @ 3 NONAME - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/eabi/libgstmpegaudioparseu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/eabi/libgstmpegaudioparseu.def Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,5 @@ +EXPORTS + _GST_PLUGIN_DESC @ 1 NONAME + gst_mp3parse_get_type @ 2 NONAME + gst_xing_mux_get_type @ 3 NONAME + diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/eabi/libgstphotographyu.def --- a/gst_plugins_good/eabi/libgstphotographyu.def Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -EXPORTS - gst_photography_get_aperture @ 1 NONAME - gst_photography_get_capabilities @ 2 NONAME - gst_photography_get_colour_tone_mode @ 3 NONAME - gst_photography_get_ev_compensation @ 4 NONAME - gst_photography_get_exposure @ 5 NONAME - gst_photography_get_flash_mode @ 6 NONAME - gst_photography_get_iso_speed @ 7 NONAME - gst_photography_get_scene_mode @ 8 NONAME - gst_photography_get_type @ 9 NONAME - gst_photography_get_white_balance_mode @ 10 NONAME - gst_photography_get_zoom @ 11 NONAME - gst_photography_prepare_for_capture @ 12 NONAME - gst_photography_set_aperture @ 13 NONAME - gst_photography_set_autofocus @ 14 NONAME - gst_photography_set_colour_tone_mode @ 15 NONAME - gst_photography_set_ev_compensation @ 16 NONAME - gst_photography_set_exposure @ 17 NONAME - gst_photography_set_flash_mode @ 18 NONAME - gst_photography_set_iso_speed @ 19 NONAME - gst_photography_set_scene_mode @ 20 NONAME - gst_photography_set_white_balance_mode @ 21 NONAME - gst_photography_set_zoom @ 22 NONAME - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/bld.inf --- a/gst_plugins_good/group/bld.inf Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/bld.inf Thu Jul 22 16:36:00 2010 +0100 @@ -2,8 +2,6 @@ default PRJ_EXPORTS -../gst-libs/gst/interfaces/photography.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/photography.h -../gst-libs/gst/interfaces/photography-enumtypes.h /sf/mw/gstreamer/include/gstreamer/gst/interfaces/photography-enumtypes.h PRJ_MMPFILES gstwavparse.mmp @@ -11,6 +9,5 @@ gstautodetect.mmp gstavi.mmp gstqtmux.mmp -gstphotography.mmp -gstcamerabin.mmp - +gstqtdemux.mmp +gstmpegaudioparse.mmp diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstalaw.mmp --- a/gst_plugins_good/group/gstalaw.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstalaw.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -51,21 +51,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/law SOURCE alaw.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstalpha.mmp --- a/gst_plugins_good/group/gstalpha.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstalpha.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -57,11 +57,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/riff +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/alpha SOURCE gstalpha.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstalphacolor.mmp --- a/gst_plugins_good/group/gstalphacolor.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstalphacolor.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -56,11 +56,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/riff +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/alpha SOURCE gstalphacolor.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstaudiofx.mmp --- a/gst_plugins_good/group/gstaudiofx.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstaudiofx.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -51,21 +51,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/audiofx SOURCE audioamplify.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstauparse.mmp --- a/gst_plugins_good/group/gstauparse.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstauparse.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -51,9 +51,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/auparse diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstautodetect.mmp --- a/gst_plugins_good/group/gstautodetect.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstautodetect.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,9 +44,12 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -SYSTEMINCLUDE ../../include/gstreamer +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + USERINCLUDE ../ + + SOURCEPATH ../gst/autodetect SOURCE gstautodetect.c SOURCE gstautoaudiosrc.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstavi.mmp --- a/gst_plugins_good/group/gstavi.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstavi.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -50,10 +50,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/riff +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/avi SOURCE gstavi.c gstavimux.c gstavidemux.c gstavisubtitle.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstcamerabin.mmp --- a/gst_plugins_good/group/gstcamerabin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -// Gstreamer.MMP -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. -* -* 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 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., 59 Temple Place - Suite 330, -* Boston, MA 02111-1307, USA. -* -* Description: -* -*/ - -#include - -TARGET libgstcamerabin.dll -TARGETTYPE DLL -//UID 0x20004c45 0x0DE80A1B -UID 0x20004c45 0x1DE80A1B - -LANG SC -CAPABILITY All -Tcb -VENDORID VID_DEFAULT - -#if !defined(__WINSCW__) && !defined(__WINS__) -EpocAllowDllData -#endif - -MACRO HAVE_CONFIG_H - -USERINCLUDE .. -USERINCLUDE ../gst/camerabin -USERINCLUDE ../gst-libs -USERINCLUDE ../gst-libs/gst -USERINCLUDE ../gst-libs/gst/interfaces - -MW_LAYER_SYSTEMINCLUDE -OS_LAYER_LIBC_SYSTEMINCLUDE -OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -//USERINCLUDE ../../include/gstreamer/gst/controller -//USERINCLUDE ../../include/gstreamer/gst/dataprotocol -//USERINCLUDE ../../include/gstreamer/gst/net -//USERINCLUDE ../../include/gstreamer/gst/audio -//USERINCLUDE ../../include/gstreamer/gst/cdda -//USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -//USERINCLUDE ../../include/gstreamer/gst/netbuffer -//USERINCLUDE ../../include/gstreamer/gst/riff -//USERINCLUDE ../../include/gstreamer/gst/rtp -//USERINCLUDE ../../include/gstreamer/gst/tag -//USERINCLUDE ../../include/gstreamer/gst/video - -SYSTEMINCLUDE .. -SYSTEMINCLUDE /sf/mw/gstreamer/include/gstreamer - - -SOURCEPATH ../gst/camerabin -SOURCE gstcamerabin.c -SOURCE gstcamerabinxoverlay.c -SOURCE gstcamerabincolorbalance.c -SOURCE camerabinimage.c -SOURCE camerabinvideo.c -SOURCE camerabingeneral.c -SOURCE gstcamerabinphotography.c -SOURCE gstcamerabin-marshal.c - -LIBRARY libc.lib -LIBRARY libpthread.lib -LIBRARY libdl.lib -LIBRARY libglib.lib -LIBRARY libgmodule.lib - -LIBRARY libgobject.lib -LIBRARY libgthread.lib -LIBRARY libm.lib -LIBRARY libz.lib -LIBRARY libgstreamer.lib -LIBRARY libgstbase.lib -LIBRARY libgstinterfaces.lib -LIBRARY libgstphotography.lib - -#ifdef WINSCW -LIBRARY ewsd.lib //wsd solution -#endif - - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstjpeg.mmp --- a/gst_plugins_good/group/gstjpeg.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstjpeg.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -45,21 +45,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SYSTEMINCLUDE /epoc32/include/jpeg-6b diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstmpegaudioparse.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/group/gstmpegaudioparse.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + +#include + +TARGET libgstmpegaudioparse.dll +TARGETTYPE DLL +UID 0x1000008d 0x10207C45 +CAPABILITY All -TCB +VENDORID VID_DEFAULT +LANG SC + +#if !defined(__WINSCW__) && !defined(__WINS__) +EpocAllowDllData +#endif + + +MACRO HAVE_CONFIG_H + + +USERINCLUDE ../gst/mpegaudioparse + + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE +OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + +SOURCEPATH ../gst/mpegaudioparse +SOURCE gstmpegaudioparse.c +SOURCE gstxingmux.c +SOURCE plugin.c + +LIBRARY euser.lib +LIBRARY libc.lib +LIBRARY libpthread.lib +LIBRARY libglib.lib +LIBRARY libgobject.lib +LIBRARY libgstreamer.lib +LIBRARY libgstbase.lib +LIBRARY libgthread.lib + diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstmulaw.mmp --- a/gst_plugins_good/group/gstmulaw.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstmulaw.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -49,21 +49,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/law SOURCE mulaw.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstphotography.mmp --- a/gst_plugins_good/group/gstphotography.mmp Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. -* -* 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 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., 59 Temple Place - Suite 330, -* Boston, MA 02111-1307, USA. -* -* Description: -* -*/ - -#include - -TARGET libgstphotography.dll -TARGETTYPE DLL -//UID 0x1000008d 0x10207C43 -// FIX ME change UID -UID 0x1000008d 0x20207C43 - -LANG SC -CAPABILITY All -Tcb -VENDORID VID_DEFAULT - -#if !defined(__WINSCW__) && !defined(__WINS__) -EpocAllowDllData -#endif - -MACRO HAVE_CONFIG_H - -USERINCLUDE .. -USERINCLUDE ../gst-libs/gst/interfaces - -MW_LAYER_SYSTEMINCLUDE -OS_LAYER_LIBC_SYSTEMINCLUDE -OS_LAYER_GLIB_SYSTEMINCLUDE - -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/audio - -SYSTEMINCLUDE /sf/mw/gstreamer/include/gstreamer - -SOURCEPATH ../gst-libs/gst/interfaces -SOURCE photography.c -SOURCE photography-enumtypes.c - - -LIBRARY libc.lib -LIBRARY libpthread.lib -LIBRARY libdl.lib -LIBRARY libglib.lib -LIBRARY libgmodule.lib - -LIBRARY libgobject.lib -LIBRARY libgthread.lib -LIBRARY libgstreamer.lib diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstpng.mmp --- a/gst_plugins_good/group/gstpng.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstpng.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -58,11 +58,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/riff +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE /epoc32/include/libpng SOURCEPATH ../ext/libpng diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstqtdemux.mmp --- a/gst_plugins_good/group/gstqtdemux.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstqtdemux.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -51,21 +51,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/qtdemux SOURCE quicktime.c gstrtpxqtdepay.c qtdemux.c qtdemux_types.c qtdemux_dump.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstqtmux.mmp --- a/gst_plugins_good/group/gstqtmux.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstqtmux.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -49,21 +49,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/qtmux SOURCE atoms.c descriptors.c gstqtmux.c gstqtmuxmap.c properties.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstwavenc.mmp --- a/gst_plugins_good/group/gstwavenc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstwavenc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -49,21 +49,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/wavenc SOURCE gstwavenc.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/group/gstwavparse.mmp --- a/gst_plugins_good/group/gstwavparse.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/group/gstwavparse.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -49,21 +49,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net -USERINCLUDE ../../include/gstreamer/gst/audio -USERINCLUDE ../../include/gstreamer/gst/cdda -USERINCLUDE ../../include/gstreamer/gst/floatcast -USERINCLUDE ../../include/gstreamer/gst/interfaces -USERINCLUDE ../../include/gstreamer/gst/netbuffer -USERINCLUDE ../../include/gstreamer/gst/riff -USERINCLUDE ../../include/gstreamer/gst/rtp -USERINCLUDE ../../include/gstreamer/gst/tag -USERINCLUDE ../../include/gstreamer/gst/video +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/wavparse SOURCE gstwavparse.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst-libs/gst/interfaces/photography-enumtypes.c --- a/gst_plugins_good/gst-libs/gst/interfaces/photography-enumtypes.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ - -/* Generated data (by glib-mkenums) */ - -#include "photography-enumtypes.h" - -#include "photography.h" - -/* enumerations from "photography.h" */ -GType -gst_white_balance_mode_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - {GST_PHOTOGRAPHY_WB_MODE_AUTO, "GST_PHOTOGRAPHY_WB_MODE_AUTO", "auto"}, - {GST_PHOTOGRAPHY_WB_MODE_DAYLIGHT, "GST_PHOTOGRAPHY_WB_MODE_DAYLIGHT", - "daylight"}, - {GST_PHOTOGRAPHY_WB_MODE_CLOUDY, "GST_PHOTOGRAPHY_WB_MODE_CLOUDY", - "cloudy"}, - {GST_PHOTOGRAPHY_WB_MODE_SUNSET, "GST_PHOTOGRAPHY_WB_MODE_SUNSET", - "sunset"}, - {GST_PHOTOGRAPHY_WB_MODE_TUNGSTEN, "GST_PHOTOGRAPHY_WB_MODE_TUNGSTEN", - "tungsten"}, - {GST_PHOTOGRAPHY_WB_MODE_FLUORESCENT, - "GST_PHOTOGRAPHY_WB_MODE_FLUORESCENT", "fluorescent"}, - {0, NULL, NULL} - }; - etype = g_enum_register_static ("GstWhiteBalanceMode", values); - } - return etype; -} - -GType -gst_colour_tone_mode_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NORMAL, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NORMAL", "normal"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SEPIA, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SEPIA", "sepia"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NEGATIVE, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NEGATIVE", "negative"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_GRAYSCALE, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_GRAYSCALE", "grayscale"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NATURAL, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NATURAL", "natural"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_VIVID, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_VIVID", "vivid"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_COLORSWAP, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_COLORSWAP", "colorswap"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SOLARIZE, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SOLARIZE", "solarize"}, - {GST_PHOTOGRAPHY_COLOUR_TONE_MODE_OUT_OF_FOCUS, - "GST_PHOTOGRAPHY_COLOUR_TONE_MODE_OUT_OF_FOCUS", "out-of-focus"}, - {0, NULL, NULL} - }; - etype = g_enum_register_static ("GstColourToneMode", values); - } - return etype; -} - -GType -gst_scene_mode_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - {GST_PHOTOGRAPHY_SCENE_MODE_MANUAL, "GST_PHOTOGRAPHY_SCENE_MODE_MANUAL", - "manual"}, - {GST_PHOTOGRAPHY_SCENE_MODE_CLOSEUP, "GST_PHOTOGRAPHY_SCENE_MODE_CLOSEUP", - "closeup"}, - {GST_PHOTOGRAPHY_SCENE_MODE_PORTRAIT, - "GST_PHOTOGRAPHY_SCENE_MODE_PORTRAIT", "portrait"}, - {GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE, - "GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE", "landscape"}, - {GST_PHOTOGRAPHY_SCENE_MODE_SPORT, "GST_PHOTOGRAPHY_SCENE_MODE_SPORT", - "sport"}, - {GST_PHOTOGRAPHY_SCENE_MODE_NIGHT, "GST_PHOTOGRAPHY_SCENE_MODE_NIGHT", - "night"}, - {GST_PHOTOGRAPHY_SCENE_MODE_AUTO, "GST_PHOTOGRAPHY_SCENE_MODE_AUTO", - "auto"}, - {0, NULL, NULL} - }; - etype = g_enum_register_static ("GstSceneMode", values); - } - return etype; -} - -GType -gst_flash_mode_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - {GST_PHOTOGRAPHY_FLASH_MODE_AUTO, "GST_PHOTOGRAPHY_FLASH_MODE_AUTO", - "auto"}, - {GST_PHOTOGRAPHY_FLASH_MODE_OFF, "GST_PHOTOGRAPHY_FLASH_MODE_OFF", "off"}, - {GST_PHOTOGRAPHY_FLASH_MODE_ON, "GST_PHOTOGRAPHY_FLASH_MODE_ON", "on"}, - {GST_PHOTOGRAPHY_FLASH_MODE_FILL_IN, "GST_PHOTOGRAPHY_FLASH_MODE_FILL_IN", - "fill-in"}, - {GST_PHOTOGRAPHY_FLASH_MODE_RED_EYE, "GST_PHOTOGRAPHY_FLASH_MODE_RED_EYE", - "red-eye"}, - {0, NULL, NULL} - }; - etype = g_enum_register_static ("GstFlashMode", values); - } - return etype; -} - -GType -gst_focus_status_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - {GST_PHOTOGRAPHY_FOCUS_STATUS_NONE, "GST_PHOTOGRAPHY_FOCUS_STATUS_NONE", - "none"}, - {GST_PHOTOGRAPHY_FOCUS_STATUS_RUNNING, - "GST_PHOTOGRAPHY_FOCUS_STATUS_RUNNING", "running"}, - {GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL, "GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL", - "fail"}, - {GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS, - "GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS", "success"}, - {0, NULL, NULL} - }; - etype = g_enum_register_static ("GstFocusStatus", values); - } - return etype; -} - -GType -gst_photo_caps_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GFlagsValue values[] = { - {GST_PHOTOGRAPHY_CAPS_NONE, "GST_PHOTOGRAPHY_CAPS_NONE", "none"}, - {GST_PHOTOGRAPHY_CAPS_EV_COMP, "GST_PHOTOGRAPHY_CAPS_EV_COMP", "ev-comp"}, - {GST_PHOTOGRAPHY_CAPS_ISO_SPEED, "GST_PHOTOGRAPHY_CAPS_ISO_SPEED", - "iso-speed"}, - {GST_PHOTOGRAPHY_CAPS_WB_MODE, "GST_PHOTOGRAPHY_CAPS_WB_MODE", "wb-mode"}, - {GST_PHOTOGRAPHY_CAPS_TONE, "GST_PHOTOGRAPHY_CAPS_TONE", "tone"}, - {GST_PHOTOGRAPHY_CAPS_SCENE, "GST_PHOTOGRAPHY_CAPS_SCENE", "scene"}, - {GST_PHOTOGRAPHY_CAPS_FLASH, "GST_PHOTOGRAPHY_CAPS_FLASH", "flash"}, - {GST_PHOTOGRAPHY_CAPS_ZOOM, "GST_PHOTOGRAPHY_CAPS_ZOOM", "zoom"}, - {GST_PHOTOGRAPHY_CAPS_FOCUS, "GST_PHOTOGRAPHY_CAPS_FOCUS", "focus"}, - {GST_PHOTOGRAPHY_CAPS_APERTURE, "GST_PHOTOGRAPHY_CAPS_APERTURE", - "aperture"}, - {GST_PHOTOGRAPHY_CAPS_EXPOSURE, "GST_PHOTOGRAPHY_CAPS_EXPOSURE", - "exposure"}, - {GST_PHOTOGRAPHY_CAPS_SHAKE, "GST_PHOTOGRAPHY_CAPS_SHAKE", "shake"}, - {0, NULL, NULL} - }; - etype = g_flags_register_static ("GstPhotoCaps", values); - } - return etype; -} - -GType -gst_photo_shake_risk_get_type (void) -{ - static GType etype = 0; - if (etype == 0) { - static const GEnumValue values[] = { - {GST_PHOTOGRAPHY_SHAKE_RISK_LOW, "GST_PHOTOGRAPHY_SHAKE_RISK_LOW", "low"}, - {GST_PHOTOGRAPHY_SHAKE_RISK_MEDIUM, "GST_PHOTOGRAPHY_SHAKE_RISK_MEDIUM", - "medium"}, - {GST_PHOTOGRAPHY_SHAKE_RISK_HIGH, "GST_PHOTOGRAPHY_SHAKE_RISK_HIGH", - "high"}, - {0, NULL, NULL} - }; - etype = g_enum_register_static ("GstPhotoShakeRisk", values); - } - return etype; -} - -/* Generated data ends here */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst-libs/gst/interfaces/photography-enumtypes.h --- a/gst_plugins_good/gst-libs/gst/interfaces/photography-enumtypes.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ - -/* Generated data (by glib-mkenums) */ - -#ifndef __GST_PHOTOGRAPHY_ENUM_TYPES_H__ -#define __GST_PHOTOGRAPHY_ENUM_TYPES_H__ - -#include - -G_BEGIN_DECLS - -/* enumerations from "photography.h" */ -GType gst_white_balance_mode_get_type (void); -#define GST_TYPE_WHITE_BALANCE_MODE (gst_white_balance_mode_get_type()) -GType gst_colour_tone_mode_get_type (void); -#define GST_TYPE_COLOUR_TONE_MODE (gst_colour_tone_mode_get_type()) -GType gst_scene_mode_get_type (void); -#define GST_TYPE_SCENE_MODE (gst_scene_mode_get_type()) -GType gst_flash_mode_get_type (void); -#define GST_TYPE_FLASH_MODE (gst_flash_mode_get_type()) -GType gst_focus_status_get_type (void); -#define GST_TYPE_FOCUS_STATUS (gst_focus_status_get_type()) -GType gst_photo_caps_get_type (void); -#define GST_TYPE_PHOTO_CAPS (gst_photo_caps_get_type()) -GType gst_photo_shake_risk_get_type (void); -#define GST_TYPE_PHOTO_SHAKE_RISK (gst_photo_shake_risk_get_type()) -G_END_DECLS - -#endif /* __GST_PHOTOGRAPHY_ENUM_TYPES_H__ */ - -/* Generated data ends here */ - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst-libs/gst/interfaces/photography.c --- a/gst_plugins_good/gst-libs/gst/interfaces/photography.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,367 +0,0 @@ -/* GStreamer - * - * Copyright (C) 2008 Nokia Corporation - * - * photography.c: photography interface for digital imaging - * - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "photography.h" - -/** - * SECTION:photography - * @short_description: Interface for elements having digital imaging controls - * - * The interface allows access to some common digital imaging controls - */ - -static void gst_photography_iface_init (GstPhotographyInterface * iface); - -EXPORT_C GType -gst_photography_get_type (void) -{ - static GType gst_photography_type = 0; - - if (!gst_photography_type) { - static const GTypeInfo gst_photography_info = { - sizeof (GstPhotographyInterface), - (GBaseInitFunc) gst_photography_iface_init, - NULL, - NULL, - NULL, - NULL, - 0, - 0, - NULL, - }; - - gst_photography_type = g_type_register_static (G_TYPE_INTERFACE, - "GstPhotography", &gst_photography_info, 0); - g_type_interface_add_prerequisite (gst_photography_type, - GST_TYPE_IMPLEMENTS_INTERFACE); - } - - return gst_photography_type; -} - -static void -gst_photography_iface_init (GstPhotographyInterface * iface) -{ - /* default virtual functions */ - iface->get_ev_compensation = NULL; - iface->get_iso_speed = NULL; - iface->get_aperture = NULL; - iface->get_exposure = NULL; - iface->get_white_balance_mode = NULL; - iface->get_colour_tone_mode = NULL; - iface->get_scene_mode = NULL; - iface->get_flash_mode = NULL; - iface->get_zoom = NULL; - - iface->set_ev_compensation = NULL; - iface->set_iso_speed = NULL; - iface->set_aperture = NULL; - iface->set_exposure = NULL; - iface->set_white_balance_mode = NULL; - iface->set_colour_tone_mode = NULL; - iface->set_scene_mode = NULL; - iface->set_flash_mode = NULL; - iface->set_zoom = NULL; - - iface->get_capabilities = NULL; - iface->prepare_for_capture = NULL; - iface->set_autofocus = NULL; -} - -#define GST_PHOTOGRAPHY_FUNC_TEMPLATE(function_name, param_type) \ -EXPORT_C gboolean \ -gst_photography_set_ ## function_name (GstPhotography * photo, param_type param) \ -{ \ - GstPhotographyInterface *iface; \ - g_return_val_if_fail (photo != NULL, FALSE); \ - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); \ - if (iface->set_ ## function_name) { \ - return iface->set_ ## function_name (photo, param); \ - } \ - return FALSE; \ -} \ -EXPORT_C gboolean \ -gst_photography_get_ ## function_name (GstPhotography * photo, param_type * param) \ -{ \ - GstPhotographyInterface *iface; \ - g_return_val_if_fail (photo != NULL, FALSE); \ - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); \ - if (iface->get_ ## function_name) { \ - return iface->get_ ## function_name (photo, param); \ - } \ - return FALSE; \ -} - - -/** - * gst_photography_set_ev_compensation: - * @photo: #GstPhotography interface of a #GstElement - * @ev_comp: ev compensation value to set - * - * Set the ev compensation value for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_ev_compensation: - * @photo: #GstPhotography interface of a #GstElement - * @ev_comp: ev compensation value to get - * - * Get the ev compensation value for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (ev_compensation, gfloat); - -/** - * gst_photography_set_iso_speed: - * @photo: #GstPhotography interface of a #GstElement - * @iso_speed: ISO speed value to set - * - * Set the ISO value (light sensivity) for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_iso_speed: - * @photo: #GstPhotography interface of a #GstElement - * @iso_speed: ISO speed value to get - * - * Get the ISO value (light sensivity) for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (iso_speed, guint); - -/** - * gst_photography_set_aperture: - * @photo: #GstPhotography interface of a #GstElement - * @aperture: aperture value to set - * - * Set the aperture value for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_aperture: - * @photo: #GstPhotography interface of a #GstElement - * @aperture: aperture value to get - * - * Get the aperture value for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (aperture, guint); - -/** - * gst_photography_set_exposure: - * @photo: #GstPhotography interface of a #GstElement - * @exposure: exposure time to set - * - * Set the fixed exposure time (in us) for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_exposure: - * @photo: #GstPhotography interface of a #GstElement - * @exposure: exposure time to get - * - * Get the fixed exposure time (in us) for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (exposure, guint32); - -/** - * gst_photography_set_white_balance_mode: - * @photo: #GstPhotography interface of a #GstElement - * @wb_mode: #GstWhiteBalanceMode to set - * - * Set the white balance mode for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_white_balance_mode: - * @photo: #GstPhotography interface of a #GstElement - * @wb_mode: #GstWhiteBalanceMode to get - * - * Get the white balance mode for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (white_balance_mode, GstWhiteBalanceMode); - -/** - * gst_photography_set_colour_tone_mode: - * @photo: #GstPhotography interface of a #GstElement - * @tone_mode: #GstColourToneMode to set - * - * Set the colour tone mode for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_colour_tone_mode: - * @photo: #GstPhotography interface of a #GstElement - * @tone_mode: #GstColourToneMode to get - * - * Get the colour tone mode for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (colour_tone_mode, GstColourToneMode); - -/** - * gst_photography_set_scene_mode: - * @photo: #GstPhotography interface of a #GstElement - * @scene_mode: #GstSceneMode to set - * - * Set the scene mode for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_scene_mode: - * @photo: #GstPhotography interface of a #GstElement - * @scene_mode: #GstSceneMode to get - * - * Get the scene mode for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (scene_mode, GstSceneMode); - -/** - * gst_photography_set_flash_mode: - * @photo: #GstPhotography interface of a #GstElement - * @flash_mode: #GstFlashMode to set - * - * Set the flash mode for the #GstElement - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_flash_mode: - * @photo: #GstPhotography interface of a #GstElement - * @flash_mode: #GstFlashMode to get - * - * Get the flash mode for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (flash_mode, GstFlashMode); - -/** - * gst_photography_set_zoom: - * @photo: #GstPhotography interface of a #GstElement - * @zoom: zoom value to set - * - * Set the zoom value for the #GstElement. - * E.g. 1.0 to get original image and 3.0 for 3x zoom and so on. - * - * Returns: %TRUE if setting the value succeeded, %FALSE otherwise - */ -/** - * gst_photography_get_zoom: - * @photo: #GstPhotography interface of a #GstElement - * @zoom: zoom value to get - * - * Get the zoom value for the #GstElement - * - * Returns: %TRUE if getting the value succeeded, %FALSE otherwise - */ -GST_PHOTOGRAPHY_FUNC_TEMPLATE (zoom, gfloat); - -/** - * gst_photography_get_capabilities: - * @photo: #GstPhotography interface of a #GstElement - * - * Get #GstPhotoCaps bitmask value that indicates what photography - * interface features the #GstElement supports - * - * Returns: #GstPhotoCaps value - */ -EXPORT_C -GstPhotoCaps -gst_photography_get_capabilities (GstPhotography * photo) -{ - GstPhotographyInterface *iface; - g_return_val_if_fail (photo != NULL, GST_PHOTOGRAPHY_CAPS_NONE); - - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); - if (iface->get_capabilities) { - return iface->get_capabilities (photo); - } else { - return GST_PHOTOGRAPHY_CAPS_NONE; - } -} - -/** - * gst_photography_prepare_for_capture: - * @photo: #GstPhotography interface of a #GstElement - * @func: callback that is called after capturing has been prepared - * @user_data: user data that will be passed to the callback @func - * - * Start preparations for capture. @func callback is called after - * preparations are done. - */ -EXPORT_C -void -gst_photography_prepare_for_capture (GstPhotography * photo, - GstPhotoCapturePrepared func, gpointer user_data) -{ - GstPhotographyInterface *iface; - g_return_if_fail (photo != NULL); - - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); - if (iface->prepare_for_capture) { - iface->prepare_for_capture (photo, func, user_data); - } -} - -/** - * gst_photography_set_autofocus: - * @photo: #GstPhotography interface of a #GstElement - * @on: %TRUE to start autofocusing, %FALSE to stop autofocusing - * - * Start or stop autofocusing. %GST_PHOTOGRAPHY_AUTOFOCUS_DONE - * message is posted to bus when autofocusing has finished. - */ -EXPORT_C -void -gst_photography_set_autofocus (GstPhotography * photo, gboolean on) -{ - GstPhotographyInterface *iface; - g_return_if_fail (photo != NULL); - - iface = GST_PHOTOGRAPHY_GET_IFACE (photo); - if (iface->set_autofocus) { - iface->set_autofocus (photo, on); - } -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst-libs/gst/interfaces/photography.h --- a/gst_plugins_good/gst-libs/gst/interfaces/photography.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,267 +0,0 @@ -/* GStreamer - * - * Copyright (C) 2008 Nokia Corporation - * - * photography.h: photography interface for digital imaging - * - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_PHOTOGRAPHY_H__ -#define __GST_PHOTOGRAPHY_H__ - -#include -#include "photography-enumtypes.h" - -G_BEGIN_DECLS - -#define GST_TYPE_PHOTOGRAPHY \ - (gst_photography_get_type ()) -#define GST_PHOTOGRAPHY(obj) \ - (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PHOTOGRAPHY, GstPhotography)) -#define GST_IS_PHOTOGRAPHY(obj) \ - (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PHOTOGRAPHY)) -#define GST_PHOTOGRAPHY_GET_IFACE(inst) \ - (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PHOTOGRAPHY, GstPhotographyInterface)) - - -/* Custom GstMessage name that will be sent to GstBus when autofocusing - is complete */ -#define GST_PHOTOGRAPHY_AUTOFOCUS_DONE "autofocus-done" - -/* Custom GstMessage name that will be sent to GstBus when shake risk changes */ -#define GST_PHOTOGRAPHY_SHAKE_RISK "shake-risk" - -/** - * GstPhotography: - * - * Opaque #GstPhotography data structure. - */ -typedef struct _GstPhotography GstPhotography; - -typedef enum -{ - GST_PHOTOGRAPHY_WB_MODE_AUTO = 0, - GST_PHOTOGRAPHY_WB_MODE_DAYLIGHT, - GST_PHOTOGRAPHY_WB_MODE_CLOUDY, - GST_PHOTOGRAPHY_WB_MODE_SUNSET, - GST_PHOTOGRAPHY_WB_MODE_TUNGSTEN, - GST_PHOTOGRAPHY_WB_MODE_FLUORESCENT -} GstWhiteBalanceMode; - -typedef enum -{ - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NORMAL = 0, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SEPIA, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NEGATIVE, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_GRAYSCALE, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_NATURAL, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_VIVID, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_COLORSWAP, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_SOLARIZE, - GST_PHOTOGRAPHY_COLOUR_TONE_MODE_OUT_OF_FOCUS -} GstColourToneMode; - -typedef enum -{ - GST_PHOTOGRAPHY_SCENE_MODE_MANUAL = 0, - GST_PHOTOGRAPHY_SCENE_MODE_CLOSEUP, - GST_PHOTOGRAPHY_SCENE_MODE_PORTRAIT, - GST_PHOTOGRAPHY_SCENE_MODE_LANDSCAPE, - GST_PHOTOGRAPHY_SCENE_MODE_SPORT, - GST_PHOTOGRAPHY_SCENE_MODE_NIGHT, - GST_PHOTOGRAPHY_SCENE_MODE_AUTO -} GstSceneMode; - -typedef enum -{ - GST_PHOTOGRAPHY_FLASH_MODE_AUTO = 0, - GST_PHOTOGRAPHY_FLASH_MODE_OFF, - GST_PHOTOGRAPHY_FLASH_MODE_ON, - GST_PHOTOGRAPHY_FLASH_MODE_FILL_IN, - GST_PHOTOGRAPHY_FLASH_MODE_RED_EYE -} GstFlashMode; - -typedef enum -{ - GST_PHOTOGRAPHY_FOCUS_STATUS_NONE = 0, - GST_PHOTOGRAPHY_FOCUS_STATUS_RUNNING, - GST_PHOTOGRAPHY_FOCUS_STATUS_FAIL, - GST_PHOTOGRAPHY_FOCUS_STATUS_SUCCESS -} GstFocusStatus; - -typedef enum -{ - GST_PHOTOGRAPHY_CAPS_NONE = (0 << 0), - GST_PHOTOGRAPHY_CAPS_EV_COMP = (1 << 0), - GST_PHOTOGRAPHY_CAPS_ISO_SPEED = (1 << 1), - GST_PHOTOGRAPHY_CAPS_WB_MODE = (1 << 2), - GST_PHOTOGRAPHY_CAPS_TONE = (1 << 3), - GST_PHOTOGRAPHY_CAPS_SCENE = (1 << 4), - GST_PHOTOGRAPHY_CAPS_FLASH = (1 << 5), - GST_PHOTOGRAPHY_CAPS_ZOOM = (1 << 6), - GST_PHOTOGRAPHY_CAPS_FOCUS = (1 << 7), - GST_PHOTOGRAPHY_CAPS_APERTURE = (1 << 8), - GST_PHOTOGRAPHY_CAPS_EXPOSURE = (1 << 9), - GST_PHOTOGRAPHY_CAPS_SHAKE = (1 << 10) -} GstPhotoCaps; - -typedef enum -{ - GST_PHOTOGRAPHY_SHAKE_RISK_LOW = 0, - GST_PHOTOGRAPHY_SHAKE_RISK_MEDIUM, - GST_PHOTOGRAPHY_SHAKE_RISK_HIGH, -} GstPhotoShakeRisk; - -typedef struct -{ - GstWhiteBalanceMode wb_mode; - GstColourToneMode tone_mode; - GstSceneMode scene_mode; - GstFlashMode flash_mode; - guint32 exposure; - guint aperture; - gfloat ev_compensation; - guint iso_speed; - gfloat zoom; -} GstPhotoSettings; - -/** - * GstPhotoCapturePrepared: - * @data: user data that has been given, when registering the callback - * - * This callback will be called when the element has finished preparations - * for photo capture. - */ -typedef void (*GstPhotoCapturePrepared) (gpointer data); - -/** - * GstPhotographyInterface: - * @parent: parent interface type. - * @get_ev_compensation: vmethod to get ev exposure compensation value - * @get_iso_speed: vmethod to get iso speed (light sensitivity) value - * @get_aperture: vmethod to get aperture value - * @get_exposure: vmethod to get exposure time value - * @get_white_balance_mode: vmethod to get white balance mode value - * @get_colour_tone_mode: vmethod to get colour tone mode value - * @get_scene_mode: vmethod to get scene mode value - * @get_flash_mode: vmethod to get flash mode value - * @get_zoom: vmethod to get zoom factor value - * @set_ev_compensation: vmethod to set ev exposure compensation value - * @set_iso_speed: vmethod to set iso speed (light sensitivity) value - * @set_aperture: vmethod to set aperture value - * @set_exposure: vmethod to set exposure time value - * @set_white_balance_mode: vmethod to set white balance mode value - * @set_colour_tone_mode: vmethod to set colour tone mode value - * @set_scene_mode: vmethod to set scene mode value - * @set_flash_mode: vmethod to set flash mode value - * @set_zoom: vmethod to set zoom factor value - * @get_capabilities: vmethod to get supported capabilities of the interface - * @prepare_for_capture: vmethod to tell the element to prepare for capturing - * @set_autofocus: vmethod to set autofocus on/off - * - * #GstPhotographyInterface interface. - */ -typedef struct _GstPhotographyInterface -{ - GTypeInterface parent; - - /* virtual functions */ - gboolean (*get_ev_compensation) (GstPhotography * photo, gfloat * ev_comp); - gboolean (*get_iso_speed) (GstPhotography * photo, guint * iso_speed); - gboolean (*get_aperture) (GstPhotography * photo, guint * aperture); - gboolean (*get_exposure) (GstPhotography * photo, guint32 * exposure); - gboolean (*get_white_balance_mode) (GstPhotography * photo, - GstWhiteBalanceMode * wb_mode); - gboolean (*get_colour_tone_mode) (GstPhotography * photo, - GstColourToneMode * tone_mode); - gboolean (*get_scene_mode) (GstPhotography * photo, - GstSceneMode * scene_mode); - gboolean (*get_flash_mode) (GstPhotography * photo, - GstFlashMode * flash_mode); - gboolean (*get_zoom) (GstPhotography * photo, gfloat * zoom); - - gboolean (*set_ev_compensation) (GstPhotography * photo, gfloat ev_comp); - gboolean (*set_iso_speed) (GstPhotography * photo, guint iso_speed); - gboolean (*set_aperture) (GstPhotography * photo, guint aperture); - gboolean (*set_exposure) (GstPhotography * photo, guint32 exposure); - gboolean (*set_white_balance_mode) (GstPhotography * photo, - GstWhiteBalanceMode wb_mode); - gboolean (*set_colour_tone_mode) (GstPhotography * photo, - GstColourToneMode tone_mode); - gboolean (*set_scene_mode) (GstPhotography * photo, - GstSceneMode scene_mode); - gboolean (*set_flash_mode) (GstPhotography * photo, - GstFlashMode flash_mode); - gboolean (*set_zoom) (GstPhotography * photo, gfloat zoom); - - GstPhotoCaps (*get_capabilities) (GstPhotography * photo); - void (*prepare_for_capture) (GstPhotography * photo, - GstPhotoCapturePrepared func, gpointer user_data); - void (*set_autofocus) (GstPhotography * photo, gboolean on); - - /*< private > */ - gpointer _gst_reserved[GST_PADDING]; -} GstPhotographyInterface; - -IMPORT_C GType gst_photography_get_type (void); - -/* virtual class function wrappers */ -IMPORT_C gboolean gst_photography_get_ev_compensation (GstPhotography * photo, - gfloat * ev_comp); -IMPORT_C gboolean gst_photography_get_iso_speed (GstPhotography * photo, - guint * iso_speed); -IMPORT_C gboolean gst_photography_get_aperture (GstPhotography * photo, - guint * aperture); -IMPORT_C gboolean gst_photography_get_exposure (GstPhotography * photo, - guint32 * exposure); -IMPORT_C gboolean gst_photography_get_white_balance_mode (GstPhotography * photo, - GstWhiteBalanceMode * wb_mode); -IMPORT_C gboolean gst_photography_get_colour_tone_mode (GstPhotography * photo, - GstColourToneMode * tone_mode); -IMPORT_C gboolean gst_photography_get_scene_mode (GstPhotography * photo, - GstSceneMode * scene_mode); -IMPORT_C gboolean gst_photography_get_flash_mode (GstPhotography * photo, - GstFlashMode * flash_mode); -IMPORT_C gboolean gst_photography_get_zoom (GstPhotography * photo, gfloat * zoom); - -IMPORT_C gboolean gst_photography_set_ev_compensation (GstPhotography * photo, - gfloat ev_comp); -IMPORT_C gboolean gst_photography_set_iso_speed (GstPhotography * photo, - guint iso_speed); -IMPORT_C gboolean gst_photography_set_aperture (GstPhotography * photo, guint aperture); -IMPORT_C gboolean gst_photography_set_exposure (GstPhotography * photo, guint exposure); -IMPORT_C gboolean gst_photography_set_white_balance_mode (GstPhotography * photo, - GstWhiteBalanceMode wb_mode); -IMPORT_C gboolean gst_photography_set_colour_tone_mode (GstPhotography * photo, - GstColourToneMode tone_mode); -IMPORT_C gboolean gst_photography_set_scene_mode (GstPhotography * photo, - GstSceneMode scene_mode); -IMPORT_C gboolean gst_photography_set_flash_mode (GstPhotography * photo, - GstFlashMode flash_mode); -IMPORT_C gboolean gst_photography_set_zoom (GstPhotography * photo, gfloat zoom); - -IMPORT_C GstPhotoCaps gst_photography_get_capabilities (GstPhotography * photo); - -IMPORT_C void gst_photography_prepare_for_capture (GstPhotography * photo, - GstPhotoCapturePrepared func, gpointer user_data); - -IMPORT_C void gst_photography_set_autofocus (GstPhotography * photo, gboolean on); - -G_END_DECLS - -#endif /* __GST_PHOTOGRAPHY_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/camerabingeneral.c --- a/gst_plugins_good/gst/camerabin/camerabingeneral.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,263 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:camerabingeneral - * @short_description: helper functions for #GstCameraBin and it's modules - * - * Common helper functions for #GstCameraBin, #GstCameraBinImage and - * #GstCameraBinVideo. - * - */ - -#include "camerabingeneral.h" -#include - -GST_DEBUG_CATEGORY (gst_camerabin_debug); - -static gboolean -camerabin_general_dbg_have_event (GstPad * pad, GstEvent * event, - gpointer u_data) -{ - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NEWSEGMENT: - { - GstElement *elem = (GstElement *) u_data; - gchar *elem_name = gst_element_get_name (elem); - gchar *pad_name = gst_pad_get_name (pad); - - gboolean update; - gdouble rate; - GstFormat format; - gint64 start, stop, pos; - gst_event_parse_new_segment (event, &update, &rate, &format, &start, - &stop, &pos); - - GST_DEBUG ("element %s, pad %s, new_seg_start =%" GST_TIME_FORMAT - ", new_seg_stop =%" GST_TIME_FORMAT - ", new_seg_pos =%" GST_TIME_FORMAT "\n", elem_name, pad_name, - GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (pos)); - - g_free (pad_name); - g_free (elem_name); - } - break; - default: - break; - } - - return TRUE; -} - -static gboolean -camerabin_general_dbg_have_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data) -{ - GstElement *elem = (GstElement *) u_data; - gchar *elem_name = gst_element_get_name (elem); - gchar *pad_name = gst_pad_get_name (pad); - - GST_DEBUG ("element %s, pad %s, buf_ts =%" GST_TIME_FORMAT "\n", elem_name, - pad_name, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); - - g_free (pad_name); - g_free (elem_name); - - return TRUE; - -} - -void -camerabin_general_dbg_set_probe (GstElement * elem, gchar * pad_name, - gboolean buf, gboolean evt) -{ - GstPad *pad = gst_element_get_static_pad (elem, pad_name); - - if (buf) - gst_pad_add_buffer_probe (pad, - G_CALLBACK (camerabin_general_dbg_have_buffer), elem); - if (evt) - gst_pad_add_event_probe (pad, - G_CALLBACK (camerabin_general_dbg_have_event), elem); - - gst_object_unref (pad); -} - -/** - * gst_camerabin_add_element: - * @bin: add an element to this bin - * @new_elem: new element to be added - * - * Adds given element to given @bin. Looks for an unconnected src pad - * from the @bin and links the element to it. Raises an error if adding - * or linking failed. - * - * Returns: %TRUE if adding and linking succeeded, %FALSE otherwise. - */ -gboolean -gst_camerabin_add_element (GstBin * bin, GstElement * new_elem) -{ - gboolean ret = FALSE; - - ret = gst_camerabin_try_add_element (bin, new_elem); - - if (!ret) { - gchar *elem_name = gst_element_get_name (new_elem); - GST_ELEMENT_ERROR (bin, CORE, NEGOTIATION, (NULL), - ("linking %s failed", elem_name)); - g_free (elem_name); - } - - return ret; -} - -/** - * gst_camerabin_try_add_element: - * @bin: tries adding an element to this bin - * @new_elem: new element to be added - * - * Adds given element to given @bin. Looks for an unconnected src pad - * from the @bin and links the element to it. - * - * Returns: %TRUE if adding and linking succeeded, %FALSE otherwise. - */ -gboolean -gst_camerabin_try_add_element (GstBin * bin, GstElement * new_elem) -{ - GstPad *bin_pad; - GstElement *bin_elem; - gboolean ret = TRUE; - - if (!bin || !new_elem) { - return FALSE; - } - - /* Get pads for linking */ - GST_DEBUG ("finding unconnected src pad"); - //bin_pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SRC); - bin_pad = gst_bin_find_unconnected_pad (bin, GST_PAD_SRC); - GST_DEBUG ("unconnected pad %s:%s", GST_DEBUG_PAD_NAME (bin_pad)); - /* Add to bin */ - gst_bin_add (GST_BIN (bin), new_elem); - /* Link, if unconnected pad was found, otherwise just add it to bin */ - if (bin_pad) { - bin_elem = gst_pad_get_parent_element (bin_pad); - gst_object_unref (bin_pad); - if (!gst_element_link (bin_elem, new_elem)) { - gst_bin_remove (bin, new_elem); - ret = FALSE; - } - gst_object_unref (bin_elem); - } - - return ret; -} - -/** - * gst_camerabin_create_and_add_element: - * @bin: tries adding an element to this bin - * @elem_name: name of the element to be created - * - * Creates an element according to given name and - * adds it to given @bin. Looks for an unconnected src pad - * from the @bin and links the element to it. - * - * Returns: pointer to the new element if successful, NULL otherwise. - */ -GstElement * -gst_camerabin_create_and_add_element (GstBin * bin, const gchar * elem_name) -{ - GstElement *new_elem = NULL; - - GST_DEBUG ("adding %s", elem_name); - new_elem = gst_element_factory_make (elem_name, NULL); - if (!new_elem) { - GST_ELEMENT_ERROR (bin, CORE, MISSING_PLUGIN, (NULL), - ("could not create \"%s\" element.", elem_name)); - } else if (!gst_camerabin_add_element (bin, new_elem)) { - new_elem = NULL; - } - - return new_elem; -} - -/** - * gst_camerabin_remove_elements_from_bin: - * @bin: removes all elements from this bin - * - * Removes all elements from this @bin. - */ -void -gst_camerabin_remove_elements_from_bin (GstBin * bin) -{ - GstIterator *iter = NULL; - gpointer data = NULL; - GstElement *elem = NULL; - gboolean done = FALSE; - - iter = gst_bin_iterate_elements (bin); - while (!done) { - switch (gst_iterator_next (iter, &data)) { - case GST_ITERATOR_OK: - elem = GST_ELEMENT (data); - gst_bin_remove (bin, elem); - /* Iterator increased the element refcount, so unref */ - gst_object_unref (elem); - break; - case GST_ITERATOR_RESYNC: - gst_iterator_resync (iter); - break; - case GST_ITERATOR_ERROR: - GST_WARNING_OBJECT (bin, "error in iterating elements"); - done = TRUE; - break; - case GST_ITERATOR_DONE: - done = TRUE; - break; - } - } - gst_iterator_free (iter); -} - -/** - * gst_camerabin_drop_eos_probe: - * @pad: pad receiving the event - * @event: received event - * @u_data: not used - * - * Event probe that drop all eos events. - * - * Returns: FALSE to drop the event, TRUE otherwise - */ -gboolean -gst_camerabin_drop_eos_probe (GstPad * pad, GstEvent * event, gpointer u_data) -{ - gboolean ret = TRUE; - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - GST_DEBUG ("dropping eos in %s:%s", GST_DEBUG_PAD_NAME (pad)); - ret = FALSE; - break; - default: - break; - } - return ret; -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/camerabingeneral.h --- a/gst_plugins_good/gst/camerabin/camerabingeneral.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __CAMERABIN_GENERAL_H_ -#define __CAMERABIN_GENERAL_H_ - -#include -#include - -#include - - -typedef struct timeval TIME_TYPE; -#define GET_TIME(t) do { gettimeofday(&(t), NULL); } while(0) -#define DIFF_TIME(t2,t1,d) do { d = ((t2).tv_sec - (t1).tv_sec) * 1000000 + \ - (t2).tv_usec - (t1).tv_usec; } while(0) - -#define _INIT_TIMER_BLOCK TIME_TYPE t1, t2; guint32 d; do {;}while (0) - -#define _OPEN_TIMER_BLOCK { GET_TIME(t1); do {;}while (0) -#define _CLOSE_TIMER_BLOCK GET_TIME(t2); DIFF_TIME(t2,t1,d); \ - GST_DEBUG("elapsed time = %u\n", d); \ - } do {;}while (0) - - -extern void -camerabin_general_dbg_set_probe (GstElement * elem, gchar * pad_name, - gboolean buf, gboolean evt); - -gboolean gst_camerabin_try_add_element (GstBin * bin, GstElement * new_elem); - -gboolean gst_camerabin_add_element (GstBin * bin, GstElement * new_elem); - -GstElement *gst_camerabin_create_and_add_element (GstBin * bin, - const gchar * elem_name); - -void gst_camerabin_remove_elements_from_bin (GstBin * bin); - -gboolean -gst_camerabin_drop_eos_probe (GstPad * pad, GstEvent * event, gpointer u_data); - -GST_DEBUG_CATEGORY_EXTERN (gst_camerabin_debug); -#define GST_CAT_DEFAULT gst_camerabin_debug - -#endif /* #ifndef __CAMERABIN_GENERAL_H_ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/camerabinimage.c --- a/gst_plugins_good/gst/camerabin/camerabinimage.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,571 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:camerabinimage - * @short_description: image capturing module of #GstCameraBin - * - * - * - * - * The pipeline for this module is: - * - * - * - *----------------------------------------------------------------------------- - * (src0) -> queue -> - * -> [post proc] -> tee < - * (src1) -> imageenc -> metadatamuxer -> filesink - *----------------------------------------------------------------------------- - * - * - * - * The property of elements are: - * - * queue - "max-size-buffers", 1, "leaky", 2, - * - * The image bin opens file for image writing in READY to PAUSED state change. - * The image bin closes the file in PAUSED to READY state change. - * - * - * - */ - -/* - * includes - */ - -#include - -#include "camerabinimage.h" -#include "camerabingeneral.h" - -#include "string.h" - -/* default internal element names */ - -#define DEFAULT_SINK "filesink" -#define DEFAULT_ENC "jpegenc" -#define DEFAULT_META_MUX "metadatamux" - -enum -{ - PROP_0, - PROP_FILENAME -}; - -static gboolean gst_camerabin_image_create_elements (GstCameraBinImage * img); -static void gst_camerabin_image_destroy_elements (GstCameraBinImage * img); - -static void gst_camerabin_image_dispose (GstCameraBinImage * sink); -static GstStateChangeReturn -gst_camerabin_image_change_state (GstElement * element, - GstStateChange transition); -static gboolean gst_camerabin_image_send_event (GstElement * element, - GstEvent * event); -static void gst_camerabin_image_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_camerabin_image_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -GST_BOILERPLATE (GstCameraBinImage, gst_camerabin_image, GstBin, GST_TYPE_BIN); - -static const GstElementDetails gst_camerabin_image_details = -GST_ELEMENT_DETAILS ("Image capture bin for camerabin", - "Bin/Image", - "Process and store image data", - "Edgard Lima \n" - "Nokia Corporation "); - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY); - -static void -gst_camerabin_image_base_init (gpointer klass) -{ - GstElementClass *eklass = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_pad_template (eklass, - gst_static_pad_template_get (&sink_template)); - gst_element_class_add_pad_template (eklass, - gst_static_pad_template_get (&src_template)); - gst_element_class_set_details (eklass, &gst_camerabin_image_details); -} - -static void -gst_camerabin_image_class_init (GstCameraBinImageClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *eklass = GST_ELEMENT_CLASS (klass); - - gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = - (GObjectFinalizeFunc) GST_DEBUG_FUNCPTR (gst_camerabin_image_dispose); - eklass->change_state = GST_DEBUG_FUNCPTR (gst_camerabin_image_change_state); - eklass->send_event = GST_DEBUG_FUNCPTR (gst_camerabin_image_send_event); - - gobject_class->set_property = - GST_DEBUG_FUNCPTR (gst_camerabin_image_set_property); - gobject_class->get_property = - GST_DEBUG_FUNCPTR (gst_camerabin_image_get_property); - - /** - * GstCameraBinImage:filename - * - * This property can be used to specify the filename of the image. - * - **/ - g_object_class_install_property (gobject_class, PROP_FILENAME, - g_param_spec_string ("filename", "Filename", - "Filename of the image to save", NULL, G_PARAM_READWRITE)); -} - -static void -gst_camerabin_image_init (GstCameraBinImage * img, - GstCameraBinImageClass * g_class) -{ - img->filename = g_string_new (""); - - img->pad_tee_enc = NULL; - img->pad_tee_view = NULL; - - img->post = NULL; - img->tee = NULL; - img->enc = NULL; - img->user_enc = NULL; - img->meta_mux = NULL; - img->sink = NULL; - img->queue = NULL; - - /* Create src and sink ghost pads */ - img->sinkpad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); - gst_element_add_pad (GST_ELEMENT (img), img->sinkpad); - - img->srcpad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); - gst_element_add_pad (GST_ELEMENT (img), img->srcpad); - - img->elements_created = FALSE; -} - -static void -gst_camerabin_image_dispose (GstCameraBinImage * img) -{ - g_string_free (img->filename, TRUE); - img->filename = NULL; - - if (img->user_enc) { - gst_object_unref (img->user_enc); - img->user_enc = NULL; - } - - if (img->post) { - gst_object_unref (img->post); - img->post = NULL; - } - - G_OBJECT_CLASS (parent_class)->dispose ((GObject *) img); -} - -static GstStateChangeReturn -gst_camerabin_image_change_state (GstElement * element, - GstStateChange transition) -{ - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - GstCameraBinImage *img = GST_CAMERABIN_IMAGE (element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - if (!gst_camerabin_image_create_elements (img)) { - return GST_STATE_CHANGE_FAILURE; - } - /* Allow setting filename when image bin in READY state */ - gst_element_set_locked_state (img->sink, TRUE); - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - gst_element_set_locked_state (img->sink, FALSE); - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - /* Set sink to NULL in order to write the file _now_ */ - GST_INFO ("write img file: %s", img->filename->str); - gst_element_set_locked_state (img->sink, TRUE); - gst_element_set_state (img->sink, GST_STATE_NULL); - break; - default: - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - case GST_STATE_CHANGE_READY_TO_NULL: - gst_camerabin_image_destroy_elements (img); - break; - default: - break; - } - - return ret; -} - -gboolean -gst_camerabin_image_send_event (GstElement * element, GstEvent * event) -{ - GstCameraBinImage *bin = GST_CAMERABIN_IMAGE (element); - gboolean ret = FALSE; - - GST_INFO ("got %s event", GST_EVENT_TYPE_NAME (event)); - - if (GST_EVENT_IS_DOWNSTREAM (event)) { - ret = gst_pad_send_event (bin->sinkpad, event); - } else { - if (bin->sink) { - ret = gst_element_send_event (bin->sink, event); - } else { - GST_WARNING ("upstream event handling failed"); - } - } - - return ret; -} - -static void -gst_camerabin_image_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstCameraBinImage *bin = GST_CAMERABIN_IMAGE (object); - - switch (prop_id) { - case PROP_FILENAME: - g_string_assign (bin->filename, g_value_get_string (value)); - if (bin->sink) { - g_object_set (G_OBJECT (bin->sink), "location", bin->filename->str, - NULL); - } else { - GST_INFO ("no sink, not setting name yet"); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_camerabin_image_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstCameraBinImage *bin = GST_CAMERABIN_IMAGE (object); - - switch (prop_id) { - case PROP_FILENAME: - g_value_set_string (value, bin->filename->str); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* - * static helper functions implementation - */ - -/** - * metadata_write_probe: - * @pad: sink pad of metadata muxer - * @buffer: received buffer - * @u_data: image bin object - * - * Buffer probe that sets Xmp.dc.type and Xmp.dc.format tags - * to metadata muxer based on preceding element src pad caps. - * - * Returns: TRUE always - */ -static gboolean -metadata_write_probe (GstPad * pad, GstBuffer * buffer, gpointer u_data) -{ - /* Add XMP tags */ - GstCameraBinImage *img = NULL; - GstTagSetter *setter = NULL; - GstPad *srcpad = NULL; - GstCaps *caps = NULL; - GstStructure *st = NULL; - - img = GST_CAMERABIN_IMAGE (u_data); - - g_return_val_if_fail (img != NULL, TRUE); - - setter = GST_TAG_SETTER (img->meta_mux); - - if (!setter) { - GST_WARNING_OBJECT (img, "setting tags failed"); - goto done; - } - - /* Xmp.dc.type tag */ - gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE, - GST_TAG_CODEC, "Image", NULL); - /* Xmp.dc.format tag */ - if (img->enc) { - srcpad = gst_element_get_static_pad (img->enc, "src"); - } - GST_LOG_OBJECT (img, "srcpad:%" GST_PTR_FORMAT, srcpad); - if (srcpad) { - caps = gst_pad_get_negotiated_caps (srcpad); - GST_LOG_OBJECT (img, "caps:%" GST_PTR_FORMAT, caps); - if (caps) { - /* If there are many structures, we can't know which one to use */ - if (gst_caps_get_size (caps) != 1) { - GST_WARNING_OBJECT (img, "can't decide structure for format tag"); - goto done; - } - st = gst_caps_get_structure (caps, 0); - if (st) { - GST_DEBUG_OBJECT (img, "Xmp.dc.format:%s", gst_structure_get_name (st)); - gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE, - GST_TAG_VIDEO_CODEC, gst_structure_get_name (st), NULL); - } - } - } -done: - if (caps) - gst_caps_unref (caps); - if (srcpad) - gst_object_unref (srcpad); - - return TRUE; -} - - -/** - * gst_camerabin_image_create_elements: - * @img: a pointer to #GstCameraBinImage object - * - * This function creates needed #GstElements and resources to capture images. - * Use gst_camerabin_image_destroy_elements to release these resources. - * - * Image bin: - * img->sinkpad ! [ post process !] tee name=t0 ! encoder ! metadata ! filesink - * t0. ! queue ! img->srcpad - * - * Returns: %TRUE if succeeded or FALSE if failed - */ -static gboolean -gst_camerabin_image_create_elements (GstCameraBinImage * img) -{ - GstPad *sinkpad = NULL, *img_sinkpad = NULL, *img_srcpad = NULL; - gboolean ret = FALSE; - GstBin *imgbin = NULL; - - g_return_val_if_fail (img != NULL, FALSE); - - GST_DEBUG ("creating image capture elements"); - - imgbin = GST_BIN (img); - - if (img->elements_created) { - GST_WARNING ("elements already created"); - ret = TRUE; - goto done; - } else { - img->elements_created = TRUE; - } - - /* Create image pre/post-processing element if any */ - if (img->post) { - if (!gst_camerabin_add_element (imgbin, img->post)) { - goto done; - } - img_sinkpad = gst_element_get_static_pad (img->post, "sink"); - } - - /* Create tee */ - if (!(img->tee = gst_camerabin_create_and_add_element (imgbin, "tee"))) { - goto done; - } - - /* Set up sink ghost pad for img bin */ - if (!img_sinkpad) { - img_sinkpad = gst_element_get_static_pad (img->tee, "sink"); - } - gst_ghost_pad_set_target (GST_GHOST_PAD (img->sinkpad), img_sinkpad); - - /* Add colorspace converter */ - img->pad_tee_enc = gst_element_get_request_pad (img->tee, "src%d"); - if (!gst_camerabin_create_and_add_element (imgbin, "ffmpegcolorspace")) { - goto done; - } - - /* Create image encoder */ - if (img->user_enc) { - img->enc = img->user_enc; - if (!gst_camerabin_add_element (imgbin, img->enc)) { - goto done; - } - } else if (!(img->enc = - gst_camerabin_create_and_add_element (imgbin, DEFAULT_ENC))) { - goto done; - } - - /* Create metadata element */ - if (!(img->meta_mux = - gst_camerabin_create_and_add_element (imgbin, DEFAULT_META_MUX))) { - goto done; - } - /* Add probe for XMP metadata writing */ - sinkpad = gst_element_get_static_pad (img->meta_mux, "sink"); - gst_pad_add_buffer_probe (sinkpad, G_CALLBACK (metadata_write_probe), img); - gst_object_unref (sinkpad); - /* Set "Intel" exif byte-order if possible */ - if (g_object_class_find_property (G_OBJECT_GET_CLASS (img->meta_mux), - "exif-byte-order")) { - g_object_set (G_OBJECT (img->meta_mux), "exif-byte-order", 1, NULL); - } - - /* Create file sink element */ - if (!(img->sink = - gst_camerabin_create_and_add_element (imgbin, DEFAULT_SINK))) { - goto done; - } - - /* Create queue element leading to view finder, attaches it to the tee */ - img->pad_tee_view = gst_element_get_request_pad (img->tee, "src%d"); - if (!(img->queue = gst_camerabin_create_and_add_element (imgbin, "queue"))) { - goto done; - } - - /* Set properties */ - g_object_set (G_OBJECT (img->sink), "location", img->filename->str, NULL); - g_object_set (G_OBJECT (img->sink), "async", FALSE, NULL); - - g_object_set (G_OBJECT (img->queue), "max-size-buffers", 1, "leaky", 2, NULL); - - /* Set up src ghost pad for img bin */ - img_srcpad = gst_element_get_static_pad (img->queue, "src"); - gst_ghost_pad_set_target (GST_GHOST_PAD (img->srcpad), img_srcpad); - - /* Never let image bin eos events reach view finder */ - gst_pad_add_event_probe (img->srcpad, - G_CALLBACK (gst_camerabin_drop_eos_probe), img); - - ret = TRUE; - -done: - - if (img_srcpad) { - gst_object_unref (img_srcpad); - } - if (img_sinkpad) { - gst_object_unref (img_sinkpad); - } - if (!ret) { - gst_camerabin_image_destroy_elements (img); - } - - return ret; -} - - -/** - * gst_camerabin_image_destroy_elements: - * @img: a pointer to #GstCameraBinImage object - * - * This function releases resources allocated in - * gst_camerabin_image_create_elements. - * - */ -static void -gst_camerabin_image_destroy_elements (GstCameraBinImage * img) -{ - GST_LOG ("destroying img elements"); - if (img->pad_tee_enc) { - gst_element_release_request_pad (img->tee, img->pad_tee_enc); - img->pad_tee_enc = NULL; - } - - if (img->pad_tee_view) { - gst_element_release_request_pad (img->tee, img->pad_tee_view); - img->pad_tee_view = NULL; - } - - gst_ghost_pad_set_target (GST_GHOST_PAD (img->sinkpad), NULL); - gst_ghost_pad_set_target (GST_GHOST_PAD (img->srcpad), NULL); - - gst_camerabin_remove_elements_from_bin (GST_BIN (img)); - - img->post = NULL; - img->tee = NULL; - img->enc = NULL; - img->meta_mux = NULL; - img->sink = NULL; - img->queue = NULL; - - img->elements_created = FALSE; -} - -void -gst_camerabin_image_set_encoder (GstCameraBinImage * img, GstElement * encoder) -{ - if (img->user_enc) - gst_object_unref (img->user_enc); - if (encoder) - gst_object_ref (encoder); - - img->user_enc = encoder; -} - -void -gst_camerabin_image_set_postproc (GstCameraBinImage * img, - GstElement * postproc) -{ - if (img->post) - gst_object_unref (img->post); - if (postproc) - gst_object_ref (postproc); - - img->post = postproc; -} - -GstElement * -gst_camerabin_image_get_encoder (GstCameraBinImage * img) -{ - GstElement *enc; - - if (img->user_enc) { - enc = img->user_enc; - } else { - enc = img->enc; - } - - return enc; -} - -GstElement * -gst_camerabin_image_get_postproc (GstCameraBinImage * img) -{ - return img->post; -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/camerabinimage.h --- a/gst_plugins_good/gst/camerabin/camerabinimage.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __CAMERABIN_IMAGE_H__ -#define __CAMERABIN_IMAGE_H__ - -#include - -G_BEGIN_DECLS - -#define GST_TYPE_CAMERABIN_IMAGE (gst_camerabin_image_get_type()) -#define GST_CAMERABIN_IMAGE_CAST(obj) ((GstCameraBinImage*)(obj)) -#define GST_CAMERABIN_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAMERABIN_IMAGE,GstCameraBinImage)) -#define GST_CAMERABIN_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAMERABIN_IMAGE,GstCameraBinImageClass)) -#define GST_IS_CAMERABIN_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAMERABIN_IMAGE)) -#define GST_IS_CAMERABIN_IMAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAMERABIN_IMAGE)) - -/** - * GstCameraBinImage: - * - * The opaque #GstCameraBinImage structure. - */ - -typedef struct _GstCameraBinImage GstCameraBinImage; -typedef struct _GstCameraBinImageClass GstCameraBinImageClass; - -struct _GstCameraBinImage -{ - GstBin parent; - GString *filename; - - /* Ghost pads of image bin */ - GstPad *sinkpad; - GstPad *srcpad; - - /* Tee src pad leading to image encoder */ - GstPad *pad_tee_enc; - /* Tee src pad leading to view finder */ - GstPad *pad_tee_view; - - GstElement *post; - - GstElement *tee; - GstElement *enc; - GstElement *user_enc; - GstElement *meta_mux; - GstElement *sink; - GstElement *queue; - - gboolean elements_created; -}; - -struct _GstCameraBinImageClass -{ - GstBinClass parent_class; -}; - -#ifdef __SYMBIAN32__ -IMPORT_C -#endif -GType gst_camerabin_image_get_type (void); - -void -gst_camerabin_image_set_encoder (GstCameraBinImage * img, GstElement * encoder); - -void -gst_camerabin_image_set_postproc (GstCameraBinImage * img, - GstElement * postproc); - -GstElement *gst_camerabin_image_get_encoder (GstCameraBinImage * img); - -GstElement *gst_camerabin_image_get_postproc (GstCameraBinImage * img); - -G_END_DECLS - -#endif /* #ifndef __CAMERABIN_IMAGE_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/camerabinvideo.c --- a/gst_plugins_good/gst/camerabin/camerabinvideo.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,829 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:camerabinvideo - * @short_description: video recording module of #GstCameraBin - * - * - * - * - * The pipeline for this module is: - * - * - * - *----------------------------------------------------------------------------- - * audiosrc -> audio_queue -> audioconvert -> volume -> audioenc - * > videomux -> filesink - * video_queue -> [timeoverlay] -> videoenc - * -> [post proc] -> tee < - * queue -> - *----------------------------------------------------------------------------- - * - * - * - * The properties of elements are: - * - * queue - "leaky", 2 (Leaky on downstream (old buffers)) - * - * - * - */ - -/* - * includes - */ - - -#include -#include "camerabingeneral.h" - -#include "camerabinvideo.h" - -#ifdef __SYMBIAN32__ -#include -#endif -/* - * defines and static global vars - */ - -/* internal element names */ - -#define DEFAULT_AUD_SRC "pulsesrc" -#define DEFAULT_AUD_ENC "vorbisenc" -#define DEFAULT_VID_ENC "theoraenc" -#define DEFAULT_MUX "oggmux" -#define DEFAULT_SINK "filesink" - -#define USE_AUDIO_CONVERSION 1 - -enum -{ - PROP_0, - PROP_FILENAME -}; - -static void gst_camerabin_video_dispose (GstCameraBinVideo * sink); -static void gst_camerabin_video_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_camerabin_video_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static GstClock *gst_camerabin_video_provide_clock (GstElement * elem); -static GstStateChangeReturn -gst_camerabin_video_change_state (GstElement * element, - GstStateChange transition); - -static - gboolean camerabin_video_pad_tee_src0_have_buffer (GstPad * pad, - GstBuffer * buffer, gpointer u_data); -static gboolean camerabin_video_pad_aud_src_have_buffer (GstPad * pad, - GstBuffer * buffer, gpointer u_data); -static gboolean camerabin_video_sink_have_event (GstPad * pad, GstEvent * event, - gpointer u_data); -static gboolean gst_camerabin_video_create_elements (GstCameraBinVideo * vid); -static void gst_camerabin_video_destroy_elements (GstCameraBinVideo * vid); - -GST_BOILERPLATE (GstCameraBinVideo, gst_camerabin_video, GstBin, GST_TYPE_BIN); - -static const GstElementDetails gst_camerabin_video_details = -GST_ELEMENT_DETAILS ("Video capture bin for camerabin", - "Bin/Video", - "Process and store video data", - "Edgard Lima \n" - "Nokia Corporation "); - -static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY); - -static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS_ANY); - - -/* GObject methods implementation */ - -static void -gst_camerabin_video_base_init (gpointer klass) -{ - GstElementClass *eklass = GST_ELEMENT_CLASS (klass); - - gst_element_class_add_pad_template (eklass, - gst_static_pad_template_get (&sink_template)); - gst_element_class_add_pad_template (eklass, - gst_static_pad_template_get (&src_template)); - gst_element_class_set_details (eklass, &gst_camerabin_video_details); -} - -static void -gst_camerabin_video_class_init (GstCameraBinVideoClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *eklass = GST_ELEMENT_CLASS (klass); - - gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = - (GObjectFinalizeFunc) GST_DEBUG_FUNCPTR (gst_camerabin_video_dispose); - eklass->change_state = GST_DEBUG_FUNCPTR (gst_camerabin_video_change_state); - - eklass->provide_clock = GST_DEBUG_FUNCPTR (gst_camerabin_video_provide_clock); - - gobject_class->set_property = - GST_DEBUG_FUNCPTR (gst_camerabin_video_set_property); - gobject_class->get_property = - GST_DEBUG_FUNCPTR (gst_camerabin_video_get_property); - - /** - * GstCameraBinVideo:filename: - * - * This property can be used to specify the filename of the video. - * - **/ - g_object_class_install_property (gobject_class, PROP_FILENAME, - g_param_spec_string ("filename", "Filename", - "Filename of the video to save", NULL, G_PARAM_READWRITE)); -} - -static void -gst_camerabin_video_init (GstCameraBinVideo * vid, - GstCameraBinVideoClass * g_class) -{ - vid->filename = g_string_new (""); - - vid->user_post = NULL; - vid->user_vid_enc = NULL; - vid->user_aud_enc = NULL; - vid->user_aud_src = NULL; - vid->user_mux = NULL; - - vid->aud_src = NULL; - vid->sink = NULL; - vid->tee = NULL; - vid->volume = NULL; - vid->video_queue = NULL; - - vid->tee_video_srcpad = NULL; - vid->tee_vf_srcpad = NULL; - - vid->pending_eos = NULL; - - /* Create src and sink ghost pads */ - vid->sinkpad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK); - gst_element_add_pad (GST_ELEMENT (vid), vid->sinkpad); - - vid->srcpad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC); - gst_element_add_pad (GST_ELEMENT (vid), vid->srcpad); - - /* Add probe for handling eos when stopping recording */ - gst_pad_add_event_probe (vid->sinkpad, - G_CALLBACK (camerabin_video_sink_have_event), vid); -} - -static void -gst_camerabin_video_dispose (GstCameraBinVideo * vid) -{ - GST_DEBUG_OBJECT (vid, "disposing"); - - g_string_free (vid->filename, TRUE); - vid->filename = NULL; - - if (vid->user_post) { - gst_object_unref (vid->user_post); - vid->user_post = NULL; - } - - if (vid->user_vid_enc) { - gst_object_unref (vid->user_vid_enc); - vid->user_vid_enc = NULL; - } - - if (vid->user_aud_enc) { - gst_object_unref (vid->user_aud_enc); - vid->user_aud_enc = NULL; - } - - if (vid->user_aud_src) { - gst_object_unref (vid->user_aud_src); - vid->user_aud_src = NULL; - } - - if (vid->user_mux) { - gst_object_unref (vid->user_mux); - vid->user_mux = NULL; - } - - G_OBJECT_CLASS (parent_class)->dispose ((GObject *) vid); -} - - -static void -gst_camerabin_video_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstCameraBinVideo *bin = GST_CAMERABIN_VIDEO (object); - - switch (prop_id) { - case PROP_FILENAME: - g_string_assign (bin->filename, g_value_get_string (value)); - if (bin->sink) { - g_object_set (G_OBJECT (bin->sink), "location", bin->filename->str, - NULL); - } else { - GST_INFO ("no sink, not setting name yet"); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_camerabin_video_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstCameraBinVideo *bin = GST_CAMERABIN_VIDEO (object); - - switch (prop_id) { - case PROP_FILENAME: - g_value_set_string (value, bin->filename->str); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* GstElement methods implementation */ - -static GstClock * -gst_camerabin_video_provide_clock (GstElement * elem) -{ - GstElement *aud_src = GST_CAMERABIN_VIDEO (elem)->aud_src; - if (aud_src) { - return gst_element_provide_clock (aud_src); - } else { - return NULL; - } -} - -static GstStateChangeReturn -gst_camerabin_video_change_state (GstElement * element, - GstStateChange transition) -{ - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - GstCameraBinVideo *vid = GST_CAMERABIN_VIDEO (element); - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - if (!gst_camerabin_video_create_elements (vid)) { - return GST_STATE_CHANGE_FAILURE; - } - /* Don't change sink to READY yet to allow changing the - filename in READY state. */ - gst_element_set_locked_state (vid->sink, TRUE); - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - vid->calculate_adjust_ts_video = TRUE; - vid->calculate_adjust_ts_aud = TRUE; - g_object_set (G_OBJECT (vid->sink), "async", FALSE, NULL); - gst_element_set_locked_state (vid->sink, FALSE); - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - vid->calculate_adjust_ts_video = TRUE; - vid->calculate_adjust_ts_aud = TRUE; - break; - - case GST_STATE_CHANGE_PAUSED_TO_READY: - /* Set sink to NULL in order to write the file _now_ */ - GST_INFO ("write vid file: %s", vid->filename->str); - gst_element_set_locked_state (vid->sink, TRUE); - gst_element_set_state (vid->sink, GST_STATE_NULL); - break; - default: - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - if (vid->pending_eos) { - /* Video bin is still paused, so push eos directly to video queue */ - GST_DEBUG_OBJECT (vid, "pushing pending eos"); - gst_pad_push_event (vid->tee_video_srcpad, vid->pending_eos); - vid->pending_eos = NULL; - } - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - /* Reset counters related to timestamp rewriting */ - vid->adjust_ts_video = 0; - vid->last_ts_video = 0; - vid->adjust_ts_aud = 0; - vid->last_ts_aud = 0; - - if (vid->pending_eos) { - gst_event_unref (vid->pending_eos); - vid->pending_eos = NULL; - } - break; - case GST_STATE_CHANGE_READY_TO_NULL: - gst_camerabin_video_destroy_elements (vid); - break; - default: - break; - } - - return ret; -} - -/* - * static helper functions implementation - */ - -/** - * camerabin_video_pad_tee_src0_have_buffer: - * @pad: tee src pad leading to video encoding - * @event: received buffer - * @u_data: video bin object - * - * Buffer probe for rewriting video buffer timestamps. - * - * Returns: TRUE always - */ -static gboolean -camerabin_video_pad_tee_src0_have_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data) -{ - GstCameraBinVideo *vid = (GstCameraBinVideo *) u_data; - - GST_LOG ("buffer in with size %d ts %" GST_TIME_FORMAT, - GST_BUFFER_SIZE (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); - - if (G_UNLIKELY (vid->calculate_adjust_ts_video)) { - GstEvent *event; - GstObject *tee; - GstPad *sinkpad; - vid->adjust_ts_video = GST_BUFFER_TIMESTAMP (buffer) - vid->last_ts_video; - vid->calculate_adjust_ts_video = FALSE; - event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, - 0, GST_CLOCK_TIME_NONE, vid->last_ts_video); - /* Send the newsegment to both view finder and video bin */ - tee = gst_pad_get_parent (pad); - sinkpad = gst_element_get_static_pad (GST_ELEMENT (tee), "sink"); - gst_pad_send_event (sinkpad, event); - gst_object_unref (tee); - gst_object_unref (sinkpad); - GST_LOG_OBJECT (vid, "vid ts adjustment: %" GST_TIME_FORMAT, - GST_TIME_ARGS (vid->adjust_ts_video)); - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); - } - GST_BUFFER_TIMESTAMP (buffer) -= vid->adjust_ts_video; - vid->last_ts_video = GST_BUFFER_TIMESTAMP (buffer); - if (GST_BUFFER_DURATION_IS_VALID (buffer)) - vid->last_ts_video += GST_BUFFER_DURATION (buffer); - - - GST_LOG ("buffer out with size %d ts %" GST_TIME_FORMAT, - GST_BUFFER_SIZE (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); - return TRUE; -} - -/** - * camerabin_video_pad_aud_src_have_buffer: - * @pad: audio source src pad - * @event: received buffer - * @u_data: video bin object - * - * Buffer probe for rewriting audio buffer timestamps. - * - * Returns: TRUE always - */ -static gboolean -camerabin_video_pad_aud_src_have_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data) -{ - GstCameraBinVideo *vid = (GstCameraBinVideo *) u_data; - - if (vid->calculate_adjust_ts_aud) { - GstEvent *event; - GstPad *peerpad = NULL; - vid->adjust_ts_aud = GST_BUFFER_TIMESTAMP (buffer) - vid->last_ts_aud; - vid->calculate_adjust_ts_aud = FALSE; - event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, - 0, GST_CLOCK_TIME_NONE, vid->last_ts_aud); - peerpad = gst_pad_get_peer (pad); - if (peerpad) { - gst_pad_send_event (peerpad, event); - gst_object_unref (peerpad); - } - GST_LOG_OBJECT (vid, "aud ts adjustment: %" GST_TIME_FORMAT, - GST_TIME_ARGS (vid->adjust_ts_aud)); - GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); - } - GST_BUFFER_TIMESTAMP (buffer) -= vid->adjust_ts_aud; - vid->last_ts_aud = GST_BUFFER_TIMESTAMP (buffer); - if (GST_BUFFER_DURATION_IS_VALID (buffer)) - vid->last_ts_aud += GST_BUFFER_DURATION (buffer); - GST_LOG ("buffer out with size %d ts %" GST_TIME_FORMAT, - GST_BUFFER_SIZE (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); - return TRUE; -} - -/** - * camerabin_video_sink_have_event: - * @pad: video bin sink pad - * @event: received event - * @u_data: video bin object - * - * Event probe for video bin eos handling. - * Copies the eos event to audio branch of video bin. - * - * Returns: FALSE to drop the event, TRUE otherwise - */ -static gboolean -camerabin_video_sink_have_event (GstPad * pad, GstEvent * event, - gpointer u_data) -{ - GstCameraBinVideo *vid = (GstCameraBinVideo *) u_data; - gboolean ret = TRUE; - - GST_DEBUG_OBJECT (vid, "got videobin sink event: %s", - GST_EVENT_TYPE_NAME (event)); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - if (vid->aud_src) { - GST_DEBUG_OBJECT (vid, "copying %s to audio branch", - GST_EVENT_TYPE_NAME (event)); - gst_element_send_event (vid->aud_src, gst_event_copy (event)); - } - - /* If we're paused, we can't pass eos to video now to avoid blocking. - Instead send eos when changing to playing next time. */ - if (GST_STATE (GST_ELEMENT (vid)) == GST_STATE_PAUSED) { - GST_DEBUG_OBJECT (vid, "paused, delay eos sending"); - vid->pending_eos = gst_event_ref (event); - ret = FALSE; /* Drop the event */ - } - break; - default: - break; - } - return ret; -} - -/** - * gst_camerabin_video_create_elements: - * @vid: a pointer to #GstCameraBinVideo - * - * This function creates the needed #GstElements and resources to record videos. - * Use gst_camerabin_video_destroy_elements() to free these resources. - * - * Returns: %TRUE if succeeded or FALSE if failed - */ -static gboolean -gst_camerabin_video_create_elements (GstCameraBinVideo * vid) -{ - GstPad *pad = NULL, *vid_sinkpad = NULL, *vid_srcpad = NULL; - GstBin *vidbin = GST_BIN (vid); - GstElement *queue = NULL; - - vid->adjust_ts_video = 0; - vid->last_ts_video = 0; - vid->calculate_adjust_ts_video = FALSE; - - vid->adjust_ts_aud = 0; - vid->last_ts_aud = 0; - vid->calculate_adjust_ts_aud = FALSE; - - /* Add video post processing element if any */ - if (vid->user_post) { - if (!gst_camerabin_add_element (vidbin, vid->user_post)) { - goto error; - } - vid_sinkpad = gst_element_get_static_pad (vid->user_post, "sink"); - } - - /* Add tee element */ - if (!(vid->tee = gst_camerabin_create_and_add_element (vidbin, "tee"))) { - goto error; - } - - /* Set up sink ghost pad for video bin */ - if (!vid_sinkpad) { - vid_sinkpad = gst_element_get_static_pad (vid->tee, "sink"); - } - gst_ghost_pad_set_target (GST_GHOST_PAD (vid->sinkpad), vid_sinkpad); - - - /* Add queue element for video */ - vid->tee_video_srcpad = gst_element_get_request_pad (vid->tee, "src%d"); - if (!(vid->video_queue = - gst_camerabin_create_and_add_element (vidbin, "queue"))) { - goto error; - } - - /* Add probe for rewriting video timestamps */ - gst_pad_add_buffer_probe (vid->tee_video_srcpad, - G_CALLBACK (camerabin_video_pad_tee_src0_have_buffer), vid); - - -#ifdef USE_TIMEOVERLAY - /* Add timeoverlay element to visualize elapsed time for debugging */ - if (!(gst_camerabin_create_and_add_element (vidbin, "timeoverlay"))) { - goto error; - } -#endif - - /* Add user set or default video encoder element */ - if (vid->user_vid_enc) { - vid->vid_enc = vid->user_vid_enc; - if (!gst_camerabin_add_element (vidbin, vid->vid_enc)) { - goto error; - } - } else if (!(vid->vid_enc = - gst_camerabin_create_and_add_element (vidbin, DEFAULT_VID_ENC))) { - goto error; - } - - /* Add user set or default muxer element */ - if (vid->user_mux) { - vid->muxer = vid->user_mux; - if (!gst_camerabin_add_element (vidbin, vid->muxer)) { - goto error; - } - } else if (!(vid->muxer = - gst_camerabin_create_and_add_element (vidbin, DEFAULT_MUX))) { - goto error; - } - - /* Add sink element for storing the video */ - if (!(vid->sink = - gst_camerabin_create_and_add_element (vidbin, DEFAULT_SINK))) { - goto error; - } - g_object_set (G_OBJECT (vid->sink), "location", vid->filename->str, NULL); - - - /* Add user set or default audio source element */ - if (vid->user_aud_src) { - vid->aud_src = vid->user_aud_src; - if (!gst_camerabin_add_element (vidbin, vid->aud_src)) { - goto error; - } - } else if (!(vid->aud_src = - gst_camerabin_create_and_add_element (vidbin, DEFAULT_AUD_SRC))) { - goto error; - } - - /* Add queue element for audio */ - if (!(queue = gst_camerabin_create_and_add_element (vidbin, "queue"))) { - goto error; - } - queue = NULL; - - /* Add optional audio conversion and volume elements and - raise no errors if adding them fails */ -#ifdef USE_AUDIO_CONVERSION - if (!gst_camerabin_try_add_element (vidbin, - gst_element_factory_make ("audioconvert", NULL))) { - GST_WARNING_OBJECT (vid, "unable to add audio conversion element"); - /* gst_camerabin_try_add_element() destroyed the element */ - } -#endif - vid->volume = gst_element_factory_make ("volume", NULL); - if (!gst_camerabin_try_add_element (vidbin, vid->volume)) { - GST_WARNING_OBJECT (vid, "unable to add volume element"); - /* gst_camerabin_try_add_element() destroyed the element */ - vid->volume = NULL; - } - - /* Add user set or default audio encoder element */ - if (vid->user_aud_enc) { - vid->aud_enc = vid->user_aud_enc; - if (!gst_camerabin_add_element (vidbin, vid->aud_enc)) { - goto error; - } - } else if (!(vid->aud_enc = - gst_camerabin_create_and_add_element (vidbin, DEFAULT_AUD_ENC))) { - goto error; - } - - /* Link audio part to the muxer */ - if (!gst_element_link (vid->aud_enc, vid->muxer)) { - GST_ELEMENT_ERROR (vid, CORE, NEGOTIATION, (NULL), - ("linking audio encoder and muxer failed")); - goto error; - } - - /* Add queue leading out of the video bin and to view finder */ - vid->tee_vf_srcpad = gst_element_get_request_pad (vid->tee, "src%d"); - if (!(queue = gst_camerabin_create_and_add_element (vidbin, "queue"))) { - goto error; - } - /* Set queue leaky, we don't want to block video encoder feed, but - prefer leaking view finder buffers instead. */ - g_object_set (G_OBJECT (queue), "leaky", 2, NULL); - - /* Set up src ghost pad for video bin */ - vid_srcpad = gst_element_get_static_pad (queue, "src"); - gst_ghost_pad_set_target (GST_GHOST_PAD (vid->srcpad), vid_srcpad); - /* Never let video bin eos events reach view finder */ - gst_pad_add_event_probe (vid_srcpad, - G_CALLBACK (gst_camerabin_drop_eos_probe), vid); - - pad = gst_element_get_static_pad (vid->aud_src, "src"); - gst_pad_add_buffer_probe (pad, - G_CALLBACK (camerabin_video_pad_aud_src_have_buffer), vid); - gst_object_unref (pad); - - GST_DEBUG ("created video elements"); - - return TRUE; - -error: - - gst_camerabin_video_destroy_elements (vid); - - return FALSE; - -} - -/** - * gst_camerabin_video_destroy_elements: - * @vid: a pointer to #GstCameraBinVideo - * - * This function destroys all the elements created by - * gst_camerabin_video_create_elements(). - * - */ -static void -gst_camerabin_video_destroy_elements (GstCameraBinVideo * vid) -{ - GST_DEBUG ("destroying video elements"); - - /* Release tee request pads */ - if (vid->tee_video_srcpad) { - gst_element_release_request_pad (vid->tee, vid->tee_video_srcpad); - vid->tee_video_srcpad = NULL; - } - if (vid->tee_vf_srcpad) { - gst_element_release_request_pad (vid->tee, vid->tee_vf_srcpad); - vid->tee_vf_srcpad = NULL; - } - - gst_ghost_pad_set_target (GST_GHOST_PAD (vid->sinkpad), NULL); - gst_ghost_pad_set_target (GST_GHOST_PAD (vid->srcpad), NULL); - - gst_camerabin_remove_elements_from_bin (GST_BIN (vid)); - - vid->aud_src = NULL; - vid->sink = NULL; - vid->tee = NULL; - vid->volume = NULL; - vid->video_queue = NULL; - vid->vid_enc = NULL; - vid->aud_enc = NULL; - vid->muxer = NULL; - - if (vid->pending_eos) { - gst_event_unref (vid->pending_eos); - vid->pending_eos = NULL; - } - - return; -} - -/* - * Set & get mute and video capture elements - */ - -void -gst_camerabin_video_set_mute (GstCameraBinVideo * vid, gboolean mute) -{ - if (vid && vid->volume) { - GST_DEBUG_OBJECT (vid, "setting mute %s", mute ? "on" : "off"); - g_object_set (vid->volume, "mute", mute, NULL); - } -} - -void -gst_camerabin_video_set_post (GstCameraBinVideo * vid, GstElement * post) -{ - GstElement **user_post; - GST_DEBUG_OBJECT (vid, "setting video post processing: %" GST_PTR_FORMAT, - post); - GST_OBJECT_LOCK (vid); - user_post = &vid->user_post; - gst_object_replace ((GstObject **) user_post, GST_OBJECT (post)); - GST_OBJECT_UNLOCK (vid); -} - -void -gst_camerabin_video_set_video_enc (GstCameraBinVideo * vid, - GstElement * video_enc) -{ - GstElement **user_vid_enc; - GST_DEBUG_OBJECT (vid, "setting video encoder: %" GST_PTR_FORMAT, video_enc); - GST_OBJECT_LOCK (vid); - user_vid_enc = &vid->user_vid_enc; - gst_object_replace ((GstObject **) user_vid_enc, GST_OBJECT (video_enc)); - GST_OBJECT_UNLOCK (vid); -} - -void -gst_camerabin_video_set_audio_enc (GstCameraBinVideo * vid, - GstElement * audio_enc) -{ - GstElement **user_aud_enc; - GST_DEBUG_OBJECT (vid, "setting audio encoder: %" GST_PTR_FORMAT, audio_enc); - GST_OBJECT_LOCK (vid); - user_aud_enc = &vid->user_aud_enc; - gst_object_replace ((GstObject **) user_aud_enc, GST_OBJECT (audio_enc)); - GST_OBJECT_UNLOCK (vid); -} - -void -gst_camerabin_video_set_muxer (GstCameraBinVideo * vid, GstElement * muxer) -{ - GstElement **user_mux; - GST_DEBUG_OBJECT (vid, "setting muxer: %" GST_PTR_FORMAT, muxer); - GST_OBJECT_LOCK (vid); - user_mux = &vid->user_mux; - gst_object_replace ((GstObject **) user_mux, GST_OBJECT (muxer)); - GST_OBJECT_UNLOCK (vid); -} - -void -gst_camerabin_video_set_audio_src (GstCameraBinVideo * vid, - GstElement * audio_src) -{ - GstElement **user_aud_src; - GST_DEBUG_OBJECT (vid, "setting audio source: %" GST_PTR_FORMAT, audio_src); - GST_OBJECT_LOCK (vid); - user_aud_src = &vid->user_aud_src; - gst_object_replace ((GstObject **) user_aud_src, GST_OBJECT (audio_src)); - GST_OBJECT_UNLOCK (vid); -} - -gboolean -gst_camerabin_video_get_mute (GstCameraBinVideo * vid) -{ - gboolean mute = ARG_DEFAULT_MUTE; - - if (vid && vid->volume) { - g_object_get (vid->volume, "mute", &mute, NULL); - } - return mute; -} - -GstElement * -gst_camerabin_video_get_post (GstCameraBinVideo * vid) -{ - return vid->user_post; -} - -GstElement * -gst_camerabin_video_get_video_enc (GstCameraBinVideo * vid) -{ - return vid->vid_enc ? vid->vid_enc : vid->user_vid_enc; -} - -GstElement * -gst_camerabin_video_get_audio_enc (GstCameraBinVideo * vid) -{ - return vid->aud_enc ? vid->aud_enc : vid->user_aud_enc; -} - -GstElement * -gst_camerabin_video_get_muxer (GstCameraBinVideo * vid) -{ - return vid->muxer ? vid->muxer : vid->user_mux; -} - -GstElement * -gst_camerabin_video_get_audio_src (GstCameraBinVideo * vid) -{ - return vid->aud_src ? vid->aud_src : vid->user_aud_src; -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/camerabinvideo.h --- a/gst_plugins_good/gst/camerabin/camerabinvideo.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __CAMERABIN_VIDEO_H__ -#define __CAMERABIN_VIDEO_H__ - -#include - -G_BEGIN_DECLS - -//#define USE_TIMEOVERLAY 1 - -#define ARG_DEFAULT_MUTE FALSE - -#define GST_TYPE_CAMERABIN_VIDEO (gst_camerabin_video_get_type()) -#define GST_CAMERABIN_VIDEO_CAST(obj) ((GstCameraBinVideo*)(obj)) -#define GST_CAMERABIN_VIDEO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAMERABIN_VIDEO,GstCameraBinVideo)) -#define GST_CAMERABIN_VIDEO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAMERABIN_VIDEO,GstCameraBinVideoClass)) -#define GST_IS_CAMERABIN_VIDEO(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAMERABIN_VIDEO)) -#define GST_IS_CAMERABIN_VIDEO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAMERABIN_VIDEO)) - -/** - * GstCameraBinVideo: - * - * The opaque #GstCameraBinVideo structure. - */ - -typedef struct _GstCameraBinVideo GstCameraBinVideo; -typedef struct _GstCameraBinVideoClass GstCameraBinVideoClass; - -struct _GstCameraBinVideo -{ - GstBin parent; - - GString *filename; - - /* A/V timestamp rewriting */ - guint64 adjust_ts_video; - guint64 last_ts_video; - gboolean calculate_adjust_ts_video; - - guint64 adjust_ts_aud; - guint64 last_ts_aud; - gboolean calculate_adjust_ts_aud; - - /* Sink and src pads of video bin */ - GstPad *sinkpad; - GstPad *srcpad; - - /* Tee src pads leading to video encoder and view finder */ - GstPad *tee_video_srcpad; - GstPad *tee_vf_srcpad; - - /* User set elements */ - GstElement *user_post; /* Video post processing */ - GstElement *user_vid_enc; - GstElement *user_aud_enc; - GstElement *user_aud_src; - GstElement *user_mux; - - /* Other elements */ - GstElement *aud_src; /* Audio source */ - GstElement *sink; /* Sink for recorded video */ - GstElement *tee; /* Split output to view finder and recording sink */ - GstElement *volume; /* Volume for muting */ - GstElement *video_queue; /* Buffer for raw video frames */ - GstElement *vid_enc; /* Video encoder */ - GstElement *aud_enc; /* Audio encoder */ - GstElement *muxer; /* Muxer */ - - GstEvent *pending_eos; -}; - -struct _GstCameraBinVideoClass -{ - GstBinClass parent_class; -}; - -#ifdef __SYMBIAN32__ -IMPORT_C -#endif -GType gst_camerabin_video_get_type (void); - -/* - * external function prototypes - */ - -void gst_camerabin_video_set_mute (GstCameraBinVideo * vid, gboolean mute); - -void gst_camerabin_video_set_post (GstCameraBinVideo * vid, GstElement * post); - -void -gst_camerabin_video_set_video_enc (GstCameraBinVideo * vid, - GstElement * video_enc); - -void -gst_camerabin_video_set_audio_enc (GstCameraBinVideo * vid, - GstElement * audio_enc); - -void -gst_camerabin_video_set_muxer (GstCameraBinVideo * vid, GstElement * muxer); - -void -gst_camerabin_video_set_audio_src (GstCameraBinVideo * vid, - GstElement * audio_src); - - -gboolean gst_camerabin_video_get_mute (GstCameraBinVideo * vid); - -GstElement *gst_camerabin_video_get_post (GstCameraBinVideo * vid); - -GstElement *gst_camerabin_video_get_video_enc (GstCameraBinVideo * vid); - -GstElement *gst_camerabin_video_get_audio_enc (GstCameraBinVideo * vid); - -GstElement *gst_camerabin_video_get_muxer (GstCameraBinVideo * vid); - -GstElement *gst_camerabin_video_get_audio_src (GstCameraBinVideo * vid); - -G_END_DECLS - -#endif /* #ifndef __CAMERABIN_VIDEO_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabin-marshal.c --- a/gst_plugins_good/gst/camerabin/gstcamerabin-marshal.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ - -#include - - -#ifdef G_ENABLE_DEBUG -#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) -#define g_marshal_value_peek_char(v) g_value_get_char (v) -#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) -#define g_marshal_value_peek_int(v) g_value_get_int (v) -#define g_marshal_value_peek_uint(v) g_value_get_uint (v) -#define g_marshal_value_peek_long(v) g_value_get_long (v) -#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) -#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) -#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) -#define g_marshal_value_peek_enum(v) g_value_get_enum (v) -#define g_marshal_value_peek_flags(v) g_value_get_flags (v) -#define g_marshal_value_peek_float(v) g_value_get_float (v) -#define g_marshal_value_peek_double(v) g_value_get_double (v) -#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) -#define g_marshal_value_peek_param(v) g_value_get_param (v) -#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) -#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) -#define g_marshal_value_peek_object(v) g_value_get_object (v) -#else /* !G_ENABLE_DEBUG */ -/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. - * Do not access GValues directly in your code. Instead, use the - * g_value_get_*() functions - */ -#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int -#define g_marshal_value_peek_char(v) (v)->data[0].v_int -#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint -#define g_marshal_value_peek_int(v) (v)->data[0].v_int -#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint -#define g_marshal_value_peek_long(v) (v)->data[0].v_long -#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong -#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 -#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 -#define g_marshal_value_peek_enum(v) (v)->data[0].v_long -#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong -#define g_marshal_value_peek_float(v) (v)->data[0].v_float -#define g_marshal_value_peek_double(v) (v)->data[0].v_double -#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer -#endif /* !G_ENABLE_DEBUG */ - - -/* VOID:INT,INT,INT,INT (gstcamerabin-marshal.list:4) */ -void -gst_camerabin_marshal_VOID__INT_INT_INT_INT (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef void (*GMarshalFunc_VOID__INT_INT_INT_INT) (gpointer data1, - gint arg_1, - gint arg_2, - gint arg_3, - gint arg_4, - gpointer data2); - register GMarshalFunc_VOID__INT_INT_INT_INT callback; - register GCClosure *cc = (GCClosure*) closure; - register gpointer data1, data2; - - g_return_if_fail (n_param_values == 5); - - 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_VOID__INT_INT_INT_INT) (marshal_data ? marshal_data : cc->callback); - - callback (data1, - g_marshal_value_peek_int (param_values + 1), - g_marshal_value_peek_int (param_values + 2), - g_marshal_value_peek_int (param_values + 3), - g_marshal_value_peek_int (param_values + 4), - data2); -} - -/* VOID:INT,INT (gstcamerabin-marshal.list:5) */ -void -gst_camerabin_marshal_VOID__INT_INT (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef void (*GMarshalFunc_VOID__INT_INT) (gpointer data1, - gint arg_1, - gint arg_2, - gpointer data2); - register GMarshalFunc_VOID__INT_INT callback; - register GCClosure *cc = (GCClosure*) closure; - register gpointer data1, data2; - - g_return_if_fail (n_param_values == 3); - - 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_VOID__INT_INT) (marshal_data ? marshal_data : cc->callback); - - callback (data1, - g_marshal_value_peek_int (param_values + 1), - g_marshal_value_peek_int (param_values + 2), - data2); -} - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabin-marshal.h --- a/gst_plugins_good/gst/camerabin/gstcamerabin-marshal.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ - -#ifndef __gst_camerabin_MARSHAL_H__ -#define __gst_camerabin_MARSHAL_H__ - -#include - -G_BEGIN_DECLS - -/* VOID:INT,INT,INT,INT (gstcamerabin-marshal.list:4) */ -extern void gst_camerabin_marshal_VOID__INT_INT_INT_INT (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -/* VOID:INT,INT (gstcamerabin-marshal.list:5) */ -extern void gst_camerabin_marshal_VOID__INT_INT (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -G_END_DECLS - -#endif /* __gst_camerabin_MARSHAL_H__ */ - diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabin.c --- a/gst_plugins_good/gst/camerabin/gstcamerabin.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2769 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:gstcamerabin - * @short_description: camera capture bin - * - * - * - * GstCameraBin is a high-level camera object that encapsulates the gstreamer - * internals and provides a task based API for the application. It consists of - * three main data paths: view-finder, image capture and video capture. - * - * - * - * - * CameraBin structure - * Structural decomposition of CameraBin object. - * - * - * - * - * Example launch line - * - * - * gst-launch -v -m camerabin filename=test.jpeg - * - * - * - * - * Image capture - * - * Taking still images is initiated with the #GstCameraBin::user-start action - * signal. Once the image has captured, #GstCameraBin::img-done signal is fired. - * It allows to decide wheter to take another picture (burst capture, bracketing - * shot) or stop capturing. The last captured image is shown - * until one switches back to view finder using #GstCameraBin::user-stop action - * signal. - * - * - * Available resolutions can be taken from the #GstCameraBin:inputcaps property. - * Image capture resolution can be set with #GstCameraBin::user-image-res - * action signal. - * - * - * - * Video capture - * - * Video capture is started with the #GstCameraBin::user-start action signal too. - * In addition to image capture one can use #GstCameraBin::user-pause to - * pause recording and #GstCameraBin::user-stop to end recording. - * - * - * Available resolutions and fps can be taken from the #GstCameraBin:inputcaps - * property. #GstCameraBin::user-res-fps action signal can be used to set frame - * rate and resolution for the video recording and view finder as well. - * - * - * - * Photography interface - * - * GstCameraBin implements gst photography interface, which can be used to set - * and get different settings related to digital imaging. Since currently many - * of these settings require low-level support the photography interface support - * is dependent on video src element. In practice photography interface settings - * cannot be used successfully until in PAUSED state when the video src has - * opened the video device. - * - * - * - * States - * - * Elements within GstCameraBin are created and destroyed when switching - * between NULL and READY states. Therefore element properties should be set - * in NULL state. User set elements are not unreffed until GstCameraBin is - * unreffed or replaced by a new user set element. Initially only elements needed - * for view finder mode are created to speed up startup. Image bin and video bin - * elements are created when setting the mode or starting capture. - * - * - * - * - * - * Since the muxers tested so far have problems with discontinous buffers, QoS - * has been disabled, and then in order to record video, you MUST ensure that - * there is enough CPU to encode the video. Thus choose smart resolution and - * frames per second values. It is also highly recommended to avoid color - * conversions; make sure all the elements involved work with the same colorspace - * (i.e. rgb or yuv i420 or whatelse). - * - * - * - */ - -/* - * The pipeline in the camerabin is - * - * "image bin" - * videosrc ! crop ! scale ! out-sel <------> in-sel ! scale ! ffmpegcsp ! vfsink - * "video bin" - * - * it is possible to have 'ffmpegcolorspace' and 'capsfilter' just after - * v4l2camsrc - * - * The properties of elements are: - * - * vfsink - "sync", FALSE, "qos", FALSE - * output-selector - "resend-latest", FALSE - * input-selector - "select-all", TRUE - */ - -/* - * includes - */ - - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include -#include - -#include -/* FIXME: include #include and use _(" ") */ - -#ifndef __SYMBIAN32__ -#include -#else -#include -#endif - -#ifdef __SYMBIAN32__ -#include -#endif - - - - -#include "gstcamerabin.h" -#include "gstcamerabinxoverlay.h" -#include "gstcamerabincolorbalance.h" -#include "gstcamerabinphotography.h" - -#include "camerabingeneral.h" - -#include "gstcamerabin-marshal.h" - -#ifdef __SYMBIAN32__ -#include -#endif -/* - * enum and types - */ - -enum -{ - /* action signals */ - USER_START_SIGNAL, - USER_STOP_SIGNAL, - USER_PAUSE_SIGNAL, - USER_RES_FPS_SIGNAL, - USER_IMAGE_RES_SIGNAL, - /* emit signals */ - IMG_DONE_SIGNAL, - LAST_SIGNAL -}; - -enum -{ - ARG_0, - ARG_FILENAME, - ARG_MODE, - ARG_MUTE, - ARG_ZOOM, - ARG_IMAGE_POST, - ARG_IMAGE_ENC, - ARG_VIDEO_POST, - ARG_VIDEO_ENC, - ARG_AUDIO_ENC, - ARG_VIDEO_MUX, - ARG_VF_SINK, - ARG_VIDEO_SRC, - ARG_AUDIO_SRC, - ARG_INPUT_CAPS, - ARG_FILTER_CAPS -}; - -/* - * defines and static global vars - */ - -static guint camerabin_signals[LAST_SIGNAL]; - -#define GST_TYPE_CAMERABIN_MODE (gst_camerabin_mode_get_type ()) - -/* default and range values for args */ - -#define DEFAULT_MODE MODE_IMAGE -#define DEFAULT_ZOOM 100 -#define DEFAULT_WIDTH 640 -#define DEFAULT_HEIGHT 480 -#define DEFAULT_CAPTURE_WIDTH 800 -#define DEFAULT_CAPTURE_HEIGHT 600 -#define DEFAULT_FPS_N 0 /* makes it use the default */ -#define DEFAULT_FPS_D 1 -#define CAMERABIN_DEFAULT_VF_CAPS "video/x-raw-yuv,format=(fourcc)I420" -/* Using "bilinear" as default zoom method */ -#define CAMERABIN_DEFAULT_ZOOM_METHOD 1 - -#define MIN_ZOOM 100 -#define MAX_ZOOM 1000 -#define ZOOM_1X MIN_ZOOM - -#define DEFAULT_V4L2CAMSRC_DRIVER_NAME "omap3cam" - -/* internal element names */ - -#define USE_COLOR_CONVERTER 1 - -/* FIXME: Make sure this can work with autovideosrc and use that. */ -#define DEFAULT_SRC_VID_SRC "v4l2src" - -#define DEFAULT_VIEW_SINK "autovideosink" - -/* - * static helper functions declaration - */ - -static void camerabin_setup_src_elements (GstCameraBin * camera); - -static gboolean camerabin_create_src_elements (GstCameraBin * camera); - -static void camerabin_setup_view_elements (GstCameraBin * camera); - -static gboolean camerabin_create_view_elements (GstCameraBin * camera); - -static gboolean camerabin_create_elements (GstCameraBin * camera); - -static void camerabin_destroy_elements (GstCameraBin * camera); - -static void camerabin_dispose_elements (GstCameraBin * camera); - -static void gst_camerabin_change_mode (GstCameraBin * camera, gint mode); - -static void -gst_camerabin_change_filename (GstCameraBin * camera, const gchar * name); - -static void gst_camerabin_setup_zoom (GstCameraBin * camera); - -static GstCaps *gst_camerabin_get_allowed_input_caps (GstCameraBin * camera); - -static void gst_camerabin_rewrite_tags (GstCameraBin * camera); - -static void -gst_camerabin_set_capsfilter_caps (GstCameraBin * camera, GstCaps * new_caps); - -static void gst_camerabin_start_image_capture (GstCameraBin * camera); - -static void gst_camerabin_start_video_recording (GstCameraBin * camera); - -static gboolean -gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data); -static gboolean -gst_camerabin_have_vid_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data); - -static void gst_camerabin_reset_to_view_finder (GstCameraBin * camera); - -static void gst_camerabin_do_stop (GstCameraBin * camera); - -static void -gst_camerabin_set_allowed_framerate (GstCameraBin * camera, - GstCaps * filter_caps); - -/* - * GObject callback functions declaration - */ - -static void gst_camerabin_base_init (gpointer gclass); - -static void gst_camerabin_class_init (GstCameraBinClass * klass); - -static void -gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass); - -static void gst_camerabin_dispose (GObject * object); - -static void gst_camerabin_finalize (GObject * object); - -static void gst_camerabin_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); - -static void gst_camerabin_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static const GValue *gst_camerabin_find_better_framerate (GstCameraBin * camera, - GstStructure * st, const GValue * orig_framerate); -/* - * GstElement function declarations - */ - -static GstStateChangeReturn -gst_camerabin_change_state (GstElement * element, GstStateChange transition); - - -/* - * GstBin function declarations - */ -static void -gst_camerabin_handle_message_func (GstBin * bin, GstMessage * message); - - -/* - * Action signal function declarations - */ - -static void gst_camerabin_user_start (GstCameraBin * camera); - -static void gst_camerabin_user_stop (GstCameraBin * camera); - -static void gst_camerabin_user_pause (GstCameraBin * camera); - -static void -gst_camerabin_user_res_fps (GstCameraBin * camera, gint width, gint height, - gint fps_n, gint fps_d); - -static void -gst_camerabin_user_image_res (GstCameraBin * camera, gint width, gint height); - - -/* - * GST BOILERPLATE and GObject types - */ - -static GType -gst_camerabin_mode_get_type (void) -{ - static GType gtype = 0; - - if (gtype == 0) { - static const GEnumValue values[] = { - {MODE_IMAGE, "Still image capture (default)", "mode-image"}, - {MODE_VIDEO, "Video recording", "mode-video"}, - {0, NULL, NULL} - }; - - gtype = g_enum_register_static ("GstCameraBinMode", values); - } - return gtype; -} - -static gboolean -gst_camerabin_iface_supported (GstImplementsInterface * iface, GType iface_type) -{ - GstCameraBin *camera = GST_CAMERABIN (iface); - - if (iface_type == GST_TYPE_X_OVERLAY) { - if (camera->view_sink) { - return GST_IS_X_OVERLAY (camera->view_sink); - } - } else if (iface_type == GST_TYPE_COLOR_BALANCE) { - if (camera->src_vid_src) { - return GST_IS_COLOR_BALANCE (camera->src_vid_src); - } - } else if (iface_type == GST_TYPE_TAG_SETTER) { - /* Note: Tag setter elements aren't - present when image and video bin in NULL */ - GstElement *setter; - setter = gst_bin_get_by_interface (GST_BIN (camera), iface_type); - if (setter) { - gst_object_unref (setter); - return TRUE; - } else { - return FALSE; - } - } else if (iface_type == GST_TYPE_PHOTOGRAPHY) { - if (camera->src_vid_src) { - return GST_IS_PHOTOGRAPHY (camera->src_vid_src); - } - } - - return FALSE; -} - -static void -gst_camerabin_interface_init (GstImplementsInterfaceClass * klass) -{ - /* - * default virtual functions - */ - klass->supported = gst_camerabin_iface_supported; -} - -static void -camerabin_init_interfaces (GType type) -{ - - static const GInterfaceInfo camerabin_info = { - (GInterfaceInitFunc) gst_camerabin_interface_init, - NULL, - NULL, - }; - - static const GInterfaceInfo camerabin_xoverlay_info = { - (GInterfaceInitFunc) gst_camerabin_xoverlay_init, - NULL, - NULL, - }; - - static const GInterfaceInfo camerabin_color_balance_info = { - (GInterfaceInitFunc) gst_camerabin_color_balance_init, - NULL, - NULL, - }; - - static const GInterfaceInfo camerabin_tagsetter_info = { - NULL, - NULL, - NULL, - }; - static const GInterfaceInfo camerabin_photography_info = { - (GInterfaceInitFunc) gst_camerabin_photography_init, - NULL, - NULL, - }; - - g_type_add_interface_static (type, - GST_TYPE_IMPLEMENTS_INTERFACE, &camerabin_info); - - g_type_add_interface_static (type, GST_TYPE_X_OVERLAY, - &camerabin_xoverlay_info); - - g_type_add_interface_static (type, GST_TYPE_COLOR_BALANCE, - &camerabin_color_balance_info); - - g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, - &camerabin_tagsetter_info); - - g_type_add_interface_static (type, GST_TYPE_PHOTOGRAPHY, - &camerabin_photography_info); -} - -GST_BOILERPLATE_FULL (GstCameraBin, gst_camerabin, GstPipeline, - GST_TYPE_PIPELINE, camerabin_init_interfaces); - -/* - * static helper functions implementation - */ - -/* - * camerabin_setup_src_elements: - * @camera: camerabin object - * - * This function updates camerabin capsfilters according - * to fps, resolution and zoom that have been configured - * to camerabin. - */ -static void -camerabin_setup_src_elements (GstCameraBin * camera) -{ - GstStructure *st; - GstCaps *new_caps; - gboolean detect_framerate = FALSE; - - if (!camera->view_finder_caps) { - st = gst_structure_from_string (CAMERABIN_DEFAULT_VF_CAPS, NULL); - } else { - st = gst_structure_copy (gst_caps_get_structure (camera->view_finder_caps, - 0)); - } - - if (camera->width > 0 && camera->height > 0) { - gst_structure_set (st, - "width", G_TYPE_INT, camera->width, - "height", G_TYPE_INT, camera->height, NULL); - } - - if (camera->fps_n > 0 && camera->fps_d > 0) { - if (camera->night_mode) { - GST_WARNING_OBJECT (camera, - "night mode, lowest allowed fps will be forced"); - camera->pre_night_fps_n = camera->fps_n; - camera->pre_night_fps_d = camera->fps_d; - detect_framerate = TRUE; - } else { - gst_structure_set (st, - "framerate", GST_TYPE_FRACTION, camera->fps_n, camera->fps_d, NULL); - new_caps = gst_caps_new_full (st, NULL); - } - } else { - GST_DEBUG_OBJECT (camera, "no framerate specified"); - detect_framerate = TRUE; - } - - if (detect_framerate) { - GST_DEBUG_OBJECT (camera, "detecting allowed framerate"); - /* Remove old framerate if any */ - if (gst_structure_has_field (st, "framerate")) { - gst_structure_remove_field (st, "framerate"); - } - new_caps = gst_caps_new_full (st, NULL); - - /* Set allowed framerate for the resolution */ - gst_camerabin_set_allowed_framerate (camera, new_caps); - } - - /* Set default zoom method */ - g_object_set (camera->src_zoom_scale, "method", - CAMERABIN_DEFAULT_ZOOM_METHOD, NULL); - - gst_caps_replace (&camera->view_finder_caps, new_caps); - - /* Set caps for view finder mode */ - gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); -} - -/* - * camerabin_create_src_elements: - * @camera: camerabin object - * - * This function creates and links upstream side elements for camerabin. - * videosrc ! cspconv ! capsfilter ! crop ! scale ! capsfilter ! out-sel ! - * - * Returns: TRUE, if elements were successfully created, FALSE otherwise - */ -static gboolean -camerabin_create_src_elements (GstCameraBin * camera) -{ - gboolean ret = FALSE; - GstBin *cbin = GST_BIN (camera); - gchar *driver_name = NULL; - - if (camera->user_vid_src) { - camera->src_vid_src = camera->user_vid_src; - - if (!gst_camerabin_add_element (cbin, camera->src_vid_src)) { - camera->src_vid_src = NULL; - goto done; - } - } else if (!(camera->src_vid_src = - gst_camerabin_create_and_add_element (cbin, DEFAULT_SRC_VID_SRC))) - goto done; -#ifdef USE_COLOR_CONVERTER - if (!gst_camerabin_create_and_add_element (cbin, "ffmpegcolorspace")) - goto done; -#endif - if (!(camera->src_filter = - gst_camerabin_create_and_add_element (cbin, "capsfilter"))) - goto done; - if (!(camera->src_zoom_crop = - gst_camerabin_create_and_add_element (cbin, "videocrop"))) - goto done; - if (!(camera->src_zoom_scale = - gst_camerabin_create_and_add_element (cbin, "videoscale"))) - goto done; - if (!(camera->src_zoom_filter = - gst_camerabin_create_and_add_element (cbin, "capsfilter"))) - goto done; - if (!(camera->src_out_sel = - gst_camerabin_create_and_add_element (cbin, "output-selector"))) - goto done; - - camera->srcpad_zoom_filter = - gst_element_get_static_pad (camera->src_zoom_filter, "src"); - - /* Set default "driver-name" for v4l2camsrc if not set */ - if (g_object_class_find_property (G_OBJECT_GET_CLASS (camera->src_vid_src), - "driver-name")) { - g_object_get (G_OBJECT (camera->src_vid_src), "driver-name", - &driver_name, NULL); - if (!driver_name) { - g_object_set (G_OBJECT (camera->src_vid_src), "driver-name", - DEFAULT_V4L2CAMSRC_DRIVER_NAME, NULL); - } - } - - ret = TRUE; -done: - return ret; -} - -/* - * camerabin_setup_view_elements: - * @camera: camerabin object - * - * This function configures properties for view finder sink element. - */ -static void -camerabin_setup_view_elements (GstCameraBin * camera) -{ - GST_DEBUG_OBJECT (camera, "setting view finder properties"); - g_object_set (G_OBJECT (camera->view_in_sel), "select-all", TRUE, NULL); - /* Set properties for view finder sink */ - /* Find the actual sink if using bin like autovideosink */ - if (GST_IS_BIN (camera->view_sink)) { - GList *child = NULL, *children = GST_BIN_CHILDREN (camera->view_sink); - for (child = children; child != NULL; child = g_list_next (children)) { - GObject *ch = G_OBJECT (child->data); - if (g_object_class_find_property (G_OBJECT_GET_CLASS (ch), "sync")) { - g_object_set (G_OBJECT (ch), "sync", FALSE, "qos", FALSE, "async", - FALSE, NULL); - } - } - } else { - g_object_set (G_OBJECT (camera->view_sink), "sync", FALSE, "qos", FALSE, - "async", FALSE, NULL); - } -} - -/* - * camerabin_create_view_elements: - * @camera: camerabin object - * - * This function creates and links downstream side elements for camerabin. - * ! scale ! cspconv ! view finder sink - * - * Returns: TRUE, if elements were successfully created, FALSE otherwise - */ -static gboolean -camerabin_create_view_elements (GstCameraBin * camera) -{ - const GList *pads; - - if (!(camera->view_in_sel = - gst_camerabin_create_and_add_element (GST_BIN (camera), - "input-selector"))) { - goto error; - } - - /* Look for recently added input selector sink pad, we need to release it later */ - pads = GST_ELEMENT_PADS (camera->view_in_sel); - while (pads != NULL - && (GST_PAD_DIRECTION (GST_PAD (pads->data)) != GST_PAD_SINK)) { - pads = g_list_next (pads); - } - camera->pad_view_img = GST_PAD (pads->data); - - if (!(camera->view_scale = - gst_camerabin_create_and_add_element (GST_BIN (camera), - "videoscale"))) { - goto error; - } -#ifdef USE_COLOR_CONVERTER - if (!gst_camerabin_create_and_add_element (GST_BIN (camera), - "ffmpegcolorspace")) { - goto error; - } -#endif - if (camera->user_vf_sink) { - camera->view_sink = camera->user_vf_sink; - if (!gst_camerabin_add_element (GST_BIN (camera), camera->view_sink)) { - goto error; - } - } else if (!(camera->view_sink = - gst_camerabin_create_and_add_element (GST_BIN (camera), - DEFAULT_VIEW_SINK))) { - goto error; - } - - return TRUE; -error: - return FALSE; -} - -/* - * camerabin_create_elements: - * @camera: camerabin object - * - * This function creates and links all elements for camerabin, - * - * Returns: TRUE, if elements were successfully created, FALSE otherwise - */ -static gboolean -camerabin_create_elements (GstCameraBin * camera) -{ - gboolean ret = FALSE; - GstPadLinkReturn link_ret = GST_PAD_LINK_REFUSED; - GstPad *unconnected_pad; - - GST_LOG_OBJECT (camera, "creating elems"); - - /* Create "src" elements */ - if (!camerabin_create_src_elements (camera)) { - goto done; - } - - /* Add image bin */ - camera->pad_src_img = - gst_element_get_request_pad (camera->src_out_sel, "src%d"); - if (!gst_camerabin_add_element (GST_BIN (camera), camera->imgbin)) { - goto done; - } - gst_pad_add_buffer_probe (camera->pad_src_img, - G_CALLBACK (gst_camerabin_have_img_buffer), camera); - - /* Create view finder elements, this also links it to image bin */ - if (!camerabin_create_view_elements (camera)) { - GST_WARNING_OBJECT (camera, "creating view failed"); - goto done; - } - - /* Link output selector ! view_finder */ - camera->pad_src_view = - gst_element_get_request_pad (camera->src_out_sel, "src%d"); - camera->pad_view_src = - gst_element_get_request_pad (camera->view_in_sel, "sink%d"); - link_ret = gst_pad_link (camera->pad_src_view, camera->pad_view_src); - if (GST_PAD_LINK_FAILED (link_ret)) { - GST_ELEMENT_ERROR (camera, CORE, NEGOTIATION, - ("linking view finder failed"), (NULL)); - goto done; - } - - /* Set view finder active as default */ - g_object_set (G_OBJECT (camera->src_out_sel), "active-pad", - camera->pad_src_view, NULL); - - /* Add video bin */ - camera->pad_src_vid = - gst_element_get_request_pad (camera->src_out_sel, "src%d"); - if (!gst_camerabin_add_element (GST_BIN (camera), camera->vidbin)) { - goto done; - } - gst_pad_add_buffer_probe (camera->pad_src_vid, - G_CALLBACK (gst_camerabin_have_vid_buffer), camera); - - /* Link video bin ! view finder */ - // unconnected_pad = gst_bin_find_unlinked_pad (GST_BIN (camera), GST_PAD_SRC); - unconnected_pad = gst_bin_find_unconnected_pad (GST_BIN (camera), GST_PAD_SRC); - camera->pad_view_vid = - gst_element_get_request_pad (camera->view_in_sel, "sink%d"); - link_ret = gst_pad_link (unconnected_pad, camera->pad_view_vid); - gst_object_unref (unconnected_pad); - if (GST_PAD_LINK_FAILED (link_ret)) { - GST_ELEMENT_ERROR (camera, CORE, NEGOTIATION, (NULL), - ("linking video bin and view finder failed")); - goto done; - } - - ret = TRUE; - -done: - - if (FALSE == ret) - camerabin_destroy_elements (camera); - - return ret; -} - -/* - * camerabin_destroy_elements: - * @camera: camerabin object - * - * This function removes all elements from camerabin. - */ -static void -camerabin_destroy_elements (GstCameraBin * camera) -{ - GST_DEBUG_OBJECT (camera, "destroying elements"); - - /* Release request pads */ - if (camera->pad_view_vid) { - gst_element_release_request_pad (camera->view_in_sel, camera->pad_view_vid); - camera->pad_view_vid = NULL; - } - if (camera->pad_src_vid) { - gst_element_release_request_pad (camera->src_out_sel, camera->pad_src_vid); - camera->pad_src_vid = NULL; - } - if (camera->pad_view_img) { - gst_element_release_request_pad (camera->view_in_sel, camera->pad_view_img); - camera->pad_view_img = NULL; - } - if (camera->pad_src_img) { - gst_element_release_request_pad (camera->src_out_sel, camera->pad_src_img); - camera->pad_src_img = NULL; - } - if (camera->pad_view_src) { - gst_element_release_request_pad (camera->view_in_sel, camera->pad_view_src); - camera->pad_view_src = NULL; - } - if (camera->pad_src_view) { - gst_element_release_request_pad (camera->src_out_sel, camera->pad_src_view); - camera->pad_src_view = NULL; - } - - camera->view_sink = NULL; - camera->view_scale = NULL; - camera->view_in_sel = NULL; - - camera->src_out_sel = NULL; - camera->src_filter = NULL; - camera->src_zoom_crop = NULL; - camera->src_zoom_scale = NULL; - camera->src_zoom_filter = NULL; - camera->src_vid_src = NULL; - - camera->active_bin = NULL; - - /* Remove elements */ - gst_camerabin_remove_elements_from_bin (GST_BIN (camera)); -} - -/* - * camerabin_dispose_elements: - * @camera: camerabin object - * - * This function releases all allocated camerabin resources. - */ -static void -camerabin_dispose_elements (GstCameraBin * camera) -{ - if (camera->capture_mutex) { - g_mutex_free (camera->capture_mutex); - camera->capture_mutex = NULL; - } - if (camera->cond) { - g_cond_free (camera->cond); - camera->cond = NULL; - } - if (camera->filename) { - g_string_free (camera->filename, TRUE); - camera->filename = NULL; - } - /* Unref user set elements */ - if (camera->user_vf_sink) { - gst_object_unref (camera->user_vf_sink); - camera->user_vf_sink = NULL; - } - if (camera->user_vid_src) { - gst_object_unref (camera->user_vid_src); - camera->user_vid_src = NULL; - } - - if (camera->image_capture_caps) { - gst_caps_unref (camera->image_capture_caps); - camera->image_capture_caps = NULL; - } - - if (camera->view_finder_caps) { - gst_caps_unref (camera->view_finder_caps); - camera->view_finder_caps = NULL; - } - - if (camera->allowed_caps) { - gst_caps_unref (camera->allowed_caps); - camera->allowed_caps = NULL; - } -} - -/* - * gst_camerabin_image_capture_continue: - * @camera: camerabin object - * @filename: new filename set by user - * @cont: TRUE to continue image capture, FALSE otherwise - * - * Check if user wants to continue image capturing by using g_signal. - */ -static void -gst_camerabin_image_capture_continue (GstCameraBin * camera, GString * filename, - gboolean * cont) -{ - GST_DEBUG_OBJECT (camera, "emitting img_done signal, filename: %s", - filename->str); - g_signal_emit (G_OBJECT (camera), camerabin_signals[IMG_DONE_SIGNAL], 0, - filename, cont); - - GST_DEBUG_OBJECT (camera, "emitted img_done, new filename:%s, continue:%d", - filename->str, *cont); -} - -/* - * gst_camerabin_change_mode: - * @camera: camerabin object - * @mode: image or video mode - * - * Change camerabin mode between image and video capture. - * Changing mode will stop ongoing capture. - */ -static void -gst_camerabin_change_mode (GstCameraBin * camera, gint mode) -{ - if (camera->mode != mode || !camera->active_bin) { - GST_DEBUG_OBJECT (camera, "setting mode: %d", mode); - /* Interrupt ongoing capture */ - gst_camerabin_do_stop (camera); - camera->mode = mode; - if (camera->active_bin) { - gst_element_set_state (camera->active_bin, GST_STATE_NULL); - } - if (camera->mode == MODE_IMAGE) { - camera->active_bin = camera->imgbin; - } else if (camera->mode == MODE_VIDEO) { - camera->active_bin = camera->vidbin; - } - gst_camerabin_reset_to_view_finder (camera); - } -} - -/* - * gst_camerabin_change_filename: - * @camera: camerabin object - * @name: new filename for capture - * - * Change filename for image or video capture. - * Changing filename will stop ongoing capture. - */ -static void -gst_camerabin_change_filename (GstCameraBin * camera, const gchar * name) -{ - if (0 != strcmp (camera->filename->str, name)) { - GST_DEBUG_OBJECT (camera, "changing filename from %s to %s", - camera->filename->str, name); - /* Interrupt ongoing capture */ - gst_camerabin_do_stop (camera); - gst_camerabin_reset_to_view_finder (camera); - - if (camera->active_bin) { - g_object_set (G_OBJECT (camera->active_bin), "filename", name, NULL); - } - - g_string_assign (camera->filename, name); - } -} - -/* - * gst_camerabin_setup_zoom: - * @camera: camerabin object - * - * Apply zoom configured to camerabin to capture. - */ -static void -gst_camerabin_setup_zoom (GstCameraBin * camera) -{ - gint zoom; - gboolean done = FALSE; - - g_return_if_fail (camera != NULL); - g_return_if_fail (camera->src_zoom_crop != NULL); - - zoom = g_atomic_int_get (&camera->zoom); - - g_return_if_fail (zoom); - - if (GST_IS_ELEMENT (camera->src_vid_src) && - gst_element_implements_interface (camera->src_vid_src, - GST_TYPE_PHOTOGRAPHY)) { - /* Try setting (hardware) zoom using photography interface */ - GstPhotography *photo; - GstPhotoCaps pcaps; - - photo = GST_PHOTOGRAPHY (camera->src_vid_src); - pcaps = gst_photography_get_capabilities (photo); - - if (pcaps & GST_PHOTOGRAPHY_CAPS_ZOOM) { - done = gst_photography_set_zoom (photo, (gfloat) zoom / 100.0); - } - } - - if (!done) { - /* Update capsfilters to apply the (software) zoom */ - gint w2_crop = 0; - gint h2_crop = 0; - GstPad *pad_zoom_sink = NULL; - - GST_INFO_OBJECT (camera, "zoom: %d, orig size: %dx%d", zoom, - camera->width, camera->height); - - if (zoom != ZOOM_1X) { - w2_crop = (camera->width - (camera->width * ZOOM_1X / zoom)) / 2; - h2_crop = (camera->height - (camera->height * ZOOM_1X / zoom)) / 2; - } - - pad_zoom_sink = gst_element_get_static_pad (camera->src_zoom_crop, "sink"); - - GST_INFO_OBJECT (camera, - "sw cropping: left:%d, right:%d, top:%d, bottom:%d", w2_crop, w2_crop, - h2_crop, h2_crop); - - GST_PAD_STREAM_LOCK (pad_zoom_sink); - g_object_set (camera->src_zoom_crop, "left", w2_crop, "right", w2_crop, - "top", h2_crop, "bottom", h2_crop, NULL); - - GST_PAD_STREAM_UNLOCK (pad_zoom_sink); - gst_object_unref (pad_zoom_sink); - } - GST_LOG_OBJECT (camera, "zoom set"); -} - -/* - * gst_camerabin_get_allowed_input_caps: - * @camera: camerabin object - * - * Retrieve caps from videosrc describing formats it supports - * - * Returns: caps object from videosrc - */ -static GstCaps * -gst_camerabin_get_allowed_input_caps (GstCameraBin * camera) -{ - GstCaps *caps = NULL; - GstPad *pad = NULL, *peer_pad = NULL; - GstState state; - gboolean temp_videosrc_pause = FALSE; - GstElement *videosrc; - - g_return_val_if_fail (camera != NULL, NULL); - - videosrc = camera->src_vid_src ? camera->src_vid_src : camera->user_vid_src; - - if (!videosrc) { - GST_WARNING_OBJECT (camera, "no videosrc, can't get allowed caps"); - goto failed; - } - - if (camera->allowed_caps) { - GST_DEBUG_OBJECT (camera, "returning cached caps"); - goto done; - } - - pad = gst_element_get_static_pad (videosrc, "src"); - - if (!pad) { - GST_WARNING_OBJECT (camera, "no srcpad in videosrc"); - goto failed; - } - - state = GST_STATE (videosrc); - - /* Make this function work also in READY and NULL state */ - if (state == GST_STATE_READY || state == GST_STATE_NULL) { - GST_DEBUG_OBJECT (camera, "setting videosrc to paused temporarily"); - temp_videosrc_pause = TRUE; - peer_pad = gst_pad_get_peer (pad); - if (peer_pad) { - gst_pad_unlink (pad, peer_pad); - } - /* Set videosrc to PAUSED to open video device */ - gst_element_set_locked_state (videosrc, TRUE); - gst_element_set_state (videosrc, GST_STATE_PAUSED); - } - - camera->allowed_caps = gst_pad_get_caps (pad); - - /* Restore state and re-link if necessary */ - if (temp_videosrc_pause) { - GST_DEBUG_OBJECT (camera, "restoring videosrc state %d", state); - /* Reset videosrc to NULL state, some drivers seem to need this */ - gst_element_set_state (videosrc, GST_STATE_NULL); - gst_element_set_state (videosrc, state); - if (peer_pad) { - gst_pad_link (pad, peer_pad); - gst_object_unref (peer_pad); - } - gst_element_set_locked_state (videosrc, FALSE); - } - - gst_object_unref (pad); - -done: - if (camera->allowed_caps) { - caps = gst_caps_copy (camera->allowed_caps); - } -failed: - GST_INFO_OBJECT (camera, "allowed caps:%" GST_PTR_FORMAT, caps); - return caps; -} - -/* - * gst_camerabin_rewrite_tags_to_bin: - * @bin: bin holding tag setter elements - * @list: tag list to be written - * - * This function looks for certain tag setters from given bin - * and REPLACES ALL setter tags with given tag list - * - */ -static void -gst_camerabin_rewrite_tags_to_bin (GstBin * bin, const GstTagList * list) -{ - GstElement *setter; - GstElementFactory *setter_factory; - const gchar *klass; - GstIterator *iter; - GstIteratorResult res = GST_ITERATOR_OK; - gpointer data; - - iter = gst_bin_iterate_all_by_interface (bin, GST_TYPE_TAG_SETTER); - - while (res == GST_ITERATOR_OK || res == GST_ITERATOR_RESYNC) { - res = gst_iterator_next (iter, &data); - switch (res) { - case GST_ITERATOR_DONE: - break; - case GST_ITERATOR_RESYNC: - gst_iterator_resync (iter); - break; - case GST_ITERATOR_ERROR: - GST_WARNING ("error iterating tag setters"); - break; - case GST_ITERATOR_OK: - setter = GST_ELEMENT (data); - GST_LOG ("iterating tag setters: %" GST_PTR_FORMAT, setter); - setter_factory = gst_element_get_factory (setter); - klass = gst_element_factory_get_klass (setter_factory); - /* FIXME: check if tags should be written to all tag setters, - set tags only to Muxer elements for now */ - if (g_strrstr (klass, "Muxer")) { - GST_DEBUG ("replacement tags %" GST_PTR_FORMAT, list); - gst_tag_setter_merge_tags (GST_TAG_SETTER (setter), list, - GST_TAG_MERGE_REPLACE_ALL); - } - gst_object_unref (setter); - break; - default: - break; - } - } - - gst_iterator_free (iter); -} - -/* - * gst_camerabin_get_internal_tags: - * @camera: the camera bin element - * - * Returns tag list containing metadata from camerabin - * and it's elements - */ -static GstTagList * -gst_camerabin_get_internal_tags (GstCameraBin * camera) -{ - GstTagList *list = gst_tag_list_new (); - GstColorBalance *balance = NULL; - const GList *controls = NULL, *item; - GstColorBalanceChannel *channel; - gint min_value, max_value, mid_value, cur_value; - - - if (camera->active_bin == camera->vidbin) { - /* FIXME: check if internal video tag setting is needed */ - goto done; - } - - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - "image-width", camera->width, "image-height", camera->height, NULL); - - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - "capture-digital-zoom", camera->zoom, 100, NULL); - - if (gst_element_implements_interface (GST_ELEMENT (camera), - GST_TYPE_COLOR_BALANCE)) { - balance = GST_COLOR_BALANCE (camera); - } - - if (balance) { - controls = gst_color_balance_list_channels (balance); - } - for (item = controls; item; item = g_list_next (item)) { - channel = item->data; - min_value = channel->min_value; - max_value = channel->max_value; - /* the default value would probably better */ - mid_value = min_value + ((max_value - min_value) / 2); - cur_value = gst_color_balance_get_value (balance, channel); - - if (!strcasecmp (channel->label, "brightness")) { - /* The value of brightness. The unit is the APEX value (Additive System of Photographic Exposure). - * Ordinarily it is given in the range of -99.99 to 99.99. Note that - * if the numerator of the recorded value is 0xFFFFFFFF, Unknown shall be indicated. - * - * BrightnessValue (Bv) = log2 ( B/NK ) - * Note that: B:cd/cm² (candela per square centimeter), N,K: constant - * - * http://johnlind.tripod.com/science/scienceexposure.html - * - */ - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - "capture-brightness", cur_value, 1, NULL); - } else if (!strcasecmp (channel->label, "contrast")) { - /* 0 = Normal, 1 = Soft, 2 = Hard */ - - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - "capture-contrast", - (cur_value == mid_value) ? 0 : ((cur_value < mid_value) ? 1 : 2), - NULL); - } else if (!strcasecmp (channel->label, "gain")) { - /* 0 = Normal, 1 = Low Up, 2 = High Up, 3 = Low Down, 4 = Hight Down */ - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - "capture-gain", - (guint) (cur_value == mid_value) ? 0 : ((cur_value < - mid_value) ? 1 : 3), NULL); - } else if (!strcasecmp (channel->label, "saturation")) { - /* 0 = Normal, 1 = Low, 2 = High */ - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - "capture-saturation", - (cur_value == mid_value) ? 0 : ((cur_value < mid_value) ? 1 : 2), - NULL); - } - } - -done: - - return list; -} - -/* - * gst_camerabin_rewrite_tags: - * @camera: the camera bin element - * - * Merges application set tags to camerabin internal tags, - * and writes them using image or video bin tag setters. - */ -static void -gst_camerabin_rewrite_tags (GstCameraBin * camera) -{ - const GstTagList *app_tag_list = NULL; - GstTagList *list = NULL; - - /* Get application set tags */ - app_tag_list = gst_tag_setter_get_tag_list (GST_TAG_SETTER (camera)); - - /* Get tags from camerabin and it's elements */ - list = gst_camerabin_get_internal_tags (camera); - - if (app_tag_list) { - gst_tag_list_insert (list, app_tag_list, GST_TAG_MERGE_REPLACE); - } - - /* Write tags */ - gst_camerabin_rewrite_tags_to_bin (GST_BIN (camera->active_bin), list); - - gst_tag_list_free (list); -} - -/* - * gst_camerabin_set_capsfilter_caps: - * @camera: camerabin object - * @new_caps: pointer to caps object to set - * - * Set given caps to camerabin capsfilters. - */ -static void -gst_camerabin_set_capsfilter_caps (GstCameraBin * camera, GstCaps * new_caps) -{ - GstStructure *st; - - GST_INFO_OBJECT (camera, "new_caps:%" GST_PTR_FORMAT, new_caps); - - st = gst_caps_get_structure (new_caps, 0); - - gst_structure_get_int (st, "width", &camera->width); - gst_structure_get_int (st, "height", &camera->height); - - if (gst_structure_has_field (st, "framerate")) { - gst_structure_get_fraction (st, "framerate", &camera->fps_n, - &camera->fps_d); - } - - /* Update zoom */ - gst_camerabin_setup_zoom (camera); - - /* Update capsfilters */ - g_object_set (G_OBJECT (camera->src_filter), "caps", new_caps, NULL); - g_object_set (G_OBJECT (camera->src_zoom_filter), "caps", new_caps, NULL); -} - -/* - * img_capture_prepared: - * @data: camerabin object - * - * Callback which is called after image capture has been prepared. - */ -static void -img_capture_prepared (gpointer data) -{ - GstCameraBin *camera = GST_CAMERABIN (data); - - GST_INFO_OBJECT (camera, "image capture prepared"); - - if (camera->image_capture_caps) { - /* Set capsfilters to match arriving image data */ - gst_camerabin_set_capsfilter_caps (camera, camera->image_capture_caps); - } - - g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", FALSE, - "active-pad", camera->pad_src_img, NULL); - gst_camerabin_rewrite_tags (camera); - gst_element_set_state (GST_ELEMENT (camera->imgbin), GST_STATE_PLAYING); -} - -/* - * gst_camerabin_start_image_capture: - * @camera: camerabin object - * - * Initiates image capture. - */ -static void -gst_camerabin_start_image_capture (GstCameraBin * camera) -{ - GstStateChangeReturn state_ret; - gboolean wait_for_prepare = FALSE; - gint width = 0, height = 0, fps_n = 0, fps_d = 0; - GstStructure *st; - - GST_INFO_OBJECT (camera, "starting image capture"); - - if (GST_IS_ELEMENT (camera->src_vid_src) && - gst_element_implements_interface (camera->src_vid_src, - GST_TYPE_PHOTOGRAPHY)) { - /* Start image capture preparations using photography iface */ - wait_for_prepare = TRUE; - g_mutex_lock (camera->capture_mutex); - if (camera->image_capture_caps) { - st = gst_caps_get_structure (camera->image_capture_caps, 0); - } else { - st = gst_caps_get_structure (camera->view_finder_caps, 0); - } - gst_structure_get_int (st, "width", &width); - gst_structure_get_int (st, "height", &height); - gst_structure_get_fraction (st, "framerate", &fps_n, &fps_d); - /* Set image capture resolution and frame rate */ - g_signal_emit_by_name (camera->src_vid_src, "user-res-fps", - width, height, fps_n, fps_d, 0); - - /* Enable still image capture mode in v4l2camsrc */ - if (g_object_class_find_property (G_OBJECT_GET_CLASS (camera->src_vid_src), - "capture-mode")) { - g_object_set (G_OBJECT (camera->src_vid_src), "capture-mode", 1, NULL); - } - - /* Start preparations for image capture */ - gst_photography_prepare_for_capture (GST_PHOTOGRAPHY (camera->src_vid_src), - (GstPhotoCapturePrepared) img_capture_prepared, camera); - camera->capturing = TRUE; - g_mutex_unlock (camera->capture_mutex); - } - - if (!wait_for_prepare) { - gst_camerabin_rewrite_tags (camera); - state_ret = gst_element_set_state (camera->imgbin, GST_STATE_PLAYING); - if (state_ret != GST_STATE_CHANGE_FAILURE) { - g_mutex_lock (camera->capture_mutex); - g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", TRUE, - "active-pad", camera->pad_src_img, NULL); - camera->capturing = TRUE; - g_mutex_unlock (camera->capture_mutex); - } else { - GST_WARNING_OBJECT (camera, "imagebin state change failed"); - gst_element_set_state (camera->imgbin, GST_STATE_NULL); - } - } -} - -/* - * gst_camerabin_start_video_recording: - * @camera: camerabin object - * - * Initiates video recording. - */ -static void -gst_camerabin_start_video_recording (GstCameraBin * camera) -{ - GstStateChangeReturn state_ret; - /* FIXME: how to ensure resolution and fps is supported by CPU? - * use a queue overrun signal? - */ - GST_INFO_OBJECT (camera, "starting video capture"); - - gst_camerabin_rewrite_tags (camera); - - /* Pause the pipeline in order to distribute new clock in paused_to_playing */ - /* audio src timestamps will be 0 without state change to READY. ??? */ - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_READY); - gst_element_set_locked_state (camera->vidbin, FALSE); - state_ret = gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PAUSED); - - if (state_ret != GST_STATE_CHANGE_FAILURE) { - g_mutex_lock (camera->capture_mutex); - g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", FALSE, - "active-pad", camera->pad_src_vid, NULL); - - /* Enable video mode in v4l2camsrc */ - if (g_object_class_find_property (G_OBJECT_GET_CLASS (camera->src_vid_src), - "capture-mode")) { - g_object_set (G_OBJECT (camera->src_vid_src), "capture-mode", 2, NULL); - } - - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING); - gst_element_set_locked_state (camera->vidbin, TRUE); - camera->capturing = TRUE; - g_mutex_unlock (camera->capture_mutex); - } else { - GST_WARNING_OBJECT (camera, "videobin state change failed"); - gst_element_set_state (camera->vidbin, GST_STATE_NULL); - gst_camerabin_reset_to_view_finder (camera); - } -} - -/* - * gst_camerabin_send_video_eos: - * @camera: camerabin object - * - * Generate and send eos event to video bin in order to - * finish recording properly. - */ -static void -gst_camerabin_send_video_eos (GstCameraBin * camera) -{ - GstPad *videopad; - - g_return_if_fail (camera != NULL); - - /* Send eos event to video bin */ - GST_INFO_OBJECT (camera, "sending eos to videobin"); - videopad = gst_element_get_static_pad (camera->vidbin, "sink"); - gst_pad_send_event (videopad, gst_event_new_eos ()); - gst_object_unref (videopad); -} - -/* - * image_pad_blocked: - * @pad: pad to block/unblock - * @blocked: TRUE to block, FALSE to unblock - * @u_data: camera bin object - * - * Sends eos event to image bin if blocking pad leading to image bin. - * The pad will be unblocked when image bin posts eos message. - */ -static void -image_pad_blocked (GstPad * pad, gboolean blocked, gpointer user_data) -{ - GstCameraBin *camera; - - camera = (GstCameraBin *) user_data; - - GST_DEBUG_OBJECT (camera, "%s %s:%s", - blocked ? "blocking" : "unblocking", GST_DEBUG_PAD_NAME (pad)); - - if (blocked && (pad == camera->pad_src_img)) { - /* Send eos and block until image bin reaches eos */ - GST_DEBUG_OBJECT (camera, "sending eos to image bin"); - gst_element_send_event (camera->imgbin, gst_event_new_eos ()); - } -} - -/* - * gst_camerabin_have_img_buffer: - * @pad: output-selector src pad leading to image bin - * @buffer: still image frame - * @u_data: camera bin object - * - * Buffer probe called before sending each buffer to image bin. - * - * First buffer is always passed directly to image bin. Then pad - * is blocked in order to interleave buffers with eos events. - * Interleaving eos events and buffers is needed when we have - * decoupled elements in the image bin capture pipeline. - * After image bin posts eos message, then pad is unblocked. - * Next, image bin is changed to READY state in order to save the - * file and the application is allowed to decide whether to - * continue image capture. If yes, only then the next buffer is - * passed to image bin. - */ -static gboolean -gst_camerabin_have_img_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data) -{ - GstCameraBin *camera = (GstCameraBin *) u_data; - gboolean ret = TRUE; - - GST_LOG ("got buffer #%d %p with size %d", camera->num_img_buffers, - buffer, GST_BUFFER_SIZE (buffer)); - - /* Image filename should be set by now */ - if (g_str_equal (camera->filename->str, "")) { - GST_DEBUG_OBJECT (camera, "filename not set, dropping buffer"); - ret = FALSE; - goto done; - } - - /* Check for first buffer after capture start, we want to - pass it forward directly. */ - if (!camera->num_img_buffers) { - /* Restore filter caps for view finder mode if necessary. - The v4l2camsrc switches automatically to view finder - resolution after hi-res still image capture. */ - if (camera->image_capture_caps) { - gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); - } - goto done; - } - - /* Close the file of saved image */ - gst_element_set_state (camera->imgbin, GST_STATE_READY); - - /* Check if the application wants to continue */ - gst_camerabin_image_capture_continue (camera, camera->filename, &ret); - - if (ret && !camera->stop_requested) { - GST_DEBUG_OBJECT (camera, "capturing image \"%s\"", camera->filename->str); - g_object_set (G_OBJECT (camera->imgbin), "filename", - camera->filename->str, NULL); - gst_element_set_state (camera->imgbin, GST_STATE_PLAYING); - } else { - GST_DEBUG_OBJECT (camera, "not continuing (cont:%d, stop_req:%d)", - ret, camera->stop_requested); - /* Reset filename to force application set new filename */ - g_string_assign (camera->filename, ""); - - /* Block dataflow to the output-selector to show preview image in - view finder. Continue and unblock when capture is stopped */ - gst_pad_set_blocked_async (camera->srcpad_zoom_filter, TRUE, - (GstPadBlockCallback) image_pad_blocked, camera); - ret = FALSE; /* Drop the buffer */ - - g_mutex_lock (camera->capture_mutex); - camera->capturing = FALSE; - g_cond_signal (camera->cond); - g_mutex_unlock (camera->capture_mutex); - } - -done: - - if (ret) { - camera->num_img_buffers++; - /* Block when next buffer arrives, we want to push eos event - between frames and make sure that eos reaches the filesink - before processing the next buffer. */ - gst_pad_set_blocked_async (pad, TRUE, - (GstPadBlockCallback) image_pad_blocked, camera); - } - - return ret; -} - -/* - * gst_camerabin_have_vid_buffer: - * @pad: output-selector src pad leading to video bin - * @buffer: buffer pushed to the pad - * @u_data: camerabin object - * - * Buffer probe for src pad leading to video bin. - * Sends eos event to video bin if stop requested and drops - * all buffers after this. - */ -static gboolean -gst_camerabin_have_vid_buffer (GstPad * pad, GstBuffer * buffer, - gpointer u_data) -{ - GstCameraBin *camera = (GstCameraBin *) u_data; - gboolean ret = TRUE; - GST_LOG ("got video buffer %p with size %d", - buffer, GST_BUFFER_SIZE (buffer)); - if (camera->stop_requested) { - gst_camerabin_send_video_eos (camera); - ret = FALSE; /* Drop buffer */ - } - - return ret; -} - -/* - * gst_camerabin_reset_to_view_finder: - * @camera: camerabin object - * - * Stop capturing and set camerabin to view finder mode. - * Reset capture counters and flags. - */ -static void -gst_camerabin_reset_to_view_finder (GstCameraBin * camera) -{ - GstStateChangeReturn state_ret; - GST_DEBUG_OBJECT (camera, "resetting"); - - /* Set active bin to READY state */ - if (camera->active_bin) { - state_ret = gst_element_set_state (camera->active_bin, GST_STATE_READY); - if (state_ret == GST_STATE_CHANGE_FAILURE) { - GST_WARNING_OBJECT (camera, "state change failed"); - gst_element_set_state (camera->active_bin, GST_STATE_NULL); - camera->active_bin = NULL; - } - } - - /* Reset counters and flags */ - camera->num_img_buffers = 0; - camera->stop_requested = FALSE; - camera->paused = FALSE; - - if (camera->src_out_sel) { - /* Set selector to forward data to view finder */ - g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", FALSE, - "active-pad", camera->pad_src_view, NULL); - } - - /* Unblock, if dataflow to output-selector is blocked due to image preview */ - if (camera->srcpad_zoom_filter && - gst_pad_is_blocked (camera->srcpad_zoom_filter)) { - gst_pad_set_blocked_async (camera->srcpad_zoom_filter, FALSE, - (GstPadBlockCallback) image_pad_blocked, camera); - } - /* Unblock, if dataflow to image bin is blocked due to waiting for eos */ - if (camera->pad_src_img && gst_pad_is_blocked (camera->pad_src_img)) { - gst_pad_set_blocked_async (camera->pad_src_img, FALSE, - (GstPadBlockCallback) image_pad_blocked, camera); - } - - /* Enable view finder mode in v4l2camsrc */ - if (camera->src_vid_src && - g_object_class_find_property (G_OBJECT_GET_CLASS (camera->src_vid_src), - "capture-mode")) { - g_object_set (G_OBJECT (camera->src_vid_src), "capture-mode", 0, NULL); - } - - GST_DEBUG_OBJECT (camera, "reset done"); -} - -/* - * gst_camerabin_do_stop: - * @camera: camerabin object - * - * Raise flag to indicate to image and video bin capture stop. - * Stopping paused video recording handled as a special case. - * Wait for ongoing capturing to finish. - */ -static void -gst_camerabin_do_stop (GstCameraBin * camera) -{ - g_mutex_lock (camera->capture_mutex); - if (camera->capturing) { - GST_DEBUG_OBJECT (camera, "mark stop"); - camera->stop_requested = TRUE; - - /* Take special care when stopping paused video capture */ - if ((camera->active_bin == camera->vidbin) && camera->paused) { - /* Send eos event to video bin before setting it to playing */ - gst_camerabin_send_video_eos (camera); - /* We must change to playing now in order to get video bin eos events - and buffered data through and finish recording properly */ - gst_element_set_state (GST_ELEMENT (camera->vidbin), GST_STATE_PLAYING); - camera->paused = FALSE; - } - - GST_DEBUG_OBJECT (camera, "waiting for capturing to finish"); - g_cond_wait (camera->cond, camera->capture_mutex); - GST_DEBUG_OBJECT (camera, "capturing finished"); - } - g_mutex_unlock (camera->capture_mutex); -} - -/* - * gst_camerabin_default_signal_img_done: - * @camera: camerabin object - * @fname: new filename - * - * Default handler for #GstCameraBin::img-done signal, - * stops always capture. - * - * Returns: FALSE always - */ -static gboolean -gst_camerabin_default_signal_img_done (GstCameraBin * camera, GString * fname) -{ - return FALSE; -} - -/* - * gst_camerabin_set_allowed_framerate: - * @camera: camerabin object - * @filter_caps: update allowed framerate to these caps - * - * Find allowed frame rate from video source that matches with - * resolution in @filter_caps. Set found frame rate to @filter_caps. - */ -static void -gst_camerabin_set_allowed_framerate (GstCameraBin * camera, - GstCaps * filter_caps) -{ - GstStructure *structure; - GstCaps *allowed_caps = NULL, *intersect = NULL; - const GValue *framerate = NULL; - guint caps_size, i; - - /* Get supported caps from video src that matches with new filter caps */ - GST_INFO_OBJECT (camera, "filter caps:%" GST_PTR_FORMAT, filter_caps); - allowed_caps = gst_camerabin_get_allowed_input_caps (camera); - intersect = gst_caps_intersect (allowed_caps, filter_caps); - GST_INFO_OBJECT (camera, "intersect caps:%" GST_PTR_FORMAT, intersect); - - /* Find the best framerate from the caps */ - caps_size = gst_caps_get_size (intersect); - for (i = 0; i < caps_size; i++) { - structure = gst_caps_get_structure (intersect, i); - framerate = - gst_camerabin_find_better_framerate (camera, structure, framerate); - } - - if (GST_VALUE_HOLDS_FRACTION (framerate)) { - gst_caps_set_simple (filter_caps, - "framerate", GST_TYPE_FRACTION, - gst_value_get_fraction_numerator (framerate), - gst_value_get_fraction_denominator (framerate), NULL); - } - - if (allowed_caps) { - gst_caps_unref (allowed_caps); - } - if (intersect) { - gst_caps_unref (intersect); - } -} - - -/** - * get_srcpad_current_format: - * @element: element to get the format from - * - * Helper function to get the negotiated fourcc - * format from @element src pad. - * - * Returns: negotiated format (fourcc), 0 if not found - */ -static guint32 -get_srcpad_current_format (GstElement * element) -{ - GstPad *srcpad = NULL; - GstCaps *srccaps = NULL; - GstStructure *structure; - guint32 format = 0; - - g_return_val_if_fail (element != NULL, 0); - - if ((srcpad = gst_element_get_static_pad (element, "src")) == NULL) { - goto no_pad; - } - - if ((srccaps = gst_pad_get_negotiated_caps (srcpad)) == NULL) { - goto no_caps; - } - - GST_LOG ("negotiated caps %" GST_PTR_FORMAT, srccaps); - - structure = gst_caps_get_structure (srccaps, 0); - if (gst_structure_has_field (structure, "format")) { - gst_structure_get_fourcc (structure, "format", &format); - } - - gst_caps_unref (srccaps); -no_caps: - gst_object_unref (srcpad); -no_pad: - GST_DEBUG ("current format for %" GST_PTR_FORMAT ": %" GST_FOURCC_FORMAT, - element, GST_FOURCC_ARGS (format)); - return format; -} - -/* - * gst_camerabin_find_better_framerate: - * @camera: camerabin object - * @st: structure that contains framerate candidates - * @orig_framerate: best framerate so far - * - * Looks for framerate better than @orig_framerate from @st structure. - * In night mode lowest framerate is considered best, otherwise highest is - * best. - * - * Returns: @orig_framerate or better if found - */ -static const GValue * -gst_camerabin_find_better_framerate (GstCameraBin * camera, GstStructure * st, - const GValue * orig_framerate) -{ - const GValue *framerate = NULL; - guint i, i_best, list_size; - gint res, comparison; - - if (camera->night_mode) { - GST_LOG_OBJECT (camera, "finding min framerate"); - comparison = GST_VALUE_LESS_THAN; - } else { - GST_LOG_OBJECT (camera, "finding max framerate"); - comparison = GST_VALUE_GREATER_THAN; - } - - if (gst_structure_has_field (st, "framerate")) { - framerate = gst_structure_get_value (st, "framerate"); - /* Handle framerate lists */ - if (GST_VALUE_HOLDS_LIST (framerate)) { - list_size = gst_value_list_get_size (framerate); - GST_LOG_OBJECT (camera, "finding framerate from list"); - for (i = 0, i_best = 0; i < list_size; i++) { - res = gst_value_compare (gst_value_list_get_value (framerate, i), - gst_value_list_get_value (framerate, i_best)); - if (comparison == res) { - i_best = i; - } - } - GST_LOG_OBJECT (camera, "found best framerate from index %d", i_best); - framerate = gst_value_list_get_value (framerate, i_best); - } - /* Handle framerate ranges */ - if (GST_VALUE_HOLDS_FRACTION_RANGE (framerate)) { - if (camera->night_mode) { - GST_LOG_OBJECT (camera, "getting min framerate from range"); - framerate = gst_value_get_fraction_range_min (framerate); - } else { - GST_LOG_OBJECT (camera, "getting max framerate from range"); - framerate = gst_value_get_fraction_range_max (framerate); - } - } - } - - /* Check if we found better framerate */ - if (orig_framerate && framerate) { - res = gst_value_compare (orig_framerate, framerate); - if (comparison == res) { - GST_LOG_OBJECT (camera, "original framerate was the best"); - framerate = orig_framerate; - } - } - - return framerate; -} - -/* - * GObject callback functions implementation - */ - -static void -gst_camerabin_base_init (gpointer gclass) -{ - static GstElementDetails element_details = { - "Camera Bin", - "Generic/Bin/Camera", - "Handle lot of features present in DSC", - "Nokia Corporation \n" - "Edgard Lima " - }; - GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); - - gst_element_class_set_details (element_class, &element_details); -} - -static void -gst_camerabin_class_init (GstCameraBinClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstBinClass *gstbin_class; - - gobject_class = G_OBJECT_CLASS (klass); - gstelement_class = GST_ELEMENT_CLASS (klass); - gstbin_class = GST_BIN_CLASS (klass); - - /* gobject */ - - gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_camerabin_dispose); - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_camerabin_finalize); - - gobject_class->set_property = gst_camerabin_set_property; - gobject_class->get_property = gst_camerabin_get_property; - - /** - * GstCameraBin:filename: - * - * Set filename for the still image capturing or video capturing. - */ - - g_object_class_install_property (gobject_class, ARG_FILENAME, - g_param_spec_string ("filename", "Filename", - "Filename of the image or video to save", "", G_PARAM_READWRITE)); - - /** - * GstCameraBin:mode: - * - * Set the mode of operation: still image capturing or video recording. - * Setting the mode will create and destroy image bin or video bin elements - * according to the mode. You can set this property at any time, changing - * the mode will stop ongoing capture. - */ - - g_object_class_install_property (gobject_class, ARG_MODE, - g_param_spec_enum ("mode", "Mode", - "The capture mode (still image capture or video recording)", - GST_TYPE_CAMERABIN_MODE, DEFAULT_MODE, G_PARAM_READWRITE)); - - /** - * GstCameraBin:mute: - * - * Mute audio in video recording mode. - * Set this property only when #GstCameraBin is in READY, PAUSED or PLAYING. - */ - - g_object_class_install_property (gobject_class, ARG_MUTE, - g_param_spec_boolean ("mute", "Mute", - "True to mute the recording. False to record with audio", - ARG_DEFAULT_MUTE, G_PARAM_READWRITE)); - - /** - * GstCameraBin:zoom: - * - * Set up the zoom applied to the frames. - * Set this property only when #GstCameraBin is in READY, PAUSED or PLAYING. - */ - - g_object_class_install_property (gobject_class, ARG_ZOOM, - g_param_spec_int ("zoom", "Zoom", - "The zoom. 100 for 1x, 200 for 2x and so on", - MIN_ZOOM, MAX_ZOOM, DEFAULT_ZOOM, G_PARAM_READWRITE)); - - /** - * GstCameraBin:imagepp: - * - * Set up an element to do image post processing. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - g_object_class_install_property (gobject_class, ARG_IMAGE_POST, - g_param_spec_object ("imagepp", "Image post processing element", - "Image Post-Processing GStreamer element (default is NULL)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:imageenc: - * - * Set up an image encoder (for example, jpegenc or pngenc) element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_IMAGE_ENC, - g_param_spec_object ("imageenc", "Image encoder", - "Image encoder GStreamer element (default is jpegenc)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:videopp: - * - * Set up an element to do video post processing. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_VIDEO_POST, - g_param_spec_object ("videopp", "Video post processing element", - "Video post processing GStreamer element (default is NULL)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:videoenc: - * - * Set up a video encoder element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_VIDEO_ENC, - g_param_spec_object ("videoenc", "Video encoder", - "Video encoder GStreamer element (default is theoraenc)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:audioenc: - * - * Set up an audio encoder element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_AUDIO_ENC, - g_param_spec_object ("audioenc", "Audio encoder", - "Audio encoder GStreamer element (default is vorbisenc)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:videomux: - * - * Set up a video muxer element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_VIDEO_MUX, - g_param_spec_object ("videomux", "Video muxer", - "Video muxer GStreamer element (default is oggmux)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:vfsink: - * - * Set up a sink element to render frames in view finder. - * By default "autovideosink" will be the sink element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_VF_SINK, - g_param_spec_object ("vfsink", "View finder sink", - "View finder sink GStreamer element (default is " DEFAULT_VIEW_SINK - ")", GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:videosrc: - * - * Set up a video source element. - * By default "v4l2src" will be the src element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_VIDEO_SRC, - g_param_spec_object ("videosrc", "Video source element", - "Video source GStreamer element (default is " DEFAULT_SRC_VID_SRC ")", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - /** - * GstCameraBin:audiosrc: - * - * Set up an audio source element. - * By default "pulsesrc" will be the source element. - * This property can only be set while #GstCameraBin is in NULL state. - * The ownership of the element will be taken by #GstCameraBin. - */ - - g_object_class_install_property (gobject_class, ARG_AUDIO_SRC, - g_param_spec_object ("audiosrc", "Audio source element", - "Audio source GStreamer element (default is pulsesrc)", - GST_TYPE_ELEMENT, G_PARAM_READWRITE)); - - /** - * GstCameraBin:inputcaps: - * - * The allowed modes of operation of the video source. Have in mind that it - * doesn't mean #GstCameraBin can operate in all those modes, - * it depends also on the other elements in the pipeline. Remember to - * gst_caps_unref after using it. - */ - - g_object_class_install_property (gobject_class, ARG_INPUT_CAPS, - g_param_spec_boxed ("inputcaps", "Input caps", - "The allowed modes of the video source operation", - GST_TYPE_CAPS, G_PARAM_READABLE)); - - /** - * GstCameraBin:filter-caps: - * - * Filter video source element caps using this property. - * This is an alternative to #GstCamerabin::user-res-fps action - * signal that allows more fine grained control of video source. - */ - - g_object_class_install_property (gobject_class, ARG_FILTER_CAPS, - g_param_spec_boxed ("filter-caps", "Filter caps", - "Capsfilter caps used to control video source operation", - GST_TYPE_CAPS, G_PARAM_READWRITE)); - - /** - * GstCameraBin::user-start: - * @camera: the camera bin element - * - * Starts image capture or video recording depending on the Mode. - * If there is a capture already going on, does nothing. - * Resumes video recording if it has been paused. - */ - - camerabin_signals[USER_START_SIGNAL] = - g_signal_new ("user-start", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (GstCameraBinClass, user_start), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - - /** - * GstCameraBin::user-stop: - * @camera: the camera bin element - * - * Stops still image preview, continuous image capture and video - * recording and returns to the view finder mode. - */ - - camerabin_signals[USER_STOP_SIGNAL] = - g_signal_new ("user-stop", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (GstCameraBinClass, user_stop), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - - /** - * GstCameraBin::user-pause: - * @camera: the camera bin element - * - * Pauses video recording or resumes paused video recording. - * If in image mode or not recording, does nothing. - */ - - camerabin_signals[USER_PAUSE_SIGNAL] = - g_signal_new ("user-pause", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (GstCameraBinClass, user_pause), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - - /** - * GstCameraBin::user-res-fps: - * @camera: the camera bin element - * @width: number of horizontal pixels - * @height: number of vertical pixels - * @fps_n: frames per second numerator - * @fps_d: frames per second denominator - * - * Changes the frame resolution and frames per second of the video source. - * The application must be aware of the resolutions supported by the camera. - * Supported resolutions and frame rates can be get using input-caps property. - * - * Setting @fps_n or @fps_d to 0 configures maximum framerate for the - * given resolution, unless in night mode when minimum is configured. - */ - - camerabin_signals[USER_RES_FPS_SIGNAL] = - g_signal_new ("user-res-fps", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (GstCameraBinClass, user_res_fps), - NULL, NULL, gst_camerabin_marshal_VOID__INT_INT_INT_INT, G_TYPE_NONE, 4, - G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); - - /** - * GstCameraBin::user-image-res: - * @camera: the camera bin element - * @width: number of horizontal pixels - * @height: number of vertical pixels - * - * Changes the resolution used for still image capture. - * Does not affect view finder mode and video recording. - * Use this action signal in PAUSED or PLAYING state. - */ - - camerabin_signals[USER_IMAGE_RES_SIGNAL] = - g_signal_new ("user-image-res", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (GstCameraBinClass, user_image_res), - NULL, NULL, gst_camerabin_marshal_VOID__INT_INT, G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_INT); - - /** - * GstCameraBin::img-done: - * @camera: the camera bin element - * @filename: the name of the file just saved - * - * Signal emited when the file has just been saved. To continue taking - * pictures just update @filename and return TRUE, otherwise return FALSE. - * - * Don't call any #GstCameraBin method from this signal, if you do so there - * will be a deadlock. - */ - - camerabin_signals[IMG_DONE_SIGNAL] = - g_signal_new ("img-done", G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstCameraBinClass, img_done), - g_signal_accumulator_true_handled, NULL, gst_marshal_BOOLEAN__POINTER, - G_TYPE_BOOLEAN, 1, G_TYPE_POINTER); - - klass->user_start = gst_camerabin_user_start; - klass->user_stop = gst_camerabin_user_stop; - klass->user_pause = gst_camerabin_user_pause; - klass->user_res_fps = gst_camerabin_user_res_fps; - klass->user_image_res = gst_camerabin_user_image_res; - - klass->img_done = gst_camerabin_default_signal_img_done; - - /* gstelement */ - - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_camerabin_change_state); - - /* gstbin */ - /* override handle_message to peek when video or image bin reaches eos */ - gstbin_class->handle_message = - GST_DEBUG_FUNCPTR (gst_camerabin_handle_message_func); - -} - -/* initialize the new element - * instantiate pads and add them to element - * set functions - * initialize structure - */ -static void -gst_camerabin_init (GstCameraBin * camera, GstCameraBinClass * gclass) -{ - /* GstElementClass *klass = GST_ELEMENT_GET_CLASS (camera); */ - - camera->filename = g_string_new (""); - camera->mode = DEFAULT_MODE; - camera->num_img_buffers = 0; - camera->stop_requested = FALSE; - camera->paused = FALSE; - camera->capturing = FALSE; - camera->night_mode = FALSE; - - camera->width = DEFAULT_WIDTH; - camera->height = DEFAULT_HEIGHT; - camera->fps_n = DEFAULT_FPS_N; - camera->fps_d = DEFAULT_FPS_D; - - camera->image_capture_caps = NULL; - camera->view_finder_caps = NULL; - camera->allowed_caps = NULL; - - camera->zoom = DEFAULT_ZOOM; - - /* concurrency control */ - camera->capture_mutex = g_mutex_new (); - camera->cond = g_cond_new (); - - /* pad names for output and input selectors */ - camera->pad_src_view = NULL; - camera->pad_view_src = NULL; - camera->pad_src_img = NULL; - camera->pad_view_img = NULL; - camera->pad_src_vid = NULL; - camera->pad_view_vid = NULL; - camera->srcpad_zoom_filter = NULL; - - /* source elements */ - camera->src_vid_src = NULL; - camera->src_filter = NULL; - camera->src_zoom_crop = NULL; - camera->src_zoom_scale = NULL; - camera->src_zoom_filter = NULL; - camera->src_out_sel = NULL; - - camera->user_vf_sink = NULL; - - /* image capture bin */ - camera->imgbin = g_object_new (GST_TYPE_CAMERABIN_IMAGE, NULL); - gst_object_ref (camera->imgbin); - - /* video capture bin */ - camera->vidbin = g_object_new (GST_TYPE_CAMERABIN_VIDEO, NULL); - gst_object_ref (camera->vidbin); - - camera->active_bin = NULL; - - /* view finder elements */ - camera->view_in_sel = NULL; - camera->view_scale = NULL; - camera->view_sink = NULL; -} - -static void -gst_camerabin_dispose (GObject * object) -{ - GstCameraBin *camera; - - camera = GST_CAMERABIN (object); - - GST_DEBUG_OBJECT (camera, "disposing"); - - gst_element_set_state (camera->imgbin, GST_STATE_NULL); - gst_object_unref (camera->imgbin); - - gst_element_set_state (camera->vidbin, GST_STATE_NULL); - gst_object_unref (camera->vidbin); - - camerabin_destroy_elements (camera); - - camerabin_dispose_elements (camera); - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -gst_camerabin_finalize (GObject * object) -{ - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_camerabin_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstCameraBin *camera = GST_CAMERABIN (object); - - switch (prop_id) { - case ARG_MUTE: - gst_camerabin_video_set_mute (GST_CAMERABIN_VIDEO (camera->vidbin), - g_value_get_boolean (value)); - break; - case ARG_ZOOM: - g_atomic_int_set (&camera->zoom, g_value_get_int (value)); - gst_camerabin_setup_zoom (camera); - break; - case ARG_MODE: - gst_camerabin_change_mode (camera, g_value_get_enum (value)); - break; - case ARG_FILENAME: - gst_camerabin_change_filename (camera, g_value_get_string (value)); - break; - case ARG_VIDEO_POST: - if (GST_STATE (camera->vidbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera, - "can't use set element until next video bin NULL to READY state change"); - } - gst_camerabin_video_set_post (GST_CAMERABIN_VIDEO (camera->vidbin), - g_value_get_object (value)); - break; - case ARG_VIDEO_ENC: - if (GST_STATE (camera->vidbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera, - "can't use set element until next video bin NULL to READY state change"); - } - gst_camerabin_video_set_video_enc (GST_CAMERABIN_VIDEO (camera->vidbin), - g_value_get_object (value)); - break; - case ARG_AUDIO_ENC: - if (GST_STATE (camera->vidbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera, - "can't use set element until next video bin NULL to READY state change"); - } - gst_camerabin_video_set_audio_enc (GST_CAMERABIN_VIDEO (camera->vidbin), - g_value_get_object (value)); - break; - case ARG_VIDEO_MUX: - if (GST_STATE (camera->vidbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera->vidbin, - "can't use set element until next video bin NULL to READY state change"); - } - gst_camerabin_video_set_muxer (GST_CAMERABIN_VIDEO (camera->vidbin), - g_value_get_object (value)); - break; - case ARG_IMAGE_POST: - if (GST_STATE (camera->imgbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera, - "can't use set element until next image bin NULL to READY state change"); - } - gst_camerabin_image_set_postproc (GST_CAMERABIN_IMAGE (camera->imgbin), - g_value_get_object (value)); - break; - case ARG_IMAGE_ENC: - if (GST_STATE (camera->imgbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera, - "can't use set element until next image bin NULL to READY state change"); - } - gst_camerabin_image_set_encoder (GST_CAMERABIN_IMAGE (camera->imgbin), - g_value_get_object (value)); - break; - case ARG_VF_SINK: - if (GST_STATE (camera) != GST_STATE_NULL) { - GST_ELEMENT_ERROR (camera, CORE, FAILED, - ("camerabin must be in NULL state when setting the view finder element"), - (NULL)); - } else { - if (camera->user_vf_sink) - gst_object_unref (camera->user_vf_sink); - camera->user_vf_sink = g_value_get_object (value); - gst_object_ref (camera->user_vf_sink); - } - break; - case ARG_VIDEO_SRC: - if (GST_STATE (camera) != GST_STATE_NULL) { - GST_ELEMENT_ERROR (camera, CORE, FAILED, - ("camerabin must be in NULL state when setting the video source element"), - (NULL)); - } else { - if (camera->user_vid_src) - gst_object_unref (camera->user_vid_src); - camera->user_vid_src = g_value_get_object (value); - gst_object_ref (camera->user_vid_src); - } - break; - case ARG_AUDIO_SRC: - if (GST_STATE (camera->vidbin) != GST_STATE_NULL) { - GST_WARNING_OBJECT (camera, - "can't use set element until next video bin NULL to READY state change"); - } - gst_camerabin_video_set_audio_src (GST_CAMERABIN_VIDEO (camera->vidbin), - g_value_get_object (value)); - break; - case ARG_FILTER_CAPS: - GST_OBJECT_LOCK (camera); - if (camera->view_finder_caps) { - gst_caps_unref (camera->view_finder_caps); - } - camera->view_finder_caps = gst_caps_copy (gst_value_get_caps (value)); - GST_OBJECT_UNLOCK (camera); - gst_camerabin_set_capsfilter_caps (camera, camera->view_finder_caps); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gst_camerabin_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec) -{ - GstCameraBin *camera = GST_CAMERABIN (object); - - switch (prop_id) { - case ARG_FILENAME: - g_value_set_string (value, camera->filename->str); - break; - case ARG_MODE: - g_value_set_enum (value, camera->mode); - break; - case ARG_MUTE: - g_value_set_boolean (value, - gst_camerabin_video_get_mute (GST_CAMERABIN_VIDEO (camera->vidbin))); - break; - case ARG_ZOOM: - g_value_set_int (value, g_atomic_int_get (&camera->zoom)); - break; - case ARG_IMAGE_POST: - g_value_set_object (value, - gst_camerabin_image_get_postproc (GST_CAMERABIN_IMAGE - (camera->imgbin))); - break; - case ARG_IMAGE_ENC: - g_value_set_object (value, - gst_camerabin_image_get_encoder (GST_CAMERABIN_IMAGE - (camera->imgbin))); - break; - case ARG_VIDEO_POST: - g_value_set_object (value, - gst_camerabin_video_get_post (GST_CAMERABIN_VIDEO (camera->vidbin))); - break; - case ARG_VIDEO_ENC: - g_value_set_object (value, - gst_camerabin_video_get_video_enc (GST_CAMERABIN_VIDEO - (camera->vidbin))); - break; - case ARG_AUDIO_ENC: - g_value_set_object (value, - gst_camerabin_video_get_audio_enc (GST_CAMERABIN_VIDEO - (camera->vidbin))); - break; - case ARG_VIDEO_MUX: - g_value_set_object (value, - gst_camerabin_video_get_muxer (GST_CAMERABIN_VIDEO (camera->vidbin))); - break; - case ARG_VF_SINK: - g_value_set_object (value, camera->user_vf_sink); - break; - case ARG_VIDEO_SRC: - g_value_set_object (value, camera->src_vid_src); - break; - case ARG_AUDIO_SRC: - g_value_set_object (value, - gst_camerabin_video_get_audio_src (GST_CAMERABIN_VIDEO - (camera->vidbin))); - break; - case ARG_INPUT_CAPS: - gst_value_set_caps (value, gst_camerabin_get_allowed_input_caps (camera)); - break; - case ARG_FILTER_CAPS: - gst_value_set_caps (value, camera->view_finder_caps); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* - * GstElement functions implementation - */ - -static GstStateChangeReturn -gst_camerabin_change_state (GstElement * element, GstStateChange transition) -{ - GstCameraBin *camera = GST_CAMERABIN (element); - GstStateChangeReturn ret; - - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - if (!camerabin_create_elements (camera)) { - ret = GST_STATE_CHANGE_FAILURE; - goto done; - } - /* Lock to control image and video bin state separately - from view finder */ - gst_element_set_locked_state (camera->imgbin, TRUE); - gst_element_set_locked_state (camera->vidbin, TRUE); - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - camerabin_setup_src_elements (camera); - break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - /* If using autovideosink, set view finder sink properties - now that actual sink has been created. */ - camerabin_setup_view_elements (camera); - break; - case GST_STATE_CHANGE_READY_TO_NULL: - gst_element_set_locked_state (camera->imgbin, FALSE); - gst_element_set_locked_state (camera->vidbin, FALSE); - break; - default: - break; - } - - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - case GST_STATE_CHANGE_PAUSED_TO_READY: - GST_LOG_OBJECT (camera, "PAUSED to READY"); - g_mutex_lock (camera->capture_mutex); - if (camera->capturing) { - GST_WARNING_OBJECT (camera, "was capturing when changing to READY"); - camera->capturing = FALSE; - /* Reset capture and don't wait for capturing to finish properly. - Proper capturing should have been finished before going to READY. */ - gst_camerabin_reset_to_view_finder (camera); - g_cond_signal (camera->cond); - } - g_mutex_unlock (camera->capture_mutex); - break; - case GST_STATE_CHANGE_READY_TO_NULL: - camerabin_destroy_elements (camera); - break; - default: - break; - } - -done: - - return ret; -} - -/* - * GstBin functions implementation - */ - -/* Peek eos messages but don't interfere with bin msg handling */ -static void -gst_camerabin_handle_message_func (GstBin * bin, GstMessage * msg) -{ - GstCameraBin *camera = GST_CAMERABIN (bin); - - switch (GST_MESSAGE_TYPE (msg)) { - case GST_MESSAGE_EOS: - if (GST_MESSAGE_SRC (msg) == GST_OBJECT (camera->vidbin)) { - /* Video eos */ - GST_DEBUG_OBJECT (camera, - "got video eos message, stopping video capture"); - g_mutex_lock (camera->capture_mutex); - camera->capturing = FALSE; - g_cond_signal (camera->cond); - g_mutex_unlock (camera->capture_mutex); - } else if (GST_MESSAGE_SRC (msg) == GST_OBJECT (camera->imgbin)) { - /* Image eos */ - GST_DEBUG_OBJECT (camera, "got image eos message"); - /* Unblock pad to process next buffer */ - gst_pad_set_blocked_async (camera->pad_src_img, FALSE, - (GstPadBlockCallback) image_pad_blocked, camera); - } - break; - default: - break; - } - GST_BIN_CLASS (parent_class)->handle_message (bin, msg); -} - -/* - * Action signal function implementation - */ - -static void -gst_camerabin_user_start (GstCameraBin * camera) -{ - - GST_INFO_OBJECT (camera, "starting capture"); - if (camera->paused) { - gst_camerabin_user_pause (camera); - return; - } - - if (!camera->active_bin) { - GST_INFO_OBJECT (camera, "mode not explicitly set by application"); - gst_camerabin_change_mode (camera, camera->mode); - } - - if (g_str_equal (camera->filename->str, "")) { - GST_ELEMENT_ERROR (camera, CORE, FAILED, - ("set filename before starting capture"), (NULL)); - return; - } - - g_mutex_lock (camera->capture_mutex); - if (camera->capturing) { - GST_WARNING_OBJECT (camera, "capturing \"%s\" ongoing, set new filename", - camera->filename->str); - g_mutex_unlock (camera->capture_mutex); - return; - } - g_mutex_unlock (camera->capture_mutex); - - g_object_set (G_OBJECT (camera->active_bin), "filename", - camera->filename->str, NULL); - - if (camera->active_bin == camera->imgbin) { - gst_camerabin_start_image_capture (camera); - } else if (camera->active_bin == camera->vidbin) { - gst_camerabin_start_video_recording (camera); - } -} - -static void -gst_camerabin_user_stop (GstCameraBin * camera) -{ - GST_INFO_OBJECT (camera, "stopping %s capture", - camera->mode ? "video" : "image"); - gst_camerabin_do_stop (camera); - gst_camerabin_reset_to_view_finder (camera); -} - -static void -gst_camerabin_user_pause (GstCameraBin * camera) -{ - if (camera->active_bin == camera->vidbin) { - if (!camera->paused) { - GST_INFO_OBJECT (camera, "pausing capture"); - - /* Bring all camerabin elements to PAUSED */ - gst_element_set_locked_state (camera->vidbin, FALSE); - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PAUSED); - - /* Switch to view finder mode */ - g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", FALSE, - "active-pad", camera->pad_src_view, NULL); - - /* Enable view finder mode in v4l2camsrc */ - if (g_object_class_find_property (G_OBJECT_GET_CLASS - (camera->src_vid_src), "capture-mode")) { - g_object_set (G_OBJECT (camera->src_vid_src), "capture-mode", 0, NULL); - } - - /* Set view finder to PLAYING and leave videobin PAUSED */ - gst_element_set_locked_state (camera->vidbin, TRUE); - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING); - - camera->paused = TRUE; - } else { - GST_INFO_OBJECT (camera, "unpausing capture"); - - /* Bring all camerabin elements to PAUSED */ - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PAUSED); - - /* Switch to video recording mode */ - g_object_set (G_OBJECT (camera->src_out_sel), "resend-latest", TRUE, - "active-pad", camera->pad_src_vid, NULL); - - /* Enable video recording mode in v4l2camsrc */ - if (g_object_class_find_property (G_OBJECT_GET_CLASS - (camera->src_vid_src), "capture-mode")) { - g_object_set (G_OBJECT (camera->src_vid_src), "capture-mode", 2, NULL); - } - - /* Bring all camerabin elements to PLAYING */ - gst_element_set_locked_state (camera->vidbin, FALSE); - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING); - gst_element_set_locked_state (camera->vidbin, TRUE); - - camera->paused = FALSE; - } - GST_DEBUG_OBJECT (camera, "pause done"); - } else { - GST_WARNING ("pausing in image capture mode disabled"); - } -} - -static void -gst_camerabin_user_res_fps (GstCameraBin * camera, gint width, gint height, - gint fps_n, gint fps_d) -{ - GstState state; - - GST_INFO_OBJECT (camera, "switching resolution to %dx%d and fps to %d/%d", - width, height, fps_n, fps_d); - - state = GST_STATE (camera); - gst_element_set_state (GST_ELEMENT (camera), GST_STATE_READY); - camera->width = width; - camera->height = height; - camera->fps_n = fps_n; - camera->fps_d = fps_d; - gst_element_set_state (GST_ELEMENT (camera), state); -} - -static void -gst_camerabin_user_image_res (GstCameraBin * camera, gint width, gint height) -{ - GstStructure *structure; - GstCaps *new_caps = NULL; - guint32 format = 0; - - g_return_if_fail (camera != NULL); - - if (width && height && camera->view_finder_caps) { - /* Use view finder mode caps as a basis */ - structure = gst_caps_get_structure (camera->view_finder_caps, 0); - - /* Set new resolution for image capture */ - new_caps = gst_caps_new_simple (gst_structure_get_name (structure), - "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL); - - /* Set format according to current videosrc format */ - format = get_srcpad_current_format (camera->src_vid_src); - if (format) { - gst_caps_set_simple (new_caps, "format", GST_TYPE_FOURCC, format, NULL); - } - - /* Set allowed framerate for the resolution. */ - gst_camerabin_set_allowed_framerate (camera, new_caps); - - /* Reset the format to match with view finder mode caps */ - if (gst_structure_get_fourcc (structure, "format", &format)) { - gst_caps_set_simple (new_caps, "format", GST_TYPE_FOURCC, format, NULL); - } - } - - GST_INFO_OBJECT (camera, - "init filter caps for image capture %" GST_PTR_FORMAT, new_caps); - gst_caps_replace (&camera->image_capture_caps, new_caps); -} - -/* entry point to initialize the plug-in - * initialize the plug-in itself - * register the element factories and pad templates - * register the features - */ -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (gst_camerabin_debug, "camerabin", 0, "CameraBin"); - - return gst_element_register (plugin, "camerabin", - GST_RANK_NONE, GST_TYPE_CAMERABIN); -} - -/* this is the structure that gstreamer looks for to register plugins - */ -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "camerabin", - "High level api for DC (Digital Camera) application", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabin.h --- a/gst_plugins_good/gst/camerabin/gstcamerabin.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_CAMERABIN_H__ -#define __GST_CAMERABIN_H__ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include - -#include "camerabinimage.h" -#include "camerabinvideo.h" - -G_BEGIN_DECLS - -/* #defines don't like whitespacey bits */ -#define GST_TYPE_CAMERABIN \ - (gst_camerabin_get_type()) -#define GST_CAMERABIN(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAMERABIN,GstCameraBin)) -#define GST_CAMERABIN_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAMERABIN,GstCameraBinClass)) -#define GST_IS_CAMERABIN(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAMERABIN)) -#define GST_IS_CAMERABIN_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAMERABIN)) - -typedef struct _GstCameraBin GstCameraBin; -typedef struct _GstCameraBinClass GstCameraBinClass; - -/** - * GstCameraBin: - * - * The opaque #GstCameraBin structure. - */ - -struct _GstCameraBin -{ - GstPipeline parent; - - /* private */ - GString *filename; - gint mode; /* MODE_IMAGE or MODE_VIDEO */ - guint num_img_buffers; /* no of image buffers captured */ - gboolean stop_requested; /* TRUE if capturing stop needed */ - gboolean paused; /* TRUE if capturing paused */ - - /* resolution and frames per second of image captured by v4l2 device */ - gint width; - gint height; - gint fps_n; - gint fps_d; - - /* Caps applied to capsfilters when taking still image */ - GstCaps *image_capture_caps; - - /* Caps applied to capsfilters when in view finder mode */ - GstCaps *view_finder_caps; - - /* Caps that videosrc supports */ - GstCaps *allowed_caps; - - /* The digital zoom (from 100% to 1000%) */ - gint zoom; - - /* concurrency control */ - GMutex *capture_mutex; - GCond *cond; - gboolean capturing; - - /* pad names for output and input selectors */ - GstPad *pad_src_view; - GstPad *pad_view_src; - GstPad *pad_src_img; - GstPad *pad_view_img; - GstPad *pad_src_vid; - GstPad *pad_view_vid; - - GstPad *srcpad_zoom_filter; - - GstElement *imgbin; /* bin that holds image capturing elements */ - GstElement *vidbin; /* bin that holds video capturing elements */ - GstElement *active_bin; /* image or video bin that is currently in use */ - - /* source elements */ - GstElement *src_vid_src; - GstElement *src_filter; - GstElement *src_zoom_crop; - GstElement *src_zoom_scale; - GstElement *src_zoom_filter; - GstElement *src_out_sel; - - /* view finder elements */ - GstElement *view_in_sel; - GstElement *view_scale; - GstElement *view_sink; - - /* User configurable elements */ - GstElement *user_vid_src; - GstElement *user_vf_sink; - - /* Night mode handling */ - gboolean night_mode; - gint pre_night_fps_n; - gint pre_night_fps_d; -}; - -/** - * GstCameraBinClass: - * - * The #GstCameraBin class structure. - */ -struct _GstCameraBinClass -{ - GstPipelineClass parent_class; - - /* action signals */ - - void (*user_start) (GstCameraBin * camera); - void (*user_stop) (GstCameraBin * camera); - void (*user_pause) (GstCameraBin * camera); - void (*user_res_fps) (GstCameraBin * camera, gint width, gint height, - gint fps_n, gint fps_d); - void (*user_image_res) (GstCameraBin * camera, gint width, gint height); - - /* signals (callback) */ - - gboolean (*img_done) (GstCameraBin * camera, GString * filename); -}; - -/** - * GstCameraBinMode: - * @MODE_IMAGE: image capture - * @MODE_VIDEO: video capture - * - * Capture mode to use. - */ -typedef enum -{ - MODE_IMAGE = 0, - MODE_VIDEO -} GstCameraBinMode; - -#ifdef __SYMBIAN32__ -IMPORT_C -#endif -GType gst_camerabin_get_type (void); - -G_END_DECLS - -#endif /* #ifndef __GST_CAMERABIN_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabincolorbalance.c --- a/gst_plugins_good/gst/camerabin/gstcamerabincolorbalance.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Includes - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "gstcamerabincolorbalance.h" -#include "gstcamerabin.h" - -/* - * static functions implementation - */ - -static const GList * -gst_camerabin_color_balance_list_channels (GstColorBalance * cb) -{ - if (cb && GST_CAMERABIN (cb)->src_vid_src) { - GstColorBalance *cbl = GST_COLOR_BALANCE (GST_CAMERABIN (cb)->src_vid_src); - return gst_color_balance_list_channels (cbl); - } else { - return NULL; - } -} - -static void -gst_camerabin_color_balance_set_value (GstColorBalance * cb, - GstColorBalanceChannel * channel, gint value) -{ - if (cb && GST_CAMERABIN (cb)->src_vid_src) { - GstColorBalance *cbl = GST_COLOR_BALANCE (GST_CAMERABIN (cb)->src_vid_src); - gst_color_balance_set_value (cbl, channel, value); - } -} - -static gint -gst_camerabin_color_balance_get_value (GstColorBalance * cb, - GstColorBalanceChannel * channel) -{ - if (cb && GST_CAMERABIN (cb)->src_vid_src) { - GstColorBalance *cbl = GST_COLOR_BALANCE (GST_CAMERABIN (cb)->src_vid_src); - return gst_color_balance_get_value (cbl, channel); - } else { - return 0; - } -} - -/* - * extern functions implementation - */ - -void -gst_camerabin_color_balance_init (GstColorBalanceClass * iface) -{ - /* FIXME: to get the same type as v4l2src */ - GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_HARDWARE; - iface->list_channels = gst_camerabin_color_balance_list_channels; - iface->set_value = gst_camerabin_color_balance_set_value; - iface->get_value = gst_camerabin_color_balance_get_value; -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabincolorbalance.h --- a/gst_plugins_good/gst/camerabin/gstcamerabincolorbalance.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_CAMERA_COLOR_BALANCE_H__ -#define __GST_CAMERA_COLOR_BALANCE_H__ - -#include - -extern void gst_camerabin_color_balance_init (GstColorBalanceClass * iface); - -#endif /* #ifndef __GST_CAMERA_COLOR_BALANCE_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabinphotography.c --- a/gst_plugins_good/gst/camerabin/gstcamerabinphotography.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,222 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * Photography interface implementation for camerabin. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "gstcamerabinphotography.h" -#include "gstcamerabin.h" - -GST_DEBUG_CATEGORY_STATIC (camerabinphoto_debug); -#define GST_CAT_DEFAULT camerabinphoto_debug - -#define PHOTOGRAPHY_IS_OK(photo_elem) (GST_IS_ELEMENT (photo_elem) && \ - gst_element_implements_interface (photo_elem, GST_TYPE_PHOTOGRAPHY)) - -#define GST_PHOTOGRAPHY_IMPL_TEMPLATE(function_name, param_type) \ -static gboolean \ -gst_camerabin_set_ ## function_name (GstPhotography *photo, param_type param) \ -{ \ - GstCameraBin *camera; \ - gboolean ret = FALSE; \ - g_return_val_if_fail (photo != NULL, FALSE); \ - camera = GST_CAMERABIN (photo); \ - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { \ - ret = gst_photography_set_ ## function_name (GST_PHOTOGRAPHY (camera->src_vid_src), param); \ - } \ - return ret; \ -} \ -static gboolean \ -gst_camerabin_get_ ## function_name (GstPhotography *photo, param_type * param) \ -{ \ - GstCameraBin *camera; \ - gboolean ret = FALSE; \ - g_return_val_if_fail (photo != NULL, FALSE); \ - camera = GST_CAMERABIN (photo); \ - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { \ - ret = gst_photography_get_ ## function_name (GST_PHOTOGRAPHY (camera->src_vid_src), param); \ - } \ - return ret; \ -} - -GST_PHOTOGRAPHY_IMPL_TEMPLATE (ev_compensation, gfloat); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (iso_speed, guint); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (white_balance_mode, GstWhiteBalanceMode); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (colour_tone_mode, GstColourToneMode); -GST_PHOTOGRAPHY_IMPL_TEMPLATE (flash_mode, GstFlashMode); - -static gboolean -gst_camerabin_set_zoom (GstPhotography * photo, gfloat zoom) -{ - GstCameraBin *camera; - - g_return_val_if_fail (photo != NULL, FALSE); - - camera = GST_CAMERABIN (photo); - - /* camerabin can zoom by itself */ - g_object_set (camera, "zoom", (gint) (CLAMP (zoom, 1.0, 10.0) * 100), NULL); - - return TRUE; -} - -static gboolean -gst_camerabin_get_zoom (GstPhotography * photo, gfloat * zoom) -{ - GstCameraBin *camera; - gint cb_zoom = 0; - - g_return_val_if_fail (photo != NULL, FALSE); - - camera = GST_CAMERABIN (photo); - - g_object_get (camera, "zoom", &cb_zoom, NULL); - *zoom = (gfloat) (cb_zoom / 100.0); - - return TRUE; -} - -static gboolean -gst_camerabin_set_scene_mode (GstPhotography * photo, GstSceneMode scene_mode) -{ - GstCameraBin *camera; - gboolean ret = FALSE; - - g_return_val_if_fail (photo != NULL, FALSE); - - camera = GST_CAMERABIN (photo); - - if (scene_mode == GST_PHOTOGRAPHY_SCENE_MODE_NIGHT) { - GST_DEBUG ("enabling night mode, lowering fps"); - /* Make camerabin select the lowest allowed frame rate */ - camera->night_mode = TRUE; - /* Remember frame rate before setting night mode */ - camera->pre_night_fps_n = camera->fps_n; - camera->pre_night_fps_d = camera->fps_d; - g_signal_emit_by_name (camera, "user-res-fps", camera->width, - camera->height, 0, 0, 0); - } else { - if (camera->night_mode) { - GST_DEBUG ("disabling night mode, restoring fps to %d/%d", - camera->pre_night_fps_n, camera->pre_night_fps_d); - camera->night_mode = FALSE; - g_signal_emit_by_name (camera, "user-res-fps", camera->width, - camera->height, camera->pre_night_fps_n, camera->pre_night_fps_d, 0); - } - } - - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { - ret = gst_photography_set_scene_mode (GST_PHOTOGRAPHY (camera->src_vid_src), - scene_mode); - } - return ret; -} - -static gboolean -gst_camerabin_get_scene_mode (GstPhotography * photo, GstSceneMode * scene_mode) -{ - GstCameraBin *camera; - gboolean ret = FALSE; - - g_return_val_if_fail (photo != NULL, FALSE); - - camera = GST_CAMERABIN (photo); - - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { - ret = gst_photography_get_scene_mode (GST_PHOTOGRAPHY (camera->src_vid_src), - scene_mode); - } - return ret; -} - -static GstPhotoCaps -gst_camerabin_get_capabilities (GstPhotography * photo) -{ - GstCameraBin *camera; - /* camerabin can zoom by itself */ - GstPhotoCaps pcaps = GST_PHOTOGRAPHY_CAPS_ZOOM; - - g_return_val_if_fail (photo != NULL, FALSE); - - camera = GST_CAMERABIN (photo); - - if (GST_IS_ELEMENT (camera->src_vid_src) && - gst_element_implements_interface (camera->src_vid_src, - GST_TYPE_PHOTOGRAPHY)) { - GstPhotography *p2 = GST_PHOTOGRAPHY (camera->src_vid_src); - pcaps |= gst_photography_get_capabilities (p2); - } - - return pcaps; -} - -static void -gst_camerabin_set_autofocus (GstPhotography * photo, gboolean on) -{ - GstCameraBin *camera; - - g_return_if_fail (photo != NULL); - - camera = GST_CAMERABIN (photo); - - GST_DEBUG_OBJECT (camera, "setting autofocus %s", on ? "ON" : "OFF"); - - if (PHOTOGRAPHY_IS_OK (camera->src_vid_src)) { - gst_photography_set_autofocus (GST_PHOTOGRAPHY (camera->src_vid_src), on); - } -} - - -void -gst_camerabin_photography_init (GstPhotographyInterface * iface) -{ - GST_DEBUG_CATEGORY_INIT (camerabinphoto_debug, "camerabinphoto", 0, - "Camerabin photography interface debugging"); - - GST_INFO ("initing"); - - iface->set_ev_compensation = gst_camerabin_set_ev_compensation; - iface->get_ev_compensation = gst_camerabin_get_ev_compensation; - - iface->set_iso_speed = gst_camerabin_set_iso_speed; - iface->get_iso_speed = gst_camerabin_get_iso_speed; - - iface->set_white_balance_mode = gst_camerabin_set_white_balance_mode; - iface->get_white_balance_mode = gst_camerabin_get_white_balance_mode; - - iface->set_colour_tone_mode = gst_camerabin_set_colour_tone_mode; - iface->get_colour_tone_mode = gst_camerabin_get_colour_tone_mode; - - iface->set_scene_mode = gst_camerabin_set_scene_mode; - iface->get_scene_mode = gst_camerabin_get_scene_mode; - - iface->set_flash_mode = gst_camerabin_set_flash_mode; - iface->get_flash_mode = gst_camerabin_get_flash_mode; - - iface->set_zoom = gst_camerabin_set_zoom; - iface->get_zoom = gst_camerabin_get_zoom; - - iface->get_capabilities = gst_camerabin_get_capabilities; - - iface->set_autofocus = gst_camerabin_set_autofocus; -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabinphotography.h --- a/gst_plugins_good/gst/camerabin/gstcamerabinphotography.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * Photography interface implementation for camerabin - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_CAMERABIN_PHOTOGRAPHY_H__ -#define __GST_CAMERABIN_PHOTOGRAPHY_H__ - -#include - -void gst_camerabin_photography_init (GstPhotographyInterface * iface); - -#endif /* #ifndef __GST_CAMERABIN_PHOTOGRAPHY_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabinxoverlay.c --- a/gst_plugins_good/gst/camerabin/gstcamerabinxoverlay.c Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Includes - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "gstcamerabinxoverlay.h" -#include "gstcamerabin.h" - -/* - * static functions implementation - */ - -static void -gst_camerabin_expose (GstXOverlay * overlay) -{ - if (overlay && GST_CAMERABIN (overlay)->view_sink) { - GstXOverlay *xoverlay = GST_X_OVERLAY (GST_CAMERABIN (overlay)->view_sink); - gst_x_overlay_expose (xoverlay); - } -} - -static void -gst_camerabin_set_xwindow_id (GstXOverlay * overlay, gulong xwindow_id) -{ - if (overlay && GST_CAMERABIN (overlay)->view_sink) { - GstXOverlay *xoverlay = GST_X_OVERLAY (GST_CAMERABIN (overlay)->view_sink); - gst_x_overlay_set_xwindow_id (xoverlay, xwindow_id); - } -} - -static void -gst_camerabin_set_event_handling (GstXOverlay * overlay, gboolean handle_events) -{ - if (overlay && GST_CAMERABIN (overlay)->view_sink) { - GstXOverlay *xoverlay = GST_X_OVERLAY (GST_CAMERABIN (overlay)->view_sink); - gst_x_overlay_handle_events (xoverlay, handle_events); - } -} - -/* - * extern functions implementation - */ - -void -gst_camerabin_xoverlay_init (GstXOverlayClass * iface) -{ - iface->set_xwindow_id = gst_camerabin_set_xwindow_id; - iface->expose = gst_camerabin_expose; - iface->handle_events = gst_camerabin_set_event_handling; -} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/camerabin/gstcamerabinxoverlay.h --- a/gst_plugins_good/gst/camerabin/gstcamerabinxoverlay.h Fri Jun 11 16:24:58 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - * GStreamer - * Copyright (C) 2008 Nokia Corporation - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_CAMERAXOVERLAY_H__ -#define __GST_CAMERAXOVERLAY_H__ - -#include - -extern void gst_camerabin_xoverlay_init (GstXOverlayClass * iface); - -#endif /* #ifndef __GST_CAMERAXOVERLAY_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/mpegaudioparse/gstmpegaudioparse.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/gst/mpegaudioparse/gstmpegaudioparse.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,2199 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006-2007> Jan Schmidt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include + +#include "gstmpegaudioparse.h" + +GST_DEBUG_CATEGORY_STATIC (mp3parse_debug); +#define GST_CAT_DEFAULT mp3parse_debug + +#define MP3_CHANNEL_MODE_UNKNOWN -1 +#define MP3_CHANNEL_MODE_STEREO 0 +#define MP3_CHANNEL_MODE_JOINT_STEREO 1 +#define MP3_CHANNEL_MODE_DUAL_CHANNEL 2 +#define MP3_CHANNEL_MODE_MONO 3 + +#define CRC_UNKNOWN -1 +#define CRC_PROTECTED 0 +#define CRC_NOT_PROTECTED 1 + +#define XING_FRAMES_FLAG 0x0001 +#define XING_BYTES_FLAG 0x0002 +#define XING_TOC_FLAG 0x0004 +#define XING_VBR_SCALE_FLAG 0x0008 + +#ifndef GST_READ_UINT24_BE +#define GST_READ_UINT24_BE(p) (p[2] | (p[1] << 8) | (p[0] << 16)) +#endif + +/* Minimum number of consecutive, valid-looking frames to consider + for resyncing */ +#define MIN_RESYNC_FRAMES 3 + +static inline MPEGAudioSeekEntry * +mpeg_audio_seek_entry_new () +{ + return g_slice_new (MPEGAudioSeekEntry); +} + +static inline void +mpeg_audio_seek_entry_free (MPEGAudioSeekEntry * entry) +{ + g_slice_free (MPEGAudioSeekEntry, entry); +} + +/* elementfactory information */ +static GstElementDetails mp3parse_details = { + "MPEG1 Audio Parser", + "Codec/Parser/Audio", + "Parses and frames mpeg1 audio streams (levels 1-3), provides seek", + "Jan Schmidt \n" + "Erik Walthinsen " +}; + +static GstStaticPadTemplate mp3_src_template = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "rate = (int) [ 8000, 48000 ], channels = (int) [ 1, 2 ]," + "parsed=(boolean) true") + ); + +static GstStaticPadTemplate mp3_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, mpegversion = (int) 1, parsed=(boolean)false") + ); + +/* GstMPEGAudioParse signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + ARG_0, + ARG_SKIP, + ARG_BIT_RATE + /* FILL ME */ +}; + + +static void gst_mp3parse_class_init (GstMPEGAudioParseClass * klass); +static void gst_mp3parse_base_init (gpointer klass); +static void gst_mp3parse_init (GstMPEGAudioParse * mp3parse, + GstMPEGAudioParseClass * klass); + +static gboolean gst_mp3parse_sink_event (GstPad * pad, GstEvent * event); +static GstFlowReturn gst_mp3parse_chain (GstPad * pad, GstBuffer * buffer); +static gboolean mp3parse_src_query (GstPad * pad, GstQuery * query); +static const GstQueryType *mp3parse_get_query_types (GstPad * pad); +static gboolean mp3parse_src_event (GstPad * pad, GstEvent * event); + +static int head_check (GstMPEGAudioParse * mp3parse, unsigned long head); + +static void gst_mp3parse_dispose (GObject * object); +static void gst_mp3parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_mp3parse_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); +static GstStateChangeReturn gst_mp3parse_change_state (GstElement * element, + GstStateChange transition); +static GstFlowReturn +gst_mp3parse_handle_data (GstMPEGAudioParse * mp3parse, gboolean at_eos); + +static gboolean mp3parse_bytepos_to_time (GstMPEGAudioParse * mp3parse, + gint64 bytepos, GstClockTime * ts, gboolean from_total_time); +static gboolean +mp3parse_total_bytes (GstMPEGAudioParse * mp3parse, gint64 * total); +static gboolean +mp3parse_total_time (GstMPEGAudioParse * mp3parse, GstClockTime * total); + +GST_BOILERPLATE (GstMPEGAudioParse, gst_mp3parse, GstElement, GST_TYPE_ELEMENT); + +#define GST_TYPE_MP3_CHANNEL_MODE (gst_mp3_channel_mode_get_type()) + +static const GEnumValue mp3_channel_mode[] = { + {MP3_CHANNEL_MODE_UNKNOWN, "Unknown", "unknown"}, + {MP3_CHANNEL_MODE_MONO, "Mono", "mono"}, + {MP3_CHANNEL_MODE_DUAL_CHANNEL, "Dual Channel", "dual-channel"}, + {MP3_CHANNEL_MODE_JOINT_STEREO, "Joint Stereo", "joint-stereo"}, + {MP3_CHANNEL_MODE_STEREO, "Stereo", "stereo"}, + {0, NULL, NULL}, +}; + +static GType +gst_mp3_channel_mode_get_type (void) +{ + static GType mp3_channel_mode_type = 0; + + if (!mp3_channel_mode_type) { + mp3_channel_mode_type = + g_enum_register_static ("GstMp3ChannelMode", mp3_channel_mode); + } + return mp3_channel_mode_type; +} + +static const gchar * +gst_mp3_channel_mode_get_nick (gint mode) +{ + guint i; + for (i = 0; i < G_N_ELEMENTS (mp3_channel_mode); i++) { + if (mp3_channel_mode[i].value == mode) + return mp3_channel_mode[i].value_nick; + } + return NULL; +} + +static const guint mp3types_bitrates[2][3][16] = { + { + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} + }, + { + {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} + }, +}; + +static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, +{22050, 24000, 16000}, +{11025, 12000, 8000} +}; + +static inline guint +mp3_type_frame_length_from_header (GstMPEGAudioParse * mp3parse, guint32 header, + guint * put_version, guint * put_layer, guint * put_channels, + guint * put_bitrate, guint * put_samplerate, guint * put_mode, + guint * put_crc) +{ + guint length; + gulong mode, samplerate, bitrate, layer, channels, padding, crc; + gulong version; + gint lsf, mpg25; + + if (header & (1 << 20)) { + lsf = (header & (1 << 19)) ? 0 : 1; + mpg25 = 0; + } else { + lsf = 1; + mpg25 = 1; + } + + version = 1 + lsf + mpg25; + + layer = 4 - ((header >> 17) & 0x3); + + crc = (header >> 16) & 0x1; + + bitrate = (header >> 12) & 0xF; + bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; + /* The caller has ensured we have a valid header, so bitrate can't be + zero here. */ + g_assert (bitrate != 0); + + samplerate = (header >> 10) & 0x3; + samplerate = mp3types_freqs[lsf + mpg25][samplerate]; + + padding = (header >> 9) & 0x1; + + mode = (header >> 6) & 0x3; + channels = (mode == 3) ? 1 : 2; + + switch (layer) { + case 1: + length = 4 * ((bitrate * 12) / samplerate + padding); + break; + case 2: + length = (bitrate * 144) / samplerate + padding; + break; + default: + case 3: + length = (bitrate * 144) / (samplerate << lsf) + padding; + break; + } + + GST_DEBUG_OBJECT (mp3parse, "Calculated mp3 frame length of %u bytes", + length); + GST_DEBUG_OBJECT (mp3parse, "samplerate = %lu, bitrate = %lu, version = %lu, " + "layer = %lu, channels = %lu, mode = %s", samplerate, bitrate, version, + layer, channels, gst_mp3_channel_mode_get_nick (mode)); + + if (put_version) + *put_version = version; + if (put_layer) + *put_layer = layer; + if (put_channels) + *put_channels = channels; + if (put_bitrate) + *put_bitrate = bitrate; + if (put_samplerate) + *put_samplerate = samplerate; + if (put_mode) + *put_mode = mode; + if (put_crc) + *put_crc = crc; + + return length; +} + +static GstCaps * +mp3_caps_create (guint version, guint layer, guint channels, guint samplerate) +{ + GstCaps *new; + + g_assert (version); + g_assert (layer); + g_assert (samplerate); + g_assert (channels); + + new = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 1, + "mpegaudioversion", G_TYPE_INT, version, + "layer", G_TYPE_INT, layer, + "rate", G_TYPE_INT, samplerate, + "channels", G_TYPE_INT, channels, "parsed", G_TYPE_BOOLEAN, TRUE, NULL); + + return new; +} + +static void +gst_mp3parse_base_init (gpointer klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mp3_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&mp3_src_template)); + + GST_DEBUG_CATEGORY_INIT (mp3parse_debug, "mp3parse", 0, "MPEG Audio Parser"); + + gst_element_class_set_details (element_class, &mp3parse_details); +} + +static void +gst_mp3parse_class_init (GstMPEGAudioParseClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = gst_mp3parse_set_property; + gobject_class->get_property = gst_mp3parse_get_property; + gobject_class->dispose = gst_mp3parse_dispose; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SKIP, + g_param_spec_int ("skip", "skip", "skip", + G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BIT_RATE, + g_param_spec_int ("bitrate", "Bitrate", "Bit Rate", + G_MININT, G_MAXINT, 0, G_PARAM_READABLE)); + + gstelement_class->change_state = gst_mp3parse_change_state; + +/* register tags */ +#define GST_TAG_CRC "has-crc" +#define GST_TAG_MODE "channel-mode" + + gst_tag_register (GST_TAG_CRC, GST_TAG_FLAG_META, G_TYPE_BOOLEAN, + "has crc", "Using CRC", NULL); + gst_tag_register (GST_TAG_MODE, GST_TAG_FLAG_ENCODED, G_TYPE_STRING, + "channel mode", "MPEG audio channel mode", NULL); + + g_type_class_ref (GST_TYPE_MP3_CHANNEL_MODE); +} + +static void +gst_mp3parse_reset (GstMPEGAudioParse * mp3parse) +{ + mp3parse->skip = 0; + mp3parse->resyncing = TRUE; + mp3parse->next_ts = GST_CLOCK_TIME_NONE; + mp3parse->cur_offset = -1; + + mp3parse->sync_offset = 0; + mp3parse->tracked_offset = 0; + mp3parse->pending_ts = GST_CLOCK_TIME_NONE; + mp3parse->pending_offset = -1; + + gst_adapter_clear (mp3parse->adapter); + + mp3parse->rate = mp3parse->channels = mp3parse->layer = -1; + mp3parse->version = 1; + mp3parse->max_bitreservoir = GST_CLOCK_TIME_NONE; + + mp3parse->avg_bitrate = 0; + mp3parse->bitrate_sum = 0; + mp3parse->last_posted_bitrate = 0; + mp3parse->frame_count = 0; + mp3parse->sent_codec_tag = FALSE; + + mp3parse->last_posted_crc = CRC_UNKNOWN; + mp3parse->last_posted_channel_mode = MP3_CHANNEL_MODE_UNKNOWN; + + mp3parse->xing_flags = 0; + mp3parse->xing_bitrate = 0; + mp3parse->xing_frames = 0; + mp3parse->xing_total_time = 0; + mp3parse->xing_bytes = 0; + mp3parse->xing_vbr_scale = 0; + memset (mp3parse->xing_seek_table, 0, 100); + memset (mp3parse->xing_seek_table_inverse, 0, 256); + + mp3parse->vbri_bitrate = 0; + mp3parse->vbri_frames = 0; + mp3parse->vbri_total_time = 0; + mp3parse->vbri_bytes = 0; + mp3parse->vbri_seek_points = 0; + g_free (mp3parse->vbri_seek_table); + mp3parse->vbri_seek_table = NULL; + + if (mp3parse->seek_table) { + g_list_foreach (mp3parse->seek_table, (GFunc) mpeg_audio_seek_entry_free, + NULL); + g_list_free (mp3parse->seek_table); + mp3parse->seek_table = NULL; + } + + g_mutex_lock (mp3parse->pending_seeks_lock); + if (mp3parse->pending_accurate_seeks) { + g_slist_foreach (mp3parse->pending_accurate_seeks, (GFunc) g_free, NULL); + g_slist_free (mp3parse->pending_accurate_seeks); + mp3parse->pending_accurate_seeks = NULL; + } + if (mp3parse->pending_nonaccurate_seeks) { + g_slist_foreach (mp3parse->pending_nonaccurate_seeks, (GFunc) g_free, NULL); + g_slist_free (mp3parse->pending_nonaccurate_seeks); + mp3parse->pending_nonaccurate_seeks = NULL; + } + g_mutex_unlock (mp3parse->pending_seeks_lock); + + if (mp3parse->pending_segment) { + GstEvent **eventp = &mp3parse->pending_segment; + + gst_event_replace (eventp, NULL); + } + + mp3parse->exact_position = FALSE; + gst_segment_init (&mp3parse->segment, GST_FORMAT_TIME); +} + +static void +gst_mp3parse_init (GstMPEGAudioParse * mp3parse, GstMPEGAudioParseClass * klass) +{ + mp3parse->sinkpad = + gst_pad_new_from_static_template (&mp3_sink_template, "sink"); + gst_pad_set_event_function (mp3parse->sinkpad, gst_mp3parse_sink_event); + gst_pad_set_chain_function (mp3parse->sinkpad, gst_mp3parse_chain); + gst_element_add_pad (GST_ELEMENT (mp3parse), mp3parse->sinkpad); + + mp3parse->srcpad = + gst_pad_new_from_static_template (&mp3_src_template, "src"); + gst_pad_use_fixed_caps (mp3parse->srcpad); + gst_pad_set_event_function (mp3parse->srcpad, mp3parse_src_event); + gst_pad_set_query_function (mp3parse->srcpad, mp3parse_src_query); + gst_pad_set_query_type_function (mp3parse->srcpad, mp3parse_get_query_types); + gst_element_add_pad (GST_ELEMENT (mp3parse), mp3parse->srcpad); + + mp3parse->adapter = gst_adapter_new (); + mp3parse->pending_seeks_lock = g_mutex_new (); + + gst_mp3parse_reset (mp3parse); +} + +static void +gst_mp3parse_dispose (GObject * object) +{ + GstMPEGAudioParse *mp3parse = GST_MP3PARSE (object); + + gst_mp3parse_reset (mp3parse); + + if (mp3parse->adapter) { + g_object_unref (mp3parse->adapter); + mp3parse->adapter = NULL; + } + g_mutex_free (mp3parse->pending_seeks_lock); + mp3parse->pending_seeks_lock = NULL; + + g_list_foreach (mp3parse->pending_events, (GFunc) gst_mini_object_unref, + NULL); + g_list_free (mp3parse->pending_events); + mp3parse->pending_events = NULL; + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static gboolean +gst_mp3parse_sink_event (GstPad * pad, GstEvent * event) +{ + gboolean res = TRUE; + GstMPEGAudioParse *mp3parse; + GstEvent **eventp; + + mp3parse = GST_MP3PARSE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + { + gdouble rate, applied_rate; + GstFormat format; + gint64 start, stop, pos; + gboolean update; + MPEGAudioPendingAccurateSeek *seek = NULL; + GSList *node; + + gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, + &format, &start, &stop, &pos); + + g_mutex_lock (mp3parse->pending_seeks_lock); + if (format == GST_FORMAT_BYTES && mp3parse->pending_accurate_seeks) { + + for (node = mp3parse->pending_accurate_seeks; node; node = node->next) { + MPEGAudioPendingAccurateSeek *tmp = node->data; + + if (tmp->upstream_start == pos) { + seek = tmp; + break; + } + } + if (seek) { + GstSegment *s = &seek->segment; + + event = + gst_event_new_new_segment_full (FALSE, s->rate, s->applied_rate, + GST_FORMAT_TIME, s->start, s->stop, s->last_stop); + + mp3parse->segment = seek->segment; + + mp3parse->resyncing = FALSE; + mp3parse->cur_offset = pos; + mp3parse->next_ts = seek->timestamp_start; + mp3parse->pending_ts = GST_CLOCK_TIME_NONE; + mp3parse->tracked_offset = 0; + mp3parse->sync_offset = 0; + + gst_event_parse_new_segment_full (event, &update, &rate, + &applied_rate, &format, &start, &stop, &pos); + + GST_DEBUG_OBJECT (mp3parse, + "Pushing accurate newseg rate %g, applied rate %g, " + "format %d, start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT + ", pos %" G_GINT64_FORMAT, rate, applied_rate, format, start, + stop, pos); + + g_free (seek); + mp3parse->pending_accurate_seeks = + g_slist_delete_link (mp3parse->pending_accurate_seeks, node); + + g_mutex_unlock (mp3parse->pending_seeks_lock); + res = gst_pad_push_event (mp3parse->srcpad, event); + + return res; + } else { + GST_WARNING_OBJECT (mp3parse, + "Accurate seek not possible, didn't get an appropiate upstream segment"); + } + } + g_mutex_unlock (mp3parse->pending_seeks_lock); + + mp3parse->exact_position = FALSE; + + if (format == GST_FORMAT_BYTES) { + GstClockTime seg_start, seg_stop, seg_pos; + + /* stop time is allowed to be open-ended, but not start & pos */ + if (!mp3parse_bytepos_to_time (mp3parse, stop, &seg_stop, FALSE)) + seg_stop = GST_CLOCK_TIME_NONE; + if (mp3parse_bytepos_to_time (mp3parse, start, &seg_start, FALSE) && + mp3parse_bytepos_to_time (mp3parse, pos, &seg_pos, FALSE)) { + gst_event_unref (event); + + /* search the pending nonaccurate seeks */ + g_mutex_lock (mp3parse->pending_seeks_lock); + seek = NULL; + for (node = mp3parse->pending_nonaccurate_seeks; node; + node = node->next) { + MPEGAudioPendingAccurateSeek *tmp = node->data; + + if (tmp->upstream_start == pos) { + seek = tmp; + break; + } + } + + if (seek) { + if (seek->segment.stop == -1) { + /* corrent the segment end, because non-accurate seeks might make + * our streaming end earlier (see bug #603695) */ + seg_stop = -1; + } + g_free (seek); + mp3parse->pending_nonaccurate_seeks = + g_slist_delete_link (mp3parse->pending_nonaccurate_seeks, node); + } + g_mutex_unlock (mp3parse->pending_seeks_lock); + + event = gst_event_new_new_segment_full (update, rate, applied_rate, + GST_FORMAT_TIME, seg_start, seg_stop, seg_pos); + format = GST_FORMAT_TIME; + GST_DEBUG_OBJECT (mp3parse, "Converted incoming segment to TIME. " + "start = %" GST_TIME_FORMAT ", stop = %" GST_TIME_FORMAT + ", pos = %" GST_TIME_FORMAT, GST_TIME_ARGS (seg_start), + GST_TIME_ARGS (seg_stop), GST_TIME_ARGS (seg_pos)); + } + } + + if (format != GST_FORMAT_TIME) { + /* Unknown incoming segment format. Output a default open-ended + * TIME segment */ + gst_event_unref (event); + event = gst_event_new_new_segment_full (update, rate, applied_rate, + GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE, 0); + } + + mp3parse->resyncing = TRUE; + mp3parse->cur_offset = -1; + mp3parse->next_ts = GST_CLOCK_TIME_NONE; + mp3parse->pending_ts = GST_CLOCK_TIME_NONE; + mp3parse->tracked_offset = 0; + mp3parse->sync_offset = 0; + /* also clear leftover data if clearing so much state */ + gst_adapter_clear (mp3parse->adapter); + + gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, + &format, &start, &stop, &pos); + GST_DEBUG_OBJECT (mp3parse, "Pushing newseg rate %g, applied rate %g, " + "format %d, start %" G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT + ", pos %" G_GINT64_FORMAT, rate, applied_rate, format, start, stop, + pos); + + gst_segment_set_newsegment_full (&mp3parse->segment, update, rate, + applied_rate, format, start, stop, pos); + + /* save the segment for later, right before we push a new buffer so that + * the caps are fixed and the next linked element can receive the segment. */ + eventp = &mp3parse->pending_segment; + gst_event_replace (eventp, event); + gst_event_unref (event); + res = TRUE; + break; + } + case GST_EVENT_FLUSH_STOP: + /* Clear our adapter and set up for a new position */ + gst_adapter_clear (mp3parse->adapter); + eventp = &mp3parse->pending_segment; + gst_event_replace (eventp, NULL); + res = gst_pad_push_event (mp3parse->srcpad, event); + break; + case GST_EVENT_EOS: + /* If we haven't processed any frames yet, then make sure we process + at least whatever's in our adapter */ + if (mp3parse->frame_count == 0) { + gst_mp3parse_handle_data (mp3parse, TRUE); + + /* If we STILL have zero frames processed, fire an error */ + if (mp3parse->frame_count == 0) { + GST_ELEMENT_ERROR (mp3parse, STREAM, WRONG_TYPE, + ("No valid frames found before end of stream"), (NULL)); + } + } + /* fall through */ + default: + if (mp3parse->pending_segment && + (GST_EVENT_TYPE (event) != GST_EVENT_EOS) && + (GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_START)) { + /* Cache all events except EOS and the ones above if we have + * a pending segment */ + mp3parse->pending_events = + g_list_append (mp3parse->pending_events, event); + } else { + res = gst_pad_push_event (mp3parse->srcpad, event); + } + break; + } + + gst_object_unref (mp3parse); + + return res; +} + +static void +gst_mp3parse_add_index_entry (GstMPEGAudioParse * mp3parse, guint64 offset, + GstClockTime ts) +{ + MPEGAudioSeekEntry *entry, *last; + + if (G_LIKELY (mp3parse->seek_table != NULL)) { + last = mp3parse->seek_table->data; + + if (last->byte >= offset) + return; + + if (GST_CLOCK_DIFF (last->timestamp, ts) < mp3parse->idx_interval) + return; + } + + entry = mpeg_audio_seek_entry_new (); + entry->byte = offset; + entry->timestamp = ts; + mp3parse->seek_table = g_list_prepend (mp3parse->seek_table, entry); + + GST_LOG_OBJECT (mp3parse, "Adding index entry %" GST_TIME_FORMAT " @ offset " + "0x%08" G_GINT64_MODIFIER "x", GST_TIME_ARGS (ts), offset); +} + +/* Prepare a buffer of the indicated size, timestamp it and output */ +static GstFlowReturn +gst_mp3parse_emit_frame (GstMPEGAudioParse * mp3parse, guint size, + guint mode, guint crc) +{ + GstBuffer *outbuf; + guint bitrate; + GstFlowReturn ret = GST_FLOW_OK; + GstClockTime push_start; + GstTagList *taglist; + + outbuf = gst_adapter_take_buffer (mp3parse->adapter, size); + + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale (GST_SECOND, mp3parse->spf, mp3parse->rate); + + GST_BUFFER_OFFSET (outbuf) = mp3parse->cur_offset; + + /* Check if we have a pending timestamp from an incoming buffer to apply + * here */ + if (GST_CLOCK_TIME_IS_VALID (mp3parse->pending_ts)) { + if (mp3parse->tracked_offset >= mp3parse->pending_offset) { + /* If the incoming timestamp differs from our expected by more than + * half a frame, then take it instead of our calculated timestamp. + * This avoids creating imperfect streams just because of + * quantization in the container timestamping */ + GstClockTimeDiff diff = mp3parse->next_ts - mp3parse->pending_ts; + GstClockTimeDiff thresh = GST_BUFFER_DURATION (outbuf) / 2; + + if (diff < -thresh || diff > thresh) { + GST_DEBUG_OBJECT (mp3parse, "Updating next_ts from %" GST_TIME_FORMAT + " to pending ts %" GST_TIME_FORMAT + " at offset %" G_GINT64_FORMAT " (pending offset was %" + G_GINT64_FORMAT ")", GST_TIME_ARGS (mp3parse->next_ts), + GST_TIME_ARGS (mp3parse->pending_ts), mp3parse->tracked_offset, + mp3parse->pending_offset); + mp3parse->next_ts = mp3parse->pending_ts; + } + mp3parse->pending_ts = GST_CLOCK_TIME_NONE; + } + } + + /* Decide what timestamp we're going to apply */ + if (GST_CLOCK_TIME_IS_VALID (mp3parse->next_ts)) { + GST_BUFFER_TIMESTAMP (outbuf) = mp3parse->next_ts; + } else { + GstClockTime ts; + + /* No timestamp yet, convert our offset to a timestamp if we can, or + * start at 0 */ + if (mp3parse_bytepos_to_time (mp3parse, mp3parse->cur_offset, &ts, FALSE) && + GST_CLOCK_TIME_IS_VALID (ts)) + GST_BUFFER_TIMESTAMP (outbuf) = ts; + else { + GST_BUFFER_TIMESTAMP (outbuf) = 0; + } + } + + if (GST_BUFFER_TIMESTAMP (outbuf) == 0) + mp3parse->exact_position = TRUE; + + if (mp3parse->seekable && + mp3parse->exact_position && GST_BUFFER_TIMESTAMP_IS_VALID (outbuf) && + mp3parse->cur_offset != GST_BUFFER_OFFSET_NONE) { + gst_mp3parse_add_index_entry (mp3parse, mp3parse->cur_offset, + GST_BUFFER_TIMESTAMP (outbuf)); + } + + /* Update our byte offset tracking */ + if (mp3parse->cur_offset != -1) { + mp3parse->cur_offset += size; + } + mp3parse->tracked_offset += size; + + if (GST_BUFFER_TIMESTAMP_IS_VALID (outbuf)) + mp3parse->next_ts = + GST_BUFFER_TIMESTAMP (outbuf) + GST_BUFFER_DURATION (outbuf); + + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mp3parse->srcpad)); + + /* Post a bitrate tag if we need to before pushing the buffer */ + if (mp3parse->xing_bitrate != 0) + bitrate = mp3parse->xing_bitrate; + else if (mp3parse->vbri_bitrate != 0) + bitrate = mp3parse->vbri_bitrate; + else + bitrate = mp3parse->avg_bitrate; + + /* we will create a taglist (if any of the parameters has changed) + * to add the tags that changed */ + taglist = NULL; + if ((mp3parse->last_posted_bitrate / 10000) != (bitrate / 10000)) { + taglist = gst_tag_list_new (); + mp3parse->last_posted_bitrate = bitrate; + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE, + mp3parse->last_posted_bitrate, NULL); + + /* Post a new duration message if the average bitrate changes that much + * so applications can update their cached values + */ + if ((mp3parse->xing_flags & XING_TOC_FLAG) == 0 + && mp3parse->vbri_total_time == 0) { + gst_element_post_message (GST_ELEMENT (mp3parse), + gst_message_new_duration (GST_OBJECT (mp3parse), GST_FORMAT_TIME, + -1)); + } + } + + if (mp3parse->last_posted_crc != crc) { + gboolean using_crc; + + if (!taglist) { + taglist = gst_tag_list_new (); + } + mp3parse->last_posted_crc = crc; + if (mp3parse->last_posted_crc == CRC_PROTECTED) { + using_crc = TRUE; + } else { + using_crc = FALSE; + } + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_CRC, + using_crc, NULL); + } + + if (mp3parse->last_posted_channel_mode != mode) { + if (!taglist) { + taglist = gst_tag_list_new (); + } + mp3parse->last_posted_channel_mode = mode; + + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_MODE, + gst_mp3_channel_mode_get_nick (mode), NULL); + } + + /* if the taglist exists, we need to send it */ + if (taglist) { + gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse), + mp3parse->srcpad, taglist); + } + + /* We start pushing 9 frames earlier (29 frames for MPEG2) than + * segment start to be able to decode the first frame we want. + * 9 (29) frames are the theoretical maximum of frames that contain + * data for the current frame (bit reservoir). + */ + if (mp3parse->segment.start == 0) { + push_start = 0; + } else if (GST_CLOCK_TIME_IS_VALID (mp3parse->max_bitreservoir)) { + if (GST_CLOCK_TIME_IS_VALID (mp3parse->segment.start) && + mp3parse->segment.start > mp3parse->max_bitreservoir) + push_start = mp3parse->segment.start - mp3parse->max_bitreservoir; + else + push_start = 0; + } else { + push_start = mp3parse->segment.start; + } + + if (G_UNLIKELY ((GST_CLOCK_TIME_IS_VALID (push_start) && + GST_BUFFER_TIMESTAMP_IS_VALID (outbuf) && + GST_BUFFER_TIMESTAMP (outbuf) + GST_BUFFER_DURATION (outbuf) + < push_start))) { + GST_DEBUG_OBJECT (mp3parse, + "Buffer before configured segment range %" GST_TIME_FORMAT + " to %" GST_TIME_FORMAT ", dropping, timestamp %" + GST_TIME_FORMAT " duration %" GST_TIME_FORMAT + ", offset 0x%08" G_GINT64_MODIFIER "x", GST_TIME_ARGS (push_start), + GST_TIME_ARGS (mp3parse->segment.stop), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), + GST_BUFFER_OFFSET (outbuf)); + + gst_buffer_unref (outbuf); + ret = GST_FLOW_OK; + } else if (G_UNLIKELY (GST_BUFFER_TIMESTAMP_IS_VALID (outbuf) && + GST_CLOCK_TIME_IS_VALID (mp3parse->segment.stop) && + GST_BUFFER_TIMESTAMP (outbuf) >= + mp3parse->segment.stop + GST_BUFFER_DURATION (outbuf))) { + /* Some mp3 streams have an offset in the timestamps, for which we have to + * push the frame *after* the end position in order for the decoder to be + * able to decode everything up until the segment.stop position. + * That is the reason of the calculated offset */ + GST_DEBUG_OBJECT (mp3parse, + "Buffer after configured segment range %" GST_TIME_FORMAT " to %" + GST_TIME_FORMAT ", returning GST_FLOW_UNEXPECTED, timestamp %" + GST_TIME_FORMAT " duration %" GST_TIME_FORMAT ", offset 0x%08" + G_GINT64_MODIFIER "x", GST_TIME_ARGS (push_start), + GST_TIME_ARGS (mp3parse->segment.stop), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), + GST_BUFFER_OFFSET (outbuf)); + + gst_buffer_unref (outbuf); + ret = GST_FLOW_UNEXPECTED; + } else { + GST_DEBUG_OBJECT (mp3parse, + "pushing buffer of %d bytes, timestamp %" GST_TIME_FORMAT + ", offset 0x%08" G_GINT64_MODIFIER "x", size, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), + GST_BUFFER_OFFSET (outbuf)); + mp3parse->segment.last_stop = GST_BUFFER_TIMESTAMP (outbuf); + /* push any pending segment now */ + if (mp3parse->pending_segment) { + gst_pad_push_event (mp3parse->srcpad, mp3parse->pending_segment); + mp3parse->pending_segment = NULL; + } + if (mp3parse->pending_events) { + GList *l; + + for (l = mp3parse->pending_events; l != NULL; l = l->next) { + gst_pad_push_event (mp3parse->srcpad, GST_EVENT (l->data)); + } + g_list_free (mp3parse->pending_events); + mp3parse->pending_events = NULL; + } + + /* set discont if needed */ + if (mp3parse->discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + mp3parse->discont = FALSE; + } + + ret = gst_pad_push (mp3parse->srcpad, outbuf); + } + + return ret; +} + +static void +gst_mp3parse_handle_first_frame (GstMPEGAudioParse * mp3parse) +{ + GstTagList *taglist; + gchar *codec; + const guint32 xing_id = 0x58696e67; /* 'Xing' in hex */ + const guint32 info_id = 0x496e666f; /* 'Info' in hex - found in LAME CBR files */ + const guint32 vbri_id = 0x56425249; /* 'VBRI' in hex */ + + gint offset; + + guint64 avail; + gint64 upstream_total_bytes = 0; + guint32 read_id; + const guint8 *data; + + /* Output codec tag */ + if (!mp3parse->sent_codec_tag) { + if (mp3parse->layer == 3) { + codec = g_strdup_printf ("MPEG %d Audio, Layer %d (MP3)", + mp3parse->version, mp3parse->layer); + } else { + codec = g_strdup_printf ("MPEG %d Audio, Layer %d", + mp3parse->version, mp3parse->layer); + } + + taglist = gst_tag_list_new (); + gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, + GST_TAG_AUDIO_CODEC, codec, NULL); + gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse), + mp3parse->srcpad, taglist); + g_free (codec); + + mp3parse->sent_codec_tag = TRUE; + } + /* end setting the tag */ + + /* Check first frame for Xing info */ + if (mp3parse->version == 1) { /* MPEG-1 file */ + if (mp3parse->channels == 1) + offset = 0x11; + else + offset = 0x20; + } else { /* MPEG-2 header */ + if (mp3parse->channels == 1) + offset = 0x09; + else + offset = 0x11; + } + /* Skip the 4 bytes of the MP3 header too */ + offset += 4; + + /* Check if we have enough data to read the Xing header */ + avail = gst_adapter_available (mp3parse->adapter); + + if (avail < offset + 8) + return; + + data = gst_adapter_peek (mp3parse->adapter, offset + 8); + if (data == NULL) + return; + /* The header starts at the provided offset */ + data += offset; + + /* obtain real upstream total bytes */ + mp3parse_total_bytes (mp3parse, &upstream_total_bytes); + + read_id = GST_READ_UINT32_BE (data); + if (read_id == xing_id || read_id == info_id) { + guint32 xing_flags; + guint bytes_needed = offset + 8; + gint64 total_bytes; + GstClockTime total_time; + + GST_DEBUG_OBJECT (mp3parse, "Found Xing header marker 0x%x", xing_id); + + /* Read 4 base bytes of flags, big-endian */ + xing_flags = GST_READ_UINT32_BE (data + 4); + if (xing_flags & XING_FRAMES_FLAG) + bytes_needed += 4; + if (xing_flags & XING_BYTES_FLAG) + bytes_needed += 4; + if (xing_flags & XING_TOC_FLAG) + bytes_needed += 100; + if (xing_flags & XING_VBR_SCALE_FLAG) + bytes_needed += 4; + if (avail < bytes_needed) { + GST_DEBUG_OBJECT (mp3parse, + "Not enough data to read Xing header (need %d)", bytes_needed); + return; + } + + GST_DEBUG_OBJECT (mp3parse, "Reading Xing header"); + mp3parse->xing_flags = xing_flags; + data = gst_adapter_peek (mp3parse->adapter, bytes_needed); + data += offset + 8; + + if (xing_flags & XING_FRAMES_FLAG) { + mp3parse->xing_frames = GST_READ_UINT32_BE (data); + if (mp3parse->xing_frames == 0) { + GST_WARNING_OBJECT (mp3parse, + "Invalid number of frames in Xing header"); + mp3parse->xing_flags &= ~XING_FRAMES_FLAG; + } else { + mp3parse->xing_total_time = gst_util_uint64_scale (GST_SECOND, + (guint64) (mp3parse->xing_frames) * (mp3parse->spf), + mp3parse->rate); + } + + data += 4; + } else { + mp3parse->xing_frames = 0; + mp3parse->xing_total_time = 0; + } + + if (xing_flags & XING_BYTES_FLAG) { + mp3parse->xing_bytes = GST_READ_UINT32_BE (data); + if (mp3parse->xing_bytes == 0) { + GST_WARNING_OBJECT (mp3parse, "Invalid number of bytes in Xing header"); + mp3parse->xing_flags &= ~XING_BYTES_FLAG; + } + + data += 4; + } else { + mp3parse->xing_bytes = 0; + } + + /* If we know the upstream size and duration, compute the + * total bitrate, rounded up to the nearest kbit/sec */ + if ((total_time = mp3parse->xing_total_time) && + (total_bytes = mp3parse->xing_bytes)) { + mp3parse->xing_bitrate = gst_util_uint64_scale (total_bytes, + 8 * GST_SECOND, total_time); + mp3parse->xing_bitrate += 500; + mp3parse->xing_bitrate -= mp3parse->xing_bitrate % 1000; + } + + if (xing_flags & XING_TOC_FLAG) { + int i, percent = 0; + guchar *table = mp3parse->xing_seek_table; + guchar old = 0, new; + guint first; + + first = data[0]; + GST_DEBUG_OBJECT (mp3parse, + "Subtracting initial offset of %d bytes from Xing TOC", first); + + /* xing seek table: percent time -> 1/256 bytepos */ + for (i = 0; i < 100; i++) { + new = data[i] - first; + if (old > new) { + GST_WARNING_OBJECT (mp3parse, "Skipping broken Xing TOC"); + mp3parse->xing_flags &= ~XING_TOC_FLAG; + goto skip_toc; + } + mp3parse->xing_seek_table[i] = old = new; + } + + /* build inverse table: 1/256 bytepos -> 1/100 percent time */ + for (i = 0; i < 256; i++) { + while (percent < 99 && table[percent + 1] <= i) + percent++; + + if (table[percent] == i) { + mp3parse->xing_seek_table_inverse[i] = percent * 100; + } else if (table[percent] < i && percent < 99) { + gdouble fa, fb, fx; + gint a = percent, b = percent + 1; + + fa = table[a]; + fb = table[b]; + fx = (b - a) / (fb - fa) * (i - fa) + a; + mp3parse->xing_seek_table_inverse[i] = (guint16) (fx * 100); + } else if (percent == 99) { + gdouble fa, fb, fx; + gint a = percent, b = 100; + + fa = table[a]; + fb = 256.0; + fx = (b - a) / (fb - fa) * (i - fa) + a; + mp3parse->xing_seek_table_inverse[i] = (guint16) (fx * 100); + } + } + skip_toc: + data += 100; + } else { + memset (mp3parse->xing_seek_table, 0, 100); + memset (mp3parse->xing_seek_table_inverse, 0, 256); + } + + if (xing_flags & XING_VBR_SCALE_FLAG) { + mp3parse->xing_vbr_scale = GST_READ_UINT32_BE (data); + } else + mp3parse->xing_vbr_scale = 0; + + GST_DEBUG_OBJECT (mp3parse, "Xing header reported %u frames, time %" + GST_TIME_FORMAT ", %u bytes, vbr scale %u", mp3parse->xing_frames, + GST_TIME_ARGS (mp3parse->xing_total_time), mp3parse->xing_bytes, + mp3parse->xing_vbr_scale); + + /* check for truncated file */ + if (upstream_total_bytes && mp3parse->xing_bytes && + mp3parse->xing_bytes * 0.8 > upstream_total_bytes) { + GST_WARNING_OBJECT (mp3parse, "File appears to have been truncated; " + "invalidating Xing header duration and size"); + mp3parse->xing_flags &= ~XING_BYTES_FLAG; + mp3parse->xing_flags &= ~XING_FRAMES_FLAG; + } + } else if (read_id == vbri_id) { + gint64 total_bytes, total_frames; + GstClockTime total_time; + guint16 nseek_points; + + GST_DEBUG_OBJECT (mp3parse, "Found VBRI header marker 0x%x", vbri_id); + if (avail < offset + 26) { + GST_DEBUG_OBJECT (mp3parse, + "Not enough data to read VBRI header (need %d)", offset + 26); + return; + } + + GST_DEBUG_OBJECT (mp3parse, "Reading VBRI header"); + data = gst_adapter_peek (mp3parse->adapter, offset + 26); + data += offset + 4; + + if (GST_READ_UINT16_BE (data) != 0x0001) { + GST_WARNING_OBJECT (mp3parse, + "Unsupported VBRI version 0x%x", GST_READ_UINT16_BE (data)); + return; + } + data += 2; + + /* Skip encoder delay */ + data += 2; + + /* Skip quality */ + data += 2; + + total_bytes = GST_READ_UINT32_BE (data); + if (total_bytes != 0) + mp3parse->vbri_bytes = total_bytes; + data += 4; + + total_frames = GST_READ_UINT32_BE (data); + if (total_frames != 0) { + mp3parse->vbri_frames = total_frames; + mp3parse->vbri_total_time = gst_util_uint64_scale (GST_SECOND, + (guint64) (mp3parse->vbri_frames) * (mp3parse->spf), mp3parse->rate); + } + data += 4; + + /* If we know the upstream size and duration, compute the + * total bitrate, rounded up to the nearest kbit/sec */ + if ((total_time = mp3parse->vbri_total_time) && + (total_bytes = mp3parse->vbri_bytes)) { + mp3parse->vbri_bitrate = gst_util_uint64_scale (total_bytes, + 8 * GST_SECOND, total_time); + mp3parse->vbri_bitrate += 500; + mp3parse->vbri_bitrate -= mp3parse->vbri_bitrate % 1000; + } + + nseek_points = GST_READ_UINT16_BE (data); + data += 2; + + if (nseek_points > 0) { + guint scale, seek_bytes, seek_frames; + gint i; + + mp3parse->vbri_seek_points = nseek_points; + + scale = GST_READ_UINT16_BE (data); + data += 2; + + seek_bytes = GST_READ_UINT16_BE (data); + data += 2; + + seek_frames = GST_READ_UINT16_BE (data); + + if (scale == 0 || seek_bytes == 0 || seek_bytes > 4 || seek_frames == 0) { + GST_WARNING_OBJECT (mp3parse, "Unsupported VBRI seek table"); + goto out_vbri; + } + + if (avail < offset + 26 + nseek_points * seek_bytes) { + GST_WARNING_OBJECT (mp3parse, + "Not enough data to read VBRI seek table (need %d)", + offset + 26 + nseek_points * seek_bytes); + goto out_vbri; + } + + if (seek_frames * nseek_points < total_frames - seek_frames || + seek_frames * nseek_points > total_frames + seek_frames) { + GST_WARNING_OBJECT (mp3parse, + "VBRI seek table doesn't cover the complete file"); + goto out_vbri; + } + + data = + gst_adapter_peek (mp3parse->adapter, + offset + 26 + nseek_points * seek_bytes); + data += offset + 26; + + + /* VBRI seek table: frame/seek_frames -> byte */ + mp3parse->vbri_seek_table = g_new (guint32, nseek_points); + if (seek_bytes == 4) + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT32_BE (data) * scale; + data += 4; + } else if (seek_bytes == 3) + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT24_BE (data) * scale; + data += 3; + } else if (seek_bytes == 2) + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT16_BE (data) * scale; + data += 2; + } else /* seek_bytes == 1 */ + for (i = 0; i < nseek_points; i++) { + mp3parse->vbri_seek_table[i] = GST_READ_UINT8 (data) * scale; + data += 1; + } + } + out_vbri: + + GST_DEBUG_OBJECT (mp3parse, "VBRI header reported %u frames, time %" + GST_TIME_FORMAT ", bytes %u", mp3parse->vbri_frames, + GST_TIME_ARGS (mp3parse->vbri_total_time), mp3parse->vbri_bytes); + + /* check for truncated file */ + if (upstream_total_bytes && mp3parse->vbri_bytes && + mp3parse->vbri_bytes * 0.8 > upstream_total_bytes) { + GST_WARNING_OBJECT (mp3parse, "File appears to have been truncated; " + "invalidating VBRI header duration and size"); + mp3parse->vbri_valid = FALSE; + } else { + mp3parse->vbri_valid = TRUE; + } + } else { + GST_DEBUG_OBJECT (mp3parse, + "Xing, LAME or VBRI header not found in first frame"); + } +} + +static void +gst_mp3parse_check_seekability (GstMPEGAudioParse * mp3parse) +{ + GstQuery *query; + gboolean seekable = FALSE; + gint64 start = -1, stop = -1; + guint idx_interval = 0; + + query = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (mp3parse->sinkpad, query)) { + GST_DEBUG_OBJECT (mp3parse, "seeking query failed"); + goto done; + } + + gst_query_parse_seeking (query, NULL, &seekable, &start, &stop); + + /* try harder to query upstream size if we didn't get it the first time */ + if (seekable && stop == -1) { + GstFormat fmt = GST_FORMAT_BYTES; + + GST_DEBUG_OBJECT (mp3parse, "doing duration query to fix up unset stop"); + gst_pad_query_peer_duration (mp3parse->sinkpad, &fmt, &stop); + } + + /* if upstream doesn't know the size, it's likely that it's not seekable in + * practice even if it technically may be seekable */ + if (seekable && (start != 0 || stop <= start)) { + GST_DEBUG_OBJECT (mp3parse, "seekable but unknown start/stop -> disable"); + seekable = FALSE; + } + + /* let's not put every single frame into our index */ + if (seekable) { + if (stop < 10 * 1024 * 1024) + idx_interval = 100; + else if (stop < 100 * 1024 * 1024) + idx_interval = 500; + else + idx_interval = 1000; + } + +done: + + GST_INFO_OBJECT (mp3parse, "seekable: %d (%" G_GUINT64_FORMAT " - %" + G_GUINT64_FORMAT ")", seekable, start, stop); + mp3parse->seekable = seekable; + + GST_INFO_OBJECT (mp3parse, "idx_interval: %ums", idx_interval); + mp3parse->idx_interval = idx_interval * GST_MSECOND; + + gst_query_unref (query); +} + +/* Flush some number of bytes and update tracked offsets */ +static void +gst_mp3parse_flush_bytes (GstMPEGAudioParse * mp3parse, int bytes) +{ + gst_adapter_flush (mp3parse->adapter, bytes); + if (mp3parse->cur_offset != -1) + mp3parse->cur_offset += bytes; + mp3parse->tracked_offset += bytes; +} + +/* Perform extended validation to check that subsequent headers match + the first header given here in important characteristics, to avoid + false sync. We look for a minimum of MIN_RESYNC_FRAMES consecutive + frames to match their major characteristics. + + If at_eos is set to TRUE, we just check that we don't find any invalid + frames in whatever data is available, rather than requiring a full + MIN_RESYNC_FRAMES of data. + + Returns TRUE if we've seen enough data to validate or reject the frame. + If TRUE is returned, then *valid contains TRUE if it validated, or false + if we decided it was false sync. + */ +static gboolean +gst_mp3parse_validate_extended (GstMPEGAudioParse * mp3parse, guint32 header, + int bpf, gboolean at_eos, gboolean * valid) +{ + guint32 next_header; + const guint8 *data; + guint available; + int frames_found = 1; + int offset = bpf; + + while (frames_found < MIN_RESYNC_FRAMES) { + /* Check if we have enough data for all these frames, plus the next + frame header. */ + available = gst_adapter_available (mp3parse->adapter); + if (available < offset + 4) { + if (at_eos) { + /* Running out of data at EOS is fine; just accept it */ + *valid = TRUE; + return TRUE; + } else { + return FALSE; + } + } + + data = gst_adapter_peek (mp3parse->adapter, offset + 4); + next_header = GST_READ_UINT32_BE (data + offset); + GST_DEBUG_OBJECT (mp3parse, "At %d: header=%08X, header2=%08X, bpf=%d", + offset, (unsigned int) header, (unsigned int) next_header, bpf); + +/* mask the bits which are allowed to differ between frames */ +#define HDRMASK ~((0xF << 12) /* bitrate */ | \ + (0x1 << 9) /* padding */ | \ + (0xf << 4) /* mode|mode extension */ | \ + (0xf)) /* copyright|emphasis */ + + if ((next_header & HDRMASK) != (header & HDRMASK)) { + /* If any of the unmasked bits don't match, then it's not valid */ + GST_DEBUG_OBJECT (mp3parse, "next header doesn't match " + "(header=%08X (%08X), header2=%08X (%08X), bpf=%d)", + (guint) header, (guint) header & HDRMASK, (guint) next_header, + (guint) next_header & HDRMASK, bpf); + *valid = FALSE; + return TRUE; + } else if ((((next_header >> 12) & 0xf) == 0) || + (((next_header >> 12) & 0xf) == 0xf)) { + /* The essential parts were the same, but the bitrate held an + invalid value - also reject */ + GST_DEBUG_OBJECT (mp3parse, "next header invalid (bitrate)"); + *valid = FALSE; + return TRUE; + } + + bpf = mp3_type_frame_length_from_header (mp3parse, next_header, + NULL, NULL, NULL, NULL, NULL, NULL, NULL); + + offset += bpf; + frames_found++; + } + + *valid = TRUE; + return TRUE; +} + +static GstFlowReturn +gst_mp3parse_handle_data (GstMPEGAudioParse * mp3parse, gboolean at_eos) +{ + GstFlowReturn flow = GST_FLOW_OK; + const guchar *data; + guint32 header; + int bpf; + guint available; + guint bitrate, layer, rate, channels, version, mode, crc; + gboolean caps_change; + + /* while we still have at least 4 bytes (for the header) available */ + while (gst_adapter_available (mp3parse->adapter) >= 4) { + /* Get the header bytes, check if they're potentially valid */ + data = gst_adapter_peek (mp3parse->adapter, 4); + header = GST_READ_UINT32_BE (data); + + if (!head_check (mp3parse, header)) { + /* Not a valid MP3 header; we start looking forward byte-by-byte trying to + find a place to resync */ + if (!mp3parse->resyncing) + mp3parse->sync_offset = mp3parse->tracked_offset; + mp3parse->resyncing = TRUE; + gst_mp3parse_flush_bytes (mp3parse, 1); + GST_DEBUG_OBJECT (mp3parse, "wrong header, skipping byte"); + continue; + } + + /* We have a potentially valid header. + If this is just a normal 'next frame', we go ahead and output it. + + However, sometimes, we do additional validation to ensure we haven't + got false sync (common with mp3 due to the short sync word). + The additional validation requires that we find several consecutive mp3 + frames with the same major parameters, or reach EOS with a smaller + number of valid-looking frames. + + We do this if: + - This is the very first frame we've processed + - We're resyncing after a non-accurate seek, or after losing sync + due to invalid data. + - The format of the stream changes in a major way (number of channels, + sample rate, layer, or mpeg version). + */ + available = gst_adapter_available (mp3parse->adapter); + + if (G_UNLIKELY (mp3parse->resyncing && + mp3parse->tracked_offset - mp3parse->sync_offset > 2 * 1024 * 1024)) + goto sync_failure; + + bpf = mp3_type_frame_length_from_header (mp3parse, header, + &version, &layer, &channels, &bitrate, &rate, &mode, &crc); + g_assert (bpf != 0); + + if (channels != mp3parse->channels || + rate != mp3parse->rate || layer != mp3parse->layer || + version != mp3parse->version) + caps_change = TRUE; + else + caps_change = FALSE; + + if (mp3parse->resyncing || caps_change) { + gboolean valid; + if (!gst_mp3parse_validate_extended (mp3parse, header, bpf, at_eos, + &valid)) { + /* Not enough data to validate; wait for more */ + break; + } + + if (!valid) { + /* Extended validation failed; we probably got false sync. + Continue searching from the next byte in the stream */ + if (!mp3parse->resyncing) + mp3parse->sync_offset = mp3parse->tracked_offset; + mp3parse->resyncing = TRUE; + gst_mp3parse_flush_bytes (mp3parse, 1); + continue; + } + } + + /* if we don't have the whole frame... */ + if (available < bpf) { + GST_DEBUG_OBJECT (mp3parse, "insufficient data available, need " + "%d bytes, have %d", bpf, available); + break; + } + + if (caps_change) { + GstCaps *caps; + + caps = mp3_caps_create (version, layer, channels, rate); + gst_pad_set_caps (mp3parse->srcpad, caps); + gst_caps_unref (caps); + + mp3parse->channels = channels; + mp3parse->rate = rate; + + mp3parse->layer = layer; + mp3parse->version = version; + + /* see http://www.codeproject.com/audio/MPEGAudioInfo.asp */ + if (mp3parse->layer == 1) + mp3parse->spf = 384; + else if (mp3parse->layer == 2) + mp3parse->spf = 1152; + else if (mp3parse->version == 1) { + mp3parse->spf = 1152; + } else { + /* MPEG-2 or "2.5" */ + mp3parse->spf = 576; + } + + mp3parse->max_bitreservoir = gst_util_uint64_scale (GST_SECOND, + ((version == 1) ? 10 : 30) * mp3parse->spf, mp3parse->rate); + } + + mp3parse->bit_rate = bitrate; + + /* Check the first frame for a Xing header to get our total length */ + if (mp3parse->frame_count == 0) { + /* For the first frame in the file, look for a Xing frame after + * the header, and output a codec tag */ + gst_mp3parse_handle_first_frame (mp3parse); + + /* Check if we're seekable */ + gst_mp3parse_check_seekability (mp3parse); + } + + /* Update VBR stats */ + mp3parse->bitrate_sum += mp3parse->bit_rate; + mp3parse->frame_count++; + /* Compute the average bitrate, rounded up to the nearest 1000 bits */ + mp3parse->avg_bitrate = + (mp3parse->bitrate_sum / mp3parse->frame_count + 500); + mp3parse->avg_bitrate -= mp3parse->avg_bitrate % 1000; + + if (!mp3parse->skip) { + mp3parse->resyncing = FALSE; + flow = gst_mp3parse_emit_frame (mp3parse, bpf, mode, crc); + if (GST_FLOW_IS_FATAL (flow)) + break; + } else { + GST_DEBUG_OBJECT (mp3parse, "skipping buffer of %d bytes", bpf); + gst_mp3parse_flush_bytes (mp3parse, bpf); + mp3parse->skip--; + } + } + + return flow; + + /* ERRORS */ +sync_failure: + { + GST_ELEMENT_ERROR (mp3parse, STREAM, DECODE, + ("Failed to parse stream"), (NULL)); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_mp3parse_chain (GstPad * pad, GstBuffer * buf) +{ + GstMPEGAudioParse *mp3parse; + GstClockTime timestamp; + + mp3parse = GST_MP3PARSE (GST_PAD_PARENT (pad)); + + GST_LOG_OBJECT (mp3parse, "buffer of %d bytes", GST_BUFFER_SIZE (buf)); + + timestamp = GST_BUFFER_TIMESTAMP (buf); + + mp3parse->discont |= GST_BUFFER_IS_DISCONT (buf); + + /* If we don't yet have a next timestamp, save it and the incoming offset + * so we can apply it to the right outgoing buffer */ + if (GST_CLOCK_TIME_IS_VALID (timestamp)) { + gint64 avail = gst_adapter_available (mp3parse->adapter); + + mp3parse->pending_ts = timestamp; + mp3parse->pending_offset = mp3parse->tracked_offset + avail; + + /* If we have no data pending and the next timestamp is + * invalid we can use the upstream timestamp for the next frame. + * + * This will give us a timestamp if we're resyncing and upstream + * gave us -1 as offset. */ + if (avail == 0 && !GST_CLOCK_TIME_IS_VALID (mp3parse->next_ts)) + mp3parse->next_ts = timestamp; + + GST_LOG_OBJECT (mp3parse, "Have pending ts %" GST_TIME_FORMAT + " to apply in %" G_GINT64_FORMAT " bytes (@ off %" G_GINT64_FORMAT ")", + GST_TIME_ARGS (mp3parse->pending_ts), avail, mp3parse->pending_offset); + } + + /* Update the cur_offset we'll apply to outgoing buffers */ + if (mp3parse->cur_offset == -1 && GST_BUFFER_OFFSET (buf) != -1) + mp3parse->cur_offset = GST_BUFFER_OFFSET (buf); + + /* And add the data to the pool */ + gst_adapter_push (mp3parse->adapter, buf); + + return gst_mp3parse_handle_data (mp3parse, FALSE); +} + +static gboolean +head_check (GstMPEGAudioParse * mp3parse, unsigned long head) +{ + GST_DEBUG_OBJECT (mp3parse, "checking mp3 header 0x%08lx", head); + /* if it's not a valid sync */ + if ((head & 0xffe00000) != 0xffe00000) { + GST_WARNING_OBJECT (mp3parse, "invalid sync"); + return FALSE; + } + /* if it's an invalid MPEG version */ + if (((head >> 19) & 3) == 0x1) { + GST_WARNING_OBJECT (mp3parse, "invalid MPEG version: 0x%lx", + (head >> 19) & 3); + return FALSE; + } + /* if it's an invalid layer */ + if (!((head >> 17) & 3)) { + GST_WARNING_OBJECT (mp3parse, "invalid layer: 0x%lx", (head >> 17) & 3); + return FALSE; + } + /* if it's an invalid bitrate */ + if (((head >> 12) & 0xf) == 0x0) { + GST_WARNING_OBJECT (mp3parse, "invalid bitrate: 0x%lx." + "Free format files are not supported yet", (head >> 12) & 0xf); + return FALSE; + } + if (((head >> 12) & 0xf) == 0xf) { + GST_WARNING_OBJECT (mp3parse, "invalid bitrate: 0x%lx", (head >> 12) & 0xf); + return FALSE; + } + /* if it's an invalid samplerate */ + if (((head >> 10) & 0x3) == 0x3) { + GST_WARNING_OBJECT (mp3parse, "invalid samplerate: 0x%lx", + (head >> 10) & 0x3); + return FALSE; + } + + if ((head & 0x3) == 0x2) { + /* Ignore this as there are some files with emphasis 0x2 that can + * be played fine. See BGO #537235 */ + GST_WARNING_OBJECT (mp3parse, "invalid emphasis: 0x%lx", head & 0x3); + } + + return TRUE; +} + +static void +gst_mp3parse_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPEGAudioParse *src; + + src = GST_MP3PARSE (object); + + switch (prop_id) { + case ARG_SKIP: + src->skip = g_value_get_int (value); + break; + default: + break; + } +} + +static void +gst_mp3parse_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) +{ + GstMPEGAudioParse *src; + + src = GST_MP3PARSE (object); + + switch (prop_id) { + case ARG_SKIP: + g_value_set_int (value, src->skip); + break; + case ARG_BIT_RATE: + g_value_set_int (value, src->bit_rate * 1000); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static GstStateChangeReturn +gst_mp3parse_change_state (GstElement * element, GstStateChange transition) +{ + GstMPEGAudioParse *mp3parse; + GstStateChangeReturn result; + + mp3parse = GST_MP3PARSE (element); + + result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_mp3parse_reset (mp3parse); + break; + default: + break; + } + + return result; +} + +static gboolean +mp3parse_total_bytes (GstMPEGAudioParse * mp3parse, gint64 * total) +{ + GstFormat fmt = GST_FORMAT_BYTES; + + if (gst_pad_query_peer_duration (mp3parse->sinkpad, &fmt, total)) + return TRUE; + + if (mp3parse->xing_flags & XING_BYTES_FLAG) { + *total = mp3parse->xing_bytes; + return TRUE; + } + + if (mp3parse->vbri_bytes != 0 && mp3parse->vbri_valid) { + *total = mp3parse->vbri_bytes; + return TRUE; + } + + return FALSE; +} + +static gboolean +mp3parse_total_time (GstMPEGAudioParse * mp3parse, GstClockTime * total) +{ + gint64 total_bytes; + + *total = GST_CLOCK_TIME_NONE; + + if (mp3parse->xing_flags & XING_FRAMES_FLAG) { + *total = mp3parse->xing_total_time; + return TRUE; + } + + if (mp3parse->vbri_total_time != 0 && mp3parse->vbri_valid) { + *total = mp3parse->vbri_total_time; + return TRUE; + } + + /* Calculate time from the measured bitrate */ + if (!mp3parse_total_bytes (mp3parse, &total_bytes)) + return FALSE; + + if (total_bytes != -1 + && !mp3parse_bytepos_to_time (mp3parse, total_bytes, total, TRUE)) + return FALSE; + + return TRUE; +} + +/* Convert a timestamp to the file position required to start decoding that + * timestamp. For now, this just uses the avg bitrate. Later, use an + * incrementally accumulated seek table */ +static gboolean +mp3parse_time_to_bytepos (GstMPEGAudioParse * mp3parse, GstClockTime ts, + gint64 * bytepos) +{ + gint64 total_bytes; + GstClockTime total_time; + + /* -1 always maps to -1 */ + if (ts == -1) { + *bytepos = -1; + return TRUE; + } + + /* If XING seek table exists use this for time->byte conversion */ + if ((mp3parse->xing_flags & XING_TOC_FLAG) && + (total_bytes = mp3parse->xing_bytes) && + (total_time = mp3parse->xing_total_time)) { + gdouble fa, fb, fx; + gdouble percent = + CLAMP ((100.0 * gst_util_guint64_to_gdouble (ts)) / + gst_util_guint64_to_gdouble (total_time), 0.0, 100.0); + gint index = CLAMP (percent, 0, 99); + + fa = mp3parse->xing_seek_table[index]; + if (index < 99) + fb = mp3parse->xing_seek_table[index + 1]; + else + fb = 256.0; + + fx = fa + (fb - fa) * (percent - index); + + *bytepos = (1.0 / 256.0) * fx * total_bytes; + + return TRUE; + } + + if (mp3parse->vbri_seek_table && (total_bytes = mp3parse->vbri_bytes) && + (total_time = mp3parse->vbri_total_time)) { + gint i, j; + gdouble a, b, fa, fb; + + i = gst_util_uint64_scale (ts, mp3parse->vbri_seek_points - 1, total_time); + i = CLAMP (i, 0, mp3parse->vbri_seek_points - 1); + + a = gst_guint64_to_gdouble (gst_util_uint64_scale (i, total_time, + mp3parse->vbri_seek_points)); + fa = 0.0; + for (j = i; j >= 0; j--) + fa += mp3parse->vbri_seek_table[j]; + + if (i + 1 < mp3parse->vbri_seek_points) { + b = gst_guint64_to_gdouble (gst_util_uint64_scale (i + 1, total_time, + mp3parse->vbri_seek_points)); + fb = fa + mp3parse->vbri_seek_table[i + 1]; + } else { + b = gst_guint64_to_gdouble (total_time); + fb = total_bytes; + } + + *bytepos = fa + ((fb - fa) / (b - a)) * (gst_guint64_to_gdouble (ts) - a); + + return TRUE; + } + + if (mp3parse->avg_bitrate == 0) + goto no_bitrate; + + *bytepos = + gst_util_uint64_scale (ts, mp3parse->avg_bitrate, (8 * GST_SECOND)); + return TRUE; +no_bitrate: + GST_DEBUG_OBJECT (mp3parse, "Cannot seek yet - no average bitrate"); + return FALSE; +} + +static gboolean +mp3parse_bytepos_to_time (GstMPEGAudioParse * mp3parse, + gint64 bytepos, GstClockTime * ts, gboolean from_total_time) +{ + gint64 total_bytes; + GstClockTime total_time; + + if (bytepos == -1) { + *ts = GST_CLOCK_TIME_NONE; + return TRUE; + } + + if (bytepos == 0) { + *ts = 0; + return TRUE; + } + + /* If XING seek table exists use this for byte->time conversion */ + if (!from_total_time && (mp3parse->xing_flags & XING_TOC_FLAG) && + (total_bytes = mp3parse->xing_bytes) && + (total_time = mp3parse->xing_total_time)) { + gdouble fa, fb, fx; + gdouble pos; + gint index; + + pos = CLAMP ((bytepos * 256.0) / total_bytes, 0.0, 256.0); + index = CLAMP (pos, 0, 255); + fa = mp3parse->xing_seek_table_inverse[index]; + if (index < 255) + fb = mp3parse->xing_seek_table_inverse[index + 1]; + else + fb = 10000.0; + + fx = fa + (fb - fa) * (pos - index); + + *ts = (1.0 / 10000.0) * fx * gst_util_guint64_to_gdouble (total_time); + + return TRUE; + } + + if (!from_total_time && mp3parse->vbri_seek_table && + (total_bytes = mp3parse->vbri_bytes) && + (total_time = mp3parse->vbri_total_time)) { + gint i = 0; + guint64 sum = 0; + gdouble a, b, fa, fb; + + do { + sum += mp3parse->vbri_seek_table[i]; + i++; + } while (i + 1 < mp3parse->vbri_seek_points + && sum + mp3parse->vbri_seek_table[i] < bytepos); + i--; + + a = gst_guint64_to_gdouble (sum); + fa = gst_guint64_to_gdouble (gst_util_uint64_scale (i, total_time, + mp3parse->vbri_seek_points)); + + if (i + 1 < mp3parse->vbri_seek_points) { + b = a + mp3parse->vbri_seek_table[i + 1]; + fb = gst_guint64_to_gdouble (gst_util_uint64_scale (i + 1, total_time, + mp3parse->vbri_seek_points)); + } else { + b = total_bytes; + fb = gst_guint64_to_gdouble (total_time); + } + + *ts = gst_gdouble_to_guint64 (fa + ((fb - fa) / (b - a)) * (bytepos - a)); + + return TRUE; + } + + /* Cannot convert anything except 0 if we don't have a bitrate yet */ + if (mp3parse->avg_bitrate == 0) + return FALSE; + + *ts = (GstClockTime) gst_util_uint64_scale (GST_SECOND, bytepos * 8, + mp3parse->avg_bitrate); + return TRUE; +} + +static gboolean +mp3parse_handle_seek (GstMPEGAudioParse * mp3parse, GstEvent * event) +{ + GstFormat format; + gdouble rate; + GstSeekFlags flags; + GstSeekType cur_type, stop_type; + gint64 cur, stop; + gint64 byte_cur, byte_stop; + MPEGAudioPendingAccurateSeek *seek; + GstClockTime start; + + gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur, + &stop_type, &stop); + + GST_DEBUG_OBJECT (mp3parse, "Performing seek to %" GST_TIME_FORMAT, + GST_TIME_ARGS (cur)); + + /* For any format other than TIME, see if upstream handles + * it directly or fail. For TIME, try upstream, but do it ourselves if + * it fails upstream */ + if (format != GST_FORMAT_TIME) { + gst_event_ref (event); + return gst_pad_push_event (mp3parse->sinkpad, event); + } else { + gst_event_ref (event); + if (gst_pad_push_event (mp3parse->sinkpad, event)) + return TRUE; + } + + seek = g_new0 (MPEGAudioPendingAccurateSeek, 1); + + seek->segment = mp3parse->segment; + + gst_segment_set_seek (&seek->segment, rate, GST_FORMAT_TIME, + flags, cur_type, cur, stop_type, stop, NULL); + + /* Handle TIME based seeks by converting to a BYTE position */ + + /* For accurate seeking get the frame 9 (MPEG1) or 29 (MPEG2) frames + * before the one we want to seek to and push them all to the decoder. + * + * This is necessary because of the bit reservoir. See + * http://www.mars.org/mailman/public/mad-dev/2002-May/000634.html + * + */ + + if (flags & GST_SEEK_FLAG_ACCURATE) { + if (!mp3parse->seek_table) { + byte_cur = 0; + byte_stop = -1; + start = 0; + } else { + MPEGAudioSeekEntry *entry = NULL, *start_entry = NULL, *stop_entry = NULL; + GList *start_node, *stop_node; + gint64 seek_ts = (cur > mp3parse->max_bitreservoir) ? + (cur - mp3parse->max_bitreservoir) : 0; + + for (start_node = mp3parse->seek_table; start_node; + start_node = start_node->next) { + entry = start_node->data; + + if (seek_ts >= entry->timestamp) { + start_entry = entry; + break; + } + } + + if (!start_entry) { + start_entry = mp3parse->seek_table->data; + start = start_entry->timestamp; + byte_cur = start_entry->byte; + } else { + start = start_entry->timestamp; + byte_cur = start_entry->byte; + } + + for (stop_node = mp3parse->seek_table; stop_node; + stop_node = stop_node->next) { + entry = stop_node->data; + + if (stop >= entry->timestamp) { + stop_node = stop_node->prev; + stop_entry = (stop_node) ? stop_node->data : NULL; + break; + } + } + + if (!stop_entry) { + byte_stop = -1; + } else { + byte_stop = stop_entry->byte; + } + + } + event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, + byte_cur, stop_type, byte_stop); + g_mutex_lock (mp3parse->pending_seeks_lock); + seek->upstream_start = byte_cur; + seek->timestamp_start = start; + mp3parse->pending_accurate_seeks = + g_slist_prepend (mp3parse->pending_accurate_seeks, seek); + g_mutex_unlock (mp3parse->pending_seeks_lock); + if (gst_pad_push_event (mp3parse->sinkpad, event)) { + mp3parse->exact_position = TRUE; + return TRUE; + } else { + mp3parse->exact_position = TRUE; + g_mutex_lock (mp3parse->pending_seeks_lock); + mp3parse->pending_accurate_seeks = + g_slist_remove (mp3parse->pending_accurate_seeks, seek); + g_mutex_unlock (mp3parse->pending_seeks_lock); + g_free (seek); + return FALSE; + } + } + + mp3parse->exact_position = FALSE; + + /* Convert the TIME to the appropriate BYTE position at which to resume + * decoding. */ + if (!mp3parse_time_to_bytepos (mp3parse, (GstClockTime) cur, &byte_cur)) + goto no_pos; + if (!mp3parse_time_to_bytepos (mp3parse, (GstClockTime) stop, &byte_stop)) + goto no_pos; + + GST_DEBUG_OBJECT (mp3parse, "Seeking to byte range %" G_GINT64_FORMAT + " to %" G_GINT64_FORMAT, byte_cur, byte_stop); + + /* Send BYTE based seek upstream */ + event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags, cur_type, + byte_cur, stop_type, byte_stop); + + GST_LOG_OBJECT (mp3parse, "Storing pending seek"); + g_mutex_lock (mp3parse->pending_seeks_lock); + seek->upstream_start = byte_cur; + seek->timestamp_start = cur; + mp3parse->pending_nonaccurate_seeks = + g_slist_prepend (mp3parse->pending_nonaccurate_seeks, seek); + g_mutex_unlock (mp3parse->pending_seeks_lock); + if (gst_pad_push_event (mp3parse->sinkpad, event)) { + return TRUE; + } else { + g_mutex_lock (mp3parse->pending_seeks_lock); + mp3parse->pending_nonaccurate_seeks = + g_slist_remove (mp3parse->pending_nonaccurate_seeks, seek); + g_mutex_unlock (mp3parse->pending_seeks_lock); + g_free (seek); + return FALSE; + } + +no_pos: + GST_DEBUG_OBJECT (mp3parse, + "Could not determine byte position for desired time"); + return FALSE; +} + +static gboolean +mp3parse_src_event (GstPad * pad, GstEvent * event) +{ + GstMPEGAudioParse *mp3parse; + gboolean res = FALSE; + + mp3parse = GST_MP3PARSE (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEEK: + res = mp3parse_handle_seek (mp3parse, event); + gst_event_unref (event); + break; + default: + res = gst_pad_event_default (pad, event); + break; + } + + gst_object_unref (mp3parse); + return res; +} + +static gboolean +mp3parse_src_query (GstPad * pad, GstQuery * query) +{ + GstFormat format; + GstClockTime total; + GstMPEGAudioParse *mp3parse; + gboolean res = FALSE; + GstPad *peer; + + mp3parse = GST_MP3PARSE (gst_pad_get_parent (pad)); + + GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query)); + + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_POSITION: + gst_query_parse_position (query, &format, NULL); + + if (format == GST_FORMAT_BYTES || format == GST_FORMAT_DEFAULT) { + if (mp3parse->cur_offset != -1) { + gst_query_set_position (query, GST_FORMAT_BYTES, + mp3parse->cur_offset); + res = TRUE; + } + } else if (format == GST_FORMAT_TIME) { + if (mp3parse->next_ts == GST_CLOCK_TIME_NONE) + goto out; + gst_query_set_position (query, GST_FORMAT_TIME, mp3parse->next_ts); + res = TRUE; + } + + /* If no answer above, see if upstream knows */ + if (!res) { + if ((peer = gst_pad_get_peer (mp3parse->sinkpad)) != NULL) { + res = gst_pad_query (peer, query); + gst_object_unref (peer); + if (res) + goto out; + } + } + break; + case GST_QUERY_DURATION: + gst_query_parse_duration (query, &format, NULL); + + /* First, see if upstream knows */ + if ((peer = gst_pad_get_peer (mp3parse->sinkpad)) != NULL) { + res = gst_pad_query (peer, query); + gst_object_unref (peer); + if (res) + goto out; + } + + if (format == GST_FORMAT_TIME) { + if (!mp3parse_total_time (mp3parse, &total) || total == -1) + goto out; + gst_query_set_duration (query, format, total); + res = TRUE; + } + break; + case GST_QUERY_SEEKING: + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + + /* does upstream handle ? */ + if ((peer = gst_pad_get_peer (mp3parse->sinkpad)) != NULL) { + res = gst_pad_query (peer, query); + gst_object_unref (peer); + } + /* we may be able to help if in TIME */ + if (format == GST_FORMAT_TIME) { + gboolean seekable; + + gst_query_parse_seeking (query, &format, &seekable, NULL, NULL); + /* already OK if upstream takes care */ + if (!(res && seekable)) { + gint64 pos; + + seekable = TRUE; + if (!mp3parse_total_time (mp3parse, &total) || total == -1) { + seekable = FALSE; + } else if (!mp3parse_time_to_bytepos (mp3parse, 0, &pos)) { + seekable = FALSE; + } else { + GstQuery *q; + + q = gst_query_new_seeking (GST_FORMAT_BYTES); + if (!gst_pad_peer_query (mp3parse->sinkpad, q)) { + seekable = FALSE; + } else { + gst_query_parse_seeking (q, &format, &seekable, NULL, NULL); + } + gst_query_unref (q); + } + gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, total); + res = TRUE; + } + } + break; + default: + res = gst_pad_query_default (pad, query); + break; + } + +out: + gst_object_unref (mp3parse); + return res; +} + +static const GstQueryType * +mp3parse_get_query_types (GstPad * pad G_GNUC_UNUSED) +{ + static const GstQueryType query_types[] = { + GST_QUERY_POSITION, + GST_QUERY_DURATION, + 0 + }; + + return query_types; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/mpegaudioparse/gstmpegaudioparse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/gst/mpegaudioparse/gstmpegaudioparse.h Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,154 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __MP3PARSE_H__ +#define __MP3PARSE_H__ + + +#include +#include + +G_BEGIN_DECLS + +#define GST_TYPE_MP3PARSE \ + (gst_mp3parse_get_type()) +#define GST_MP3PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MP3PARSE,GstMPEGAudioParse)) +#define GST_MP3PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MP3PARSE,GstMPEGAudioParseClass)) +#define GST_IS_MP3PARSE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MP3PARSE)) +#define GST_IS_MP3PARSE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MP3PARSE)) + +typedef struct _GstMPEGAudioParse GstMPEGAudioParse; +typedef struct _GstMPEGAudioParseClass GstMPEGAudioParseClass; +typedef struct _MPEGAudioSeekEntry MPEGAudioSeekEntry; +typedef struct _MPEGAudioPendingAccurateSeek MPEGAudioPendingAccurateSeek; + + +struct _MPEGAudioSeekEntry { + gint64 byte; + GstClockTime timestamp; +}; + +struct _MPEGAudioPendingAccurateSeek { + GstSegment segment; + gint64 upstream_start; + GstClockTime timestamp_start; +}; + +struct _GstMPEGAudioParse { + GstElement element; + + GstPad *sinkpad, *srcpad; + + GstSegment segment; + GstClockTime next_ts; + gboolean discont; + + /* Offset as supplied by incoming buffers */ + gint64 cur_offset; + + /* Upcoming timestamp given on an incoming buffer and + * the offset at which it becomes active */ + GstClockTime pending_ts; + gint64 pending_offset; + /* Offset since the last newseg */ + gint64 tracked_offset; + /* tracked_offset when resyncing started */ + gint64 sync_offset; + + GstAdapter *adapter; + + guint skip; /* number of frames to skip */ + guint bit_rate; /* in kbps */ + gint channels, rate, layer, version; + GstClockTime max_bitreservoir; + gint spf; /* Samples per frame */ + + gboolean resyncing; /* True when attempting to resync (stricter checks are + performed) */ + gboolean sent_codec_tag; + + /* VBR tracking */ + guint avg_bitrate; + guint64 bitrate_sum; + guint frame_count; + guint last_posted_bitrate; + gint last_posted_crc; + guint last_posted_channel_mode; + + /* Xing info */ + guint32 xing_flags; + guint32 xing_frames; + GstClockTime xing_total_time; + guint32 xing_bytes; + /* percent -> filepos mapping */ + guchar xing_seek_table[100]; + /* filepos -> percent mapping */ + guint16 xing_seek_table_inverse[256]; + guint32 xing_vbr_scale; + guint xing_bitrate; + + /* VBRI info */ + guint32 vbri_frames; + GstClockTime vbri_total_time; + guint32 vbri_bytes; + guint vbri_bitrate; + guint vbri_seek_points; + guint32 *vbri_seek_table; + gboolean vbri_valid; + + /* Accurate seeking */ + GList *seek_table; + GMutex *pending_seeks_lock; + GSList *pending_accurate_seeks; + gboolean exact_position; + + GSList *pending_nonaccurate_seeks; + + /* Track whether we're seekable (in BYTES format, if upstream operates in + * TIME format, we don't care about seekability and assume upstream handles + * it). The seek table for accurate seeking is not maintained if we're not + * seekable. */ + gboolean seekable; + + /* minimum distance between two index entries */ + GstClockTimeDiff idx_interval; + + /* pending segment */ + GstEvent *pending_segment; + /* pending events */ + GList *pending_events; +}; + +struct _GstMPEGAudioParseClass { + GstElementClass parent_class; +}; + +#ifdef __SYMBIAN32__ +IMPORT_C +#endif +GType gst_mp3parse_get_type(void); + +G_END_DECLS + +#endif /* __MP3PARSE_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/mpegaudioparse/gstxingmux.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/gst/mpegaudioparse/gstxingmux.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,681 @@ +/* + * Copyright (c) 2006 Christophe Fergeau + * Copyright (c) 2008 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* Xing SDK: http://www.mp3-tech.org/programmer/sources/vbrheadersdk.zip */ + + +/** + * SECTION:element-xingmux + * + * xingmux adds a Xing header to MP3 files. This contains information about the duration and size + * of the file and a seek table and is very useful for getting an almost correct duration and better + * seeking on VBR MP3 files. + * + * This element will remove any existing Xing, LAME or VBRI headers from the beginning of the file. + * + * + * Example launch line + * |[ + * gst-launch audiotestsrc num-buffers=1000 ! audioconvert ! lame ! xingmux ! filesink location=test.mp3 + * gst-launch filesrc location=test.mp3 ! xingmux ! filesink location=test2.mp3 + * gst-launch filesrc location=test.mp3 ! mp3parse ! xingmux ! filesink location=test2.mp3 + * ]| + * + */ + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include +#include "gstxingmux.h" + +GST_DEBUG_CATEGORY_STATIC (xing_mux_debug); +#define GST_CAT_DEFAULT xing_mux_debug + +GST_BOILERPLATE (GstXingMux, gst_xing_mux, GstElement, GST_TYPE_ELEMENT); + +/* Xing Header stuff */ +#define GST_XING_FRAME_FIELD (1 << 0) +#define GST_XING_BYTES_FIELD (1 << 1) +#define GST_XING_TOC_FIELD (1 << 2) +#define GST_XING_QUALITY_FIELD (1 << 3) + +typedef struct _GstXingSeekEntry +{ + gint64 timestamp; + gint byte; +} GstXingSeekEntry; + +static inline GstXingSeekEntry * +gst_xing_seek_entry_new () +{ + return g_slice_new (GstXingSeekEntry); +} + +static inline void +gst_xing_seek_entry_free (GstXingSeekEntry * entry) +{ + g_slice_free (GstXingSeekEntry, entry); +} + +static void gst_xing_mux_finalize (GObject * obj); +static GstStateChangeReturn +gst_xing_mux_change_state (GstElement * element, GstStateChange transition); +static GstFlowReturn gst_xing_mux_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_xing_mux_sink_event (GstPad * pad, GstEvent * event); + +static GstStaticPadTemplate gst_xing_mux_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ]")); + + +static GstStaticPadTemplate gst_xing_mux_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/mpeg, " + "mpegversion = (int) 1, " "layer = (int) [ 1, 3 ]")); +static const guint mp3types_bitrates[2][3][16] = { + { + {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, + {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, + {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,} + }, + { + {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, + {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,} + }, +}; + +static const guint mp3types_freqs[3][3] = { {44100, 48000, 32000}, +{22050, 24000, 16000}, +{11025, 12000, 8000} +}; + +static gboolean +parse_header (guint32 header, guint * ret_size, guint * ret_spf, + gulong * ret_rate) +{ + guint length, spf; + gulong samplerate, bitrate, layer, padding; + gint lsf, mpg25; + + if ((header & 0xffe00000) != 0xffe00000) { + g_warning ("invalid sync"); + return FALSE; + } + + if (((header >> 19) & 3) == 0x01) { + g_warning ("invalid MPEG version"); + return FALSE; + } + + if (((header >> 17) & 3) == 0x00) { + g_warning ("invalid MPEG layer"); + return FALSE; + } + + if (((header >> 12) & 0xf) == 0xf || ((header >> 12) & 0xf) == 0x0) { + g_warning ("invalid bitrate"); + return FALSE; + } + + if (((header >> 10) & 0x3) == 0x3) { + g_warning ("invalid sampling rate"); + return FALSE; + } + + if (header & 0x00000002) { + g_warning ("invalid emphasis"); + return FALSE; + } + + if (header & (1 << 20)) { + lsf = (header & (1 << 19)) ? 0 : 1; + mpg25 = 0; + } else { + lsf = 1; + mpg25 = 1; + } + + layer = 4 - ((header >> 17) & 0x3); + + bitrate = (header >> 12) & 0xF; + bitrate = mp3types_bitrates[lsf][layer - 1][bitrate] * 1000; + if (bitrate == 0) + return 0; + + samplerate = (header >> 10) & 0x3; + samplerate = mp3types_freqs[lsf + mpg25][samplerate]; + + padding = (header >> 9) & 0x1; + + switch (layer) { + case 1: + length = 4 * ((bitrate * 12) / samplerate + padding); + break; + case 2: + length = (bitrate * 144) / samplerate + padding; + break; + default: + case 3: + length = (bitrate * 144) / (samplerate << lsf) + padding; + break; + } + + if (layer == 1) + spf = 384; + else if (layer == 2 || lsf == 0) + spf = 1152; + else + spf = 576; + + if (ret_size) + *ret_size = length; + if (ret_spf) + *ret_spf = spf; + if (ret_rate) + *ret_rate = samplerate; + + return TRUE; +} + +static guint +get_xing_offset (guint32 header) +{ + guint mpeg_version = (header >> 19) & 0x3; + guint channel_mode = (header >> 6) & 0x3; + + if (mpeg_version == 0x3) { + if (channel_mode == 0x3) { + return 0x11; + } else { + return 0x20; + } + } else { + if (channel_mode == 0x3) { + return 0x09; + } else { + return 0x11; + } + } +} + +static gboolean +has_xing_header (guint32 header, guchar * data, gsize size) +{ + data += 4; + data += get_xing_offset (header); + + if (memcmp (data, "Xing", 4) == 0 || + memcmp (data, "Info", 4) == 0 || memcmp (data, "VBRI", 4) == 0) + return TRUE; + else + return FALSE; +} + +static GstBuffer * +generate_xing_header (GstXingMux * xing) +{ + guint8 *xing_flags; + guint32 xing_flags_tmp = 0; + GstBuffer *xing_header; + guchar *data; + + guint32 header; + guint32 header_be; + guint size, spf, xing_offset; + gulong rate; + guint bitrate = 0x00; + + gint64 duration; + gint64 byte_count; + + header = xing->first_header; + + /* Set bitrate and choose lowest possible size */ + do { + bitrate++; + + header &= 0xffff0fff; + header |= bitrate << 12; + + parse_header (header, &size, &spf, &rate); + xing_offset = get_xing_offset (header); + } while (size < (4 + xing_offset + 4 + 4 + 4 + 4 + 100) && bitrate < 0xe); + + if (bitrate == 0xe) { + GST_ERROR ("No usable bitrate found!"); + return NULL; + } + + if (gst_pad_alloc_buffer_and_set_caps (xing->srcpad, 0, size, + GST_PAD_CAPS (xing->srcpad), &xing_header) != GST_FLOW_OK) { + xing_header = gst_buffer_new_and_alloc (size); + gst_buffer_set_caps (xing_header, GST_PAD_CAPS (xing->srcpad)); + } + + data = GST_BUFFER_DATA (xing_header); + memset (data, 0, size); + header_be = GUINT32_TO_BE (header); + memcpy (data, &header_be, 4); + + data += 4; + data += xing_offset; + + memcpy (data, "Xing", 4); + data += 4; + + xing_flags = data; + data += 4; + + if (xing->duration != GST_CLOCK_TIME_NONE) { + duration = xing->duration; + } else { + GstFormat fmt = GST_FORMAT_TIME; + + if (!gst_pad_query_peer_duration (xing->sinkpad, &fmt, &duration)) + duration = GST_CLOCK_TIME_NONE; + } + + if (duration != GST_CLOCK_TIME_NONE) { + guint32 number_of_frames; + + /* The Xing Header contains a NumberOfFrames field, which verifies to: + * Duration = NumberOfFrames *SamplesPerFrame/SamplingRate + * SamplesPerFrame and SamplingRate are values for the current frame. + */ + number_of_frames = gst_util_uint64_scale (duration, rate, GST_SECOND) / spf; + GST_DEBUG ("Setting number of frames to %u", number_of_frames); + number_of_frames = GUINT32_TO_BE (number_of_frames); + memcpy (data, &number_of_frames, 4); + xing_flags_tmp |= GST_XING_FRAME_FIELD; + data += 4; + } + + if (xing->byte_count != 0) { + byte_count = xing->byte_count; + } else { + GstFormat fmt = GST_FORMAT_BYTES; + + if (!gst_pad_query_peer_duration (xing->sinkpad, &fmt, &byte_count)) + byte_count = 0; + if (byte_count == -1) + byte_count = 0; + } + + if (byte_count != 0) { + guint32 nbytes; + + if (byte_count > G_MAXUINT32) { + GST_DEBUG ("Too large stream: %" G_GINT64_FORMAT " > %u bytes", + byte_count, G_MAXUINT32); + } else { + nbytes = byte_count; + GST_DEBUG ("Setting number of bytes to %u", nbytes); + nbytes = GUINT32_TO_BE (nbytes); + memcpy (data, &nbytes, 4); + xing_flags_tmp |= GST_XING_BYTES_FIELD; + data += 4; + } + } + + if (xing->seek_table != NULL && byte_count != 0 + && duration != GST_CLOCK_TIME_NONE) { + GList *it; + gint percent = 0; + + xing_flags_tmp |= GST_XING_TOC_FIELD; + + GST_DEBUG ("Writing seek table"); + for (it = xing->seek_table; it != NULL && percent < 100; it = it->next) { + GstXingSeekEntry *entry = (GstXingSeekEntry *) it->data; + gint64 pos; + guchar byte; + + while ((entry->timestamp * 100) / duration >= percent) { + pos = (entry->byte * 256) / byte_count; + GST_DEBUG (" %d %% -- %" G_GINT64_FORMAT " 1/256", percent, pos); + byte = (guchar) pos; + memcpy (data, &byte, 1); + data++; + percent++; + } + } + + if (percent < 100) { + guchar b; + gint i; + + memcpy (&b, data - 1, 1); + + for (i = percent; i < 100; i++) { + GST_DEBUG (" %d %% -- %d 1/256", i, b); + memcpy (data, &b, 1); + data++; + } + } + } + + GST_DEBUG ("Setting Xing flags to 0x%x\n", xing_flags_tmp); + xing_flags_tmp = GUINT32_TO_BE (xing_flags_tmp); + memcpy (xing_flags, &xing_flags_tmp, 4); + return xing_header; +} + +static void +gst_xing_mux_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + static const GstElementDetails gst_xing_mux_details = + GST_ELEMENT_DETAILS ("MP3 Xing muxer", + "Formatter/Metadata", + "Adds a Xing header to the beginning of a VBR MP3 file", + "Christophe Fergeau "); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_xing_mux_src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_xing_mux_sink_template)); + + GST_DEBUG_CATEGORY_INIT (xing_mux_debug, "xingmux", 0, "Xing Header Muxer"); + + gst_element_class_set_details (element_class, &gst_xing_mux_details); +} + +static void +gst_xing_mux_class_init (GstXingMuxClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_xing_mux_finalize); + gstelement_class->change_state = + GST_DEBUG_FUNCPTR (gst_xing_mux_change_state); +} + +static void +gst_xing_mux_finalize (GObject * obj) +{ + GstXingMux *xing = GST_XING_MUX (obj); + + if (xing->adapter) { + g_object_unref (xing->adapter); + xing->adapter = NULL; + } + + if (xing->seek_table) { + g_list_foreach (xing->seek_table, (GFunc) gst_xing_seek_entry_free, NULL); + g_list_free (xing->seek_table); + xing->seek_table = NULL; + } + + G_OBJECT_CLASS (parent_class)->finalize (obj); +} + +static void +xing_reset (GstXingMux * xing) +{ + xing->duration = GST_CLOCK_TIME_NONE; + xing->byte_count = 0; + + gst_adapter_clear (xing->adapter); + + if (xing->seek_table) { + g_list_foreach (xing->seek_table, (GFunc) gst_xing_seek_entry_free, NULL); + g_list_free (xing->seek_table); + xing->seek_table = NULL; + } + + xing->sent_xing = FALSE; +} + + +static void +gst_xing_mux_init (GstXingMux * xing, GstXingMuxClass * xingmux_class) +{ + GstElementClass *klass = GST_ELEMENT_CLASS (xingmux_class); + + /* pad through which data comes in to the element */ + xing->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "sink"); + gst_pad_set_setcaps_function (xing->sinkpad, + GST_DEBUG_FUNCPTR (gst_pad_proxy_setcaps)); + gst_pad_set_chain_function (xing->sinkpad, + GST_DEBUG_FUNCPTR (gst_xing_mux_chain)); + gst_pad_set_event_function (xing->sinkpad, + GST_DEBUG_FUNCPTR (gst_xing_mux_sink_event)); + gst_element_add_pad (GST_ELEMENT (xing), xing->sinkpad); + + /* pad through which data goes out of the element */ + xing->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); + gst_element_add_pad (GST_ELEMENT (xing), xing->srcpad); + + xing->adapter = gst_adapter_new (); + + xing_reset (xing); +} + +static GstFlowReturn +gst_xing_mux_chain (GstPad * pad, GstBuffer * buffer) +{ + GstXingMux *xing = GST_XING_MUX (GST_PAD_PARENT (pad)); + GstFlowReturn ret = GST_FLOW_OK; + + gst_adapter_push (xing->adapter, buffer); + + while (gst_adapter_available (xing->adapter) >= 4) { + const guchar *data = gst_adapter_peek (xing->adapter, 4); + guint32 header; + GstBuffer *outbuf; + GstClockTime duration; + guint size, spf; + gulong rate; + GstXingSeekEntry *seek_entry; + + header = GST_READ_UINT32_BE (data); + + if (!parse_header (header, &size, &spf, &rate)) { + GST_DEBUG ("Lost sync, resyncing"); + gst_adapter_flush (xing->adapter, 1); + continue; + } + + if (gst_adapter_available (xing->adapter) < size) + break; + + outbuf = gst_adapter_take_buffer (xing->adapter, size); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (xing->srcpad)); + + if (!xing->sent_xing) { + if (has_xing_header (header, GST_BUFFER_DATA (outbuf), size)) { + GST_LOG_OBJECT (xing, "Dropping old Xing header"); + gst_buffer_unref (outbuf); + continue; + } else { + GstBuffer *xing_header; + guint64 xing_header_size; + + xing->first_header = header; + + xing_header = generate_xing_header (xing); + + if (xing_header == NULL) { + GST_ERROR ("Can't generate Xing header"); + gst_buffer_unref (outbuf); + return GST_FLOW_ERROR; + } + + xing_header_size = GST_BUFFER_SIZE (xing_header); + + if (GST_FLOW_IS_FATAL (ret = gst_pad_push (xing->srcpad, xing_header))) { + GST_ERROR_OBJECT (xing, "Failed to push Xing header: %s", + gst_flow_get_name (ret)); + gst_buffer_unref (xing_header); + gst_buffer_unref (outbuf); + return ret; + } + + xing->byte_count += xing_header_size; + xing->sent_xing = TRUE; + } + } + + seek_entry = gst_xing_seek_entry_new (); + seek_entry->timestamp = + (xing->duration == GST_CLOCK_TIME_NONE) ? 0 : xing->duration; + /* Workaround for parsers checking that the first seek table entry is 0 */ + seek_entry->byte = (seek_entry->timestamp == 0) ? 0 : xing->byte_count; + xing->seek_table = g_list_append (xing->seek_table, seek_entry); + + duration = gst_util_uint64_scale (spf, GST_SECOND, rate); + + GST_BUFFER_TIMESTAMP (outbuf) = + (xing->duration == GST_CLOCK_TIME_NONE) ? 0 : xing->duration; + GST_BUFFER_DURATION (outbuf) = duration; + GST_BUFFER_OFFSET (outbuf) = xing->byte_count; + GST_BUFFER_OFFSET_END (outbuf) = + xing->byte_count + GST_BUFFER_SIZE (outbuf); + + xing->byte_count += GST_BUFFER_SIZE (outbuf); + + if (xing->duration == GST_CLOCK_TIME_NONE) + xing->duration = duration; + else + xing->duration += duration; + + if (GST_FLOW_IS_FATAL (ret = gst_pad_push (xing->srcpad, outbuf))) { + GST_ERROR_OBJECT (xing, "Failed to push MP3 frame: %s", + gst_flow_get_name (ret)); + return ret; + } + } + + return ret; +} + +static gboolean +gst_xing_mux_sink_event (GstPad * pad, GstEvent * event) +{ + GstXingMux *xing; + gboolean result; + + xing = GST_XING_MUX (gst_pad_get_parent (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + if (xing->sent_xing) { + GST_ERROR ("Already sent Xing header, dropping NEWSEGMENT event!"); + gst_event_unref (event); + result = FALSE; + } else { + GstFormat fmt; + + gst_event_parse_new_segment (event, NULL, NULL, &fmt, NULL, NULL, NULL); + + if (fmt == GST_FORMAT_BYTES) { + result = gst_pad_push_event (xing->srcpad, event); + } else { + gst_event_unref (event); + + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + 0, GST_CLOCK_TIME_NONE, 0); + + result = gst_pad_push_event (xing->srcpad, event); + } + } + break; + + case GST_EVENT_EOS:{ + GstEvent *n_event; + + GST_DEBUG_OBJECT (xing, "handling EOS event"); + + if (xing->sent_xing) { + + n_event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, + 0, GST_CLOCK_TIME_NONE, 0); + + if (G_UNLIKELY (!gst_pad_push_event (xing->srcpad, n_event))) { + GST_WARNING + ("Failed to seek to position 0 for pushing the Xing header"); + } else { + GstBuffer *header; + GstFlowReturn ret; + + header = generate_xing_header (xing); + + if (header == NULL) { + GST_ERROR ("Can't generate Xing header"); + } else { + + GST_INFO ("Writing real Xing header to beginning of stream"); + + if (GST_FLOW_IS_FATAL (ret = gst_pad_push (xing->srcpad, header))) + GST_WARNING ("Failed to push updated Xing header: %s\n", + gst_flow_get_name (ret)); + } + } + } + result = gst_pad_push_event (xing->srcpad, event); + break; + } + default: + result = gst_pad_event_default (pad, event); + break; + } + gst_object_unref (GST_OBJECT (xing)); + + return result; +} + + +static GstStateChangeReturn +gst_xing_mux_change_state (GstElement * element, GstStateChange transition) +{ + GstXingMux *xing; + GstStateChangeReturn result; + + xing = GST_XING_MUX (element); + + result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + + switch (transition) { + case GST_STATE_CHANGE_PAUSED_TO_READY: + xing_reset (xing); + break; + default: + break; + } + + return result; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/mpegaudioparse/gstxingmux.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/gst/mpegaudioparse/gstxingmux.h Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2006 Christophe Fergeau + * Copyright (c) 2008 Sebastian Dröge + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include + +#ifndef __GST_XINGMUX_H__ +#define __GST_XINGMUX_H__ + +G_BEGIN_DECLS + +/* Standard macros for defining types for this element. */ +#define GST_TYPE_XING_MUX \ + (gst_xing_mux_get_type()) +#define GST_XING_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_XING_MUX,GstXingMux)) +#define GST_XING_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_XING_MUX,GstXingMuxClass)) +#define GST_IS_XING_MUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_XING_MUX)) +#define GST_IS_XING_MUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_XING_MUX)) + +typedef struct _GstXingMux GstXingMux; +typedef struct _GstXingMuxClass GstXingMuxClass; + +/* Definition of structure storing data for this element. */ + +/** + * GstXingMux: + * + * Opaque data structure. + */ +struct _GstXingMux { + GstElement element; + + GstPad *sinkpad, *srcpad; + + /* < private > */ + + GstAdapter *adapter; + GstClockTime duration; + guint64 byte_count; + guint64 frame_count; + GList *seek_table; + gboolean sent_xing; + + /* Copy of the first frame header */ + guint32 first_header; +}; + +/* Standard definition defining a class for this element. */ + +/** + * GstXingMuxClass: + * + * Opaque data structure. + */ +struct _GstXingMuxClass { + GstElementClass parent_class; +}; + +/* Standard function returning type information. */ +#ifdef __SYMBIAN32__ +IMPORT_C +#endif +GType gst_xing_mux_get_type (void); + +G_END_DECLS + +#endif /* __GST_XINGMUX_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/mpegaudioparse/plugin.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/gst/mpegaudioparse/plugin.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,49 @@ +/* GStreamer + * Copyright (C) <2008> Jan Schmidt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include +#include "gstmpegaudioparse.h" +#include "gstxingmux.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + if (!gst_element_register (plugin, "xingmux", GST_RANK_NONE, + GST_TYPE_XING_MUX)) + return FALSE; + if (!gst_element_register (plugin, "mp3parse", GST_RANK_PRIMARY + 1, + GST_TYPE_MP3PARSE)) + return FALSE; + + return TRUE; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "mpegaudioparse", + "MPEG-1 layer 1/2/3 audio stream elements", + plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN); +EXPORT_C GstPluginDesc* _GST_PLUGIN_DESC() +{ + return &gst_plugin_desc; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/qtdemux/gstrtpxqtdepay.h --- a/gst_plugins_good/gst/qtdemux/gstrtpxqtdepay.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/gst/qtdemux/gstrtpxqtdepay.h Thu Jul 22 16:36:00 2010 +0100 @@ -57,6 +57,9 @@ GstBaseRTPDepayloadClass parent_class; }; +#ifdef __SYMBIAN32__ +IMPORT_C +#endif GType gst_rtp_xqt_depay_get_type (void); G_END_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/qtdemux/qtdemux.c --- a/gst_plugins_good/gst/qtdemux/qtdemux.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/gst/qtdemux/qtdemux.c Thu Jul 22 16:36:00 2010 +0100 @@ -4797,7 +4797,10 @@ /* re-route to normal string tag if not 3GP */ if (!qtdemux_is_string_3gp (qtdemux, FOURCC_kywd)) - return qtdemux_tag_add_str (qtdemux, tag, dummy, node); + { + qtdemux_tag_add_str (qtdemux, tag, dummy, node); + return ; + } GST_DEBUG_OBJECT (qtdemux, "found 3gpp keyword tag"); @@ -5013,7 +5016,10 @@ /* re-route to normal string tag if 3GP */ if (qtdemux_is_string_3gp (qtdemux, FOURCC_gnre)) - return qtdemux_tag_add_str (qtdemux, tag, dummy, node); + { + qtdemux_tag_add_str (qtdemux, tag, dummy, node); + return; + } data = qtdemux_tree_get_child_by_type (node, FOURCC_data); if (data) { diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_good/gst/qtdemux/qtdemux.h --- a/gst_plugins_good/gst/qtdemux/qtdemux.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_good/gst/qtdemux/qtdemux.h Thu Jul 22 16:36:00 2010 +0100 @@ -101,6 +101,9 @@ GstElementClass parent_class; }; +#ifdef __SYMBIAN32__ +IMPORT_C +#endif GType gst_qtdemux_get_type (void); G_END_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/group/gstamrmux.mmp --- a/gst_plugins_symbian/group/gstamrmux.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/group/gstamrmux.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,14 +37,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE - - -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/group/gstdevsoundext.mmp --- a/gst_plugins_symbian/group/gstdevsoundext.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/group/gstdevsoundext.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,10 +44,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE - -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/audio +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../gst/devsound SOURCE gsterrorconcealment.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/group/gstdevsoundsink.mmp --- a/gst_plugins_symbian/group/gstdevsoundsink.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/group/gstdevsoundsink.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -44,10 +44,8 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/audio SOURCEPATH ../gst/devsound SOURCE gstdevsoundsinkaudio.c diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/group/gstdevsoundsrc.mmp --- a/gst_plugins_symbian/group/gstdevsoundsrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/group/gstdevsoundsrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -43,10 +43,8 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/audio SOURCEPATH ../gst/devsound diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/AudioRecordBin/group/GstAudioRecordBin.mmp --- a/gst_plugins_symbian/gst/AudioRecordBin/group/GstAudioRecordBin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/AudioRecordBin/group/GstAudioRecordBin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -39,10 +39,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE - -USERINCLUDE ../../../../include/gstreamer -USERINCLUDE ../../../../include/gstreamer/gst -USERINCLUDE ../../../../include/gstreamer/gst/audio +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../inc diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/AudioRecordBin/src/GstAudioRecordBin.cpp --- a/gst_plugins_symbian/gst/AudioRecordBin/src/GstAudioRecordBin.cpp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/AudioRecordBin/src/GstAudioRecordBin.cpp Thu Jul 22 16:36:00 2010 +0100 @@ -29,6 +29,10 @@ #include GST_DEBUG_CATEGORY_STATIC (aud_recbin_cat); // define category (statically) +#ifdef GST_CAT_DEFAULT +#undef GST_CAT_DEFAULT +#endif + #define GST_CAT_DEFAULT aud_recbin_cat // set as default /** Macro to enable weak ref monitoring, used to track @@ -56,9 +60,10 @@ /** The caps expected to be supported by a src pad */ GstCaps* srcCaps; } FilterData; - +#ifdef ENABLE_CAPS_FILTER /** Create the capability filter */ static GstElement* sCreateCapsFilter( GstCaps* encCaps); +#endif /** Creates the element , which accepts \a sinkcaps and * provides \a srccaps on the src pad */ @@ -537,6 +542,7 @@ gst_object_unref( encbin ); return NULL; } +#ifdef ENABLE_CAPS_FILTER /** Create the caps filter */ GstElement* sCreateCapsFilter( GstCaps* encCaps) { @@ -552,7 +558,7 @@ return audiofilter; } - +#endif /** Create a filter, which accepts \a encCaps on sink pad and * provides \a muxCaps on the src pad */ GstElement* sCreateCompatibleFilter(GstFactoryListType type, diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/amrmux/gstamrmux.c --- a/gst_plugins_symbian/gst/amrmux/gstamrmux.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/amrmux/gstamrmux.c Thu Jul 22 16:36:00 2010 +0100 @@ -97,7 +97,7 @@ gst_amrmux_type = g_type_register_static (GST_TYPE_ELEMENT, "GstAmrMux", - &amrmux_info, 0); + &amrmux_info, (GTypeFlags)0); } return gst_amrmux_type; } @@ -138,7 +138,7 @@ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEADER, g_param_spec_boolean ("header", "header", - "For writing AMR header", TRUE, G_PARAM_READWRITE)); + "For writing AMR header", TRUE, (GParamFlags)G_PARAM_READWRITE)); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/devsoundsinkwrapper.cpp --- a/gst_plugins_symbian/gst/devsound/devsoundsinkwrapper.cpp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/devsoundsinkwrapper.cpp Thu Jul 22 16:36:00 2010 +0100 @@ -42,6 +42,7 @@ iIlbcDecoderIntfc = NULL; iCallbackError = KErrNone; iAudioOutput = NULL; + iIsBufferToBeFilledDone = TRUE; } /*********************************************************/ @@ -78,6 +79,7 @@ { User::RequestComplete(stat, KErrNone); iCallbackError = KErrNone; + iIsBufferToBeFilledDone = FALSE; } else { @@ -613,15 +615,19 @@ int playinit(DevSoundWrapper *handle) { TRACE_PRN_FN_ENT; - - ((handle)->AL)->InitialiseActiveListener(); - handle->eosReceived = false; + handle->iCallbackError = KErrNone; + if( handle->iIsBufferToBeFilledDone ) + { + ((handle)->AL)->InitialiseActiveListener(); + handle->eosReceived = false; + + TRAP(handle->iCallbackError,(handle->dev_sound)->PlayInitL()); + if (handle->iCallbackError == KErrNone) + { + ((handle)->AL)->StartActiveScheduler(); + } + } - TRAP(handle->iCallbackError,(handle->dev_sound)->PlayInitL()); - if (handle->iCallbackError == KErrNone) - { - ((handle)->AL)->StartActiveScheduler(); - } TRACE_PRN_IF_ERR(handle->iCallbackError); TRACE_PRN_FN_EXT; @@ -679,7 +685,7 @@ (handle->dev_sound)->PlayData(); ((handle)->AL)->StartActiveScheduler(); - + handle->iIsBufferToBeFilledDone = TRUE; TRACE_PRN_FN_EXT; return KErrNone; } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/devsoundsinkwrapper.h --- a/gst_plugins_symbian/gst/devsound/devsoundsinkwrapper.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/devsoundsinkwrapper.h Thu Jul 22 16:36:00 2010 +0100 @@ -105,7 +105,7 @@ CG729DecoderIntfc* iG729DecoderIntfc; CIlbcDecoderIntfc* iIlbcDecoderIntfc; CAudioOutput* iAudioOutput; - + bool iIsBufferToBeFilledDone; public: void InitializeComplete(TInt aError); diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/devsoundsrcwrapper.cpp --- a/gst_plugins_symbian/gst/devsound/devsoundsrcwrapper.cpp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/devsoundsrcwrapper.cpp Thu Jul 22 16:36:00 2010 +0100 @@ -307,7 +307,7 @@ g_list_foreach(ds->fmt, (GFunc) g_free, NULL); g_list_free(ds->fmt); - + ds->fmt = NULL; delete (STATIC_CAST(DevSoundWrapperSrc*, ds->handle))->iAudoInputRecord; delete ds->handle; TRACE_PRN_FN_EXT; diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstdevsoundsink.c --- a/gst_plugins_symbian/gst/devsound/gstdevsoundsink.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstdevsoundsink.c Thu Jul 22 16:36:00 2010 +0100 @@ -38,6 +38,10 @@ GST_DEBUG_CATEGORY_EXTERN (devsound_debug); +#ifdef GST_CAT_DEFAULT +#undef GST_CAT_DEFAULT +#endif + #define GST_CAT_DEFAULT devsound_debug /* elementfactory information */ @@ -81,7 +85,7 @@ //Error concealment interface impl static void gst_error_concealment_handler_init (gpointer g_iface, gpointer iface_data); -static gint gst_ConcealErrorForNextBuffer(); +static gint gst_ConcealErrorForNextBuffer(void); static gint gst_SetFrameMode(gboolean aFrameMode); static gint gst_FrameModeRqrdForEC(gboolean* aFrameModeRqrd); static void gst_Apply_ErrorConcealment_Update(GstDevsoundSink* dssink); @@ -99,7 +103,7 @@ //G729 interface impl static void gst_g729_decoder_handler_init (gpointer g_iface, gpointer iface_data); -static gint gst_BadLsfNextBuffer(); +static gint gst_BadLsfNextBuffer(void); static void gst_Apply_G729_Decoder_Update(GstDevsoundSink* dssink ); //Ilbc interface impl @@ -207,7 +211,7 @@ "audio/AMR, " "rate = (int) 8000, " "channels = (int) 1 ; " "audio/x-alaw, " "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]; " "audio/g729, " "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]; " - "audio/mp3, " "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]; " + "audio/mpeg, mpegversion = (int) 1, layer = (int) [ 1, 3 ], rate = (int) [ 8000, 48000 ], channels = (int) [ 1, 2 ]; " "audio/ilbc, " "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]; " "audio/x-mulaw, " "rate = (int) [ 8000, 48000 ], " "channels = (int) [ 1, 2 ]") ); @@ -260,7 +264,7 @@ devsoundsink_type = g_type_register_static (GST_TYPE_BASE_SINK, "GstDevsoundSink", - &devsoundsink_info, 0); + &devsoundsink_info, (GTypeFlags)0); g_type_add_interface_static (devsoundsink_type, GST_TYPE_ERROR_CONCEALMENT, @@ -334,15 +338,15 @@ g_object_class_install_property(gobject_class, PROP_DEVICE, g_param_spec_string("device", "Device", "Devsound device ", - DEFAULT_DEVICE, G_PARAM_READWRITE)); + DEFAULT_DEVICE, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, VOLUME, g_param_spec_int("volume", "Volume", "Devsound volume", - -1, G_MAXINT, -1, G_PARAM_READWRITE)); + -1, G_MAXINT, -1, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, VOLUMERAMP, g_param_spec_int("volumeramp", "VolumeRamp", "Devsound volume ramp", - -1, G_MAXINT, -1, G_PARAM_READWRITE)); + -1, G_MAXINT, -1, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, MAXVOLUME, g_param_spec_int("maxvolume", "MaxVolume", "Devsound max volume", @@ -350,11 +354,11 @@ g_object_class_install_property(gobject_class, LEFTBALANCE, g_param_spec_int("leftbalance", "Left Balance", "Left Balance", - -1, G_MAXINT, -1, G_PARAM_READWRITE)); + -1, G_MAXINT, -1, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, RIGHTBALANCE, g_param_spec_int("rightbalance", "Right Balance", "Right Balance", - -1, G_MAXINT, -1, G_PARAM_READWRITE)); + -1, G_MAXINT, -1, (GParamFlags)G_PARAM_READWRITE)); /* g_object_class_install_property(gobject_class, SAMPLESPLAYED, g_param_spec_int("samplesplayed", "Samples Played", "Samples Played", @@ -363,12 +367,12 @@ g_object_class_install_property(gobject_class, PRIORITY, g_param_spec_int("priority", "Priority", "Priority ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, PREFERENCE, g_param_spec_int("preference", "Preference", "Preference ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); /* g_object_class_install_property(gobject_class, RATE, g_param_spec_int("rate", "Rate", "Rate ", -1, @@ -383,7 +387,7 @@ g_object_class_install_property(gobject_class, OUTPUTDEVICE, g_param_spec_int("outputdevice", "Output Device", "Output Device ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); #ifdef AV_SYNC gstelement_class->provide_clock = GST_DEBUG_FUNCPTR (gst_devsound_sink_provide_clock); @@ -821,7 +825,7 @@ { devsoundsink->fourcc = 0x39323747; //KMccFourCCIdG729 } - else if (!strncmp(mimetype, "audio/mp3", 9)) + else if (!strncmp(mimetype, "audio/mpeg", 10)) { devsoundsink->fourcc = 0x33504d20; //KMMFFourCCCodeMP3 } @@ -1221,6 +1225,7 @@ static gint gst_BadLsfNextBuffer() { customInfaceUpdate.g729badlsfnextbufferupdate = TRUE; + return 0; } static void gst_Apply_G729_Decoder_Update(GstDevsoundSink* dssink ) diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstdevsoundsrc.c --- a/gst_plugins_symbian/gst/devsound/gstdevsoundsrc.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstdevsoundsrc.c Thu Jul 22 16:36:00 2010 +0100 @@ -36,6 +36,10 @@ #include "string.h" GST_DEBUG_CATEGORY_EXTERN (devsoundsrc_debug); +#ifdef GST_CAT_DEFAULT +#undef GST_CAT_DEFAULT +#endif + #define GST_CAT_DEFAULT devsoundsrc_debug /* elementfactory information */ @@ -284,7 +288,7 @@ devsoundsrc_type = g_type_register_static (GST_TYPE_PUSH_SRC, "GstDevsoundSrc", - &devsoundsrc_info, 0); + &devsoundsrc_info, (GTypeFlags)0); g_type_add_interface_static (devsoundsrc_type, GST_TYPE_SPEECH_ENCODER_CONFIG, &speech_encoder_config_info); @@ -331,11 +335,11 @@ g_object_class_install_property(gobject_class, PROP_DEVICE, g_param_spec_string("device", "Device", "Devsound device ", - DEFAULT_DEVICE, G_PARAM_READWRITE)); + DEFAULT_DEVICE, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, GAIN, g_param_spec_int( "gain", "Gain", "Devsound src gain", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, MAXGAIN, g_param_spec_int( "maxgain", "MaxGain", "Devsound src max gain", -1, G_MAXINT, -1, @@ -343,11 +347,11 @@ g_object_class_install_property(gobject_class, LEFTBALANCE, g_param_spec_int("leftbalance", "Left Balance", "Left Balance", - -1, G_MAXINT, -1, G_PARAM_READWRITE)); + -1, G_MAXINT, -1, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, RIGHTBALANCE, g_param_spec_int("rightbalance", "Right Balance", - "Right Balance", -1, G_MAXINT, -1, G_PARAM_READWRITE)); + "Right Balance", -1, G_MAXINT, -1, (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, SAMPLESRECORDED, g_param_spec_int("samplesrecorded", "Samples Recorded", @@ -356,22 +360,22 @@ g_object_class_install_property(gobject_class, PRIORITY, g_param_spec_int("priority", "Priority", "Priority ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, PREFERENCE, g_param_spec_int("preference", "Preference", "Preference ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, RATE, g_param_spec_int("rate", "Rate", "Rate ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property(gobject_class, CHANNELS, g_param_spec_int("channels", "Channels", "Channels ", -1, G_MAXINT, -1, - G_PARAM_READWRITE)); + (GParamFlags)G_PARAM_READWRITE)); gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_devsound_src_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_devsound_src_stop); @@ -390,8 +394,9 @@ devsoundsrc->handle=NULL; devsoundsrc->preference = 0; //default=>EMdaPriorityPreferenceNone; devsoundsrc->priority = 0; //default=>EMdaPriorityNormal; - pthread_mutex_init(&create_mutex1, NULL); - pthread_cond_init(&create_condition1, NULL); + devsoundsrc->firstTimeInit = kUnInitialized; +// pthread_mutex_init(&create_mutex1, NULL); +// pthread_cond_init(&create_condition1, NULL); //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) devsoundsrc, "gst_devsound_src_init EXIT ",NULL); } @@ -684,7 +689,9 @@ GstBuffer *tmp_gstbuffer=NULL; GstDevsoundSrc *src= GST_DEVSOUND_SRC(bsrc); //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "gst_devsound_src_start ENTER ",NULL); - + pthread_mutex_init(&create_mutex1, NULL); + pthread_cond_init(&create_condition1, NULL); + if(dataqueue) { while (g_queue_get_length(dataqueue)) @@ -763,6 +770,8 @@ pthread_cond_destroy(&(create_condition1)); g_free(src->device); + src->device = NULL; + src->firstTimeInit = kUnInitialized; //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) src, "gst_devsound_src_stop EXIT "); return TRUE; } @@ -873,8 +882,14 @@ GST_OBJECT_UNLOCK(dsrc); //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "AFTER POP in CREATE ",NULL); if(!popBuffer) - { - return GST_FLOW_UNEXPECTED; + { + return GST_FLOW_UNEXPECTED; + } + if(dsrc->firstTimeInit != kPlayed) + { + dsrc->prevbuffersize = gst_base_src_get_blocksize(src); + gst_base_src_set_blocksize (src, GST_BUFFER_SIZE(popBuffer)); + (*buf)->size = GST_BUFFER_SIZE(popBuffer); } // copy the data from the popped buffer based on how much of the incoming //buffer size is left to fill. we might have filled the fresh buffer somewhat @@ -905,7 +920,19 @@ popBuffer = NULL; } } - } + if (dsrc->firstTimeInit == kPlayBufferPreRoll) + { + gst_base_src_set_blocksize (src, dsrc->prevbuffersize); + dsrc->firstTimeInit = kPlayed; + return GST_FLOW_OK; + } + + if (dsrc->firstTimeInit == kPausedToPlaying) + { + dsrc->firstTimeInit = kPlayBufferPreRoll; + return GST_FLOW_OK; + } + } //gst_debug_log(devsound_debug, GST_LEVEL_LOG, "", "", 0, (GObject *) dsrc, "gst_devsound_src_create EXIT ",NULL); return GST_FLOW_OK; } @@ -916,10 +943,12 @@ { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; GstDevsoundSrc *src= GST_DEVSOUND_SRC (element); - + switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + if (src->firstTimeInit != kPlayed) + src->firstTimeInit = kPausedToPlaying; if(cmd == PAUSE) { cmd = RESUME; diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstdevsoundsrc.h --- a/gst_plugins_symbian/gst/devsound/gstdevsoundsrc.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstdevsoundsrc.h Thu Jul 22 16:36:00 2010 +0100 @@ -54,6 +54,13 @@ gboolean priorityupdate; }; +typedef enum +{ + kUnInitialized = -1, + kPausedToPlaying, + kPlayBufferPreRoll, + kPlayed +} ; struct _GstDevsoundSrc { GstPushSrc src; @@ -86,7 +93,8 @@ gboolean g729vadmode; gint ilbcencodemode; gboolean ilbcvadmode; - + gint firstTimeInit; + guint prevbuffersize; }; diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gsterrorconcealment.c --- a/gst_plugins_symbian/gst/devsound/gsterrorconcealment.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gsterrorconcealment.c Thu Jul 22 16:36:00 2010 +0100 @@ -54,7 +54,7 @@ error_concealment_type = g_type_register_static (G_TYPE_INTERFACE, "GstErrorConcealment", - &error_concealment_info, 0); + &error_concealment_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstg711decoderinterface.c --- a/gst_plugins_symbian/gst/devsound/gstg711decoderinterface.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstg711decoderinterface.c Thu Jul 22 16:36:00 2010 +0100 @@ -56,7 +56,7 @@ g711_decoder_type = g_type_register_static (G_TYPE_INTERFACE, "GstG711DecoderInterface", - &g711_decoder_info, 0); + &g711_decoder_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstg711encoderinterface.c --- a/gst_plugins_symbian/gst/devsound/gstg711encoderinterface.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstg711encoderinterface.c Thu Jul 22 16:36:00 2010 +0100 @@ -55,7 +55,7 @@ g711_encoder_type = g_type_register_static (G_TYPE_INTERFACE, "GstG711EncoderInterface", - &g711_encoder_info, 0); + &g711_encoder_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstg729decoderinterface.c --- a/gst_plugins_symbian/gst/devsound/gstg729decoderinterface.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstg729decoderinterface.c Thu Jul 22 16:36:00 2010 +0100 @@ -55,7 +55,7 @@ g729_decoder_type = g_type_register_static (G_TYPE_INTERFACE, "GstG729DecoderInterface", - &g729_decoder_info, 0); + &g729_decoder_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstg729encoderinterface.c --- a/gst_plugins_symbian/gst/devsound/gstg729encoderinterface.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstg729encoderinterface.c Thu Jul 22 16:36:00 2010 +0100 @@ -54,7 +54,7 @@ g729_encoder_type = g_type_register_static (G_TYPE_INTERFACE, "GstG729EncoderInterface", - &g729_encoder_info, 0); + &g729_encoder_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstilbcdecoderinterface.c --- a/gst_plugins_symbian/gst/devsound/gstilbcdecoderinterface.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstilbcdecoderinterface.c Thu Jul 22 16:36:00 2010 +0100 @@ -55,7 +55,7 @@ ilbc_decoder_type = g_type_register_static (G_TYPE_INTERFACE, "GstIlbcDecoderInterface", - &ilbc_decoder_info, 0); + &ilbc_decoder_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstilbcencoderinterface.c --- a/gst_plugins_symbian/gst/devsound/gstilbcencoderinterface.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstilbcencoderinterface.c Thu Jul 22 16:36:00 2010 +0100 @@ -55,7 +55,7 @@ ilbc_encoder_type = g_type_register_static (G_TYPE_INTERFACE, "GstIlbcEncoderInterface", - &ilbc_encoder_info, 0); + &ilbc_encoder_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/gst/devsound/gstspeechencoderconfig.c --- a/gst_plugins_symbian/gst/devsound/gstspeechencoderconfig.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/gst/devsound/gstspeechencoderconfig.c Thu Jul 22 16:36:00 2010 +0100 @@ -24,7 +24,7 @@ #include "config.h" #endif -#include "gstregistry.h" +#include "gst/gstregistry.h" #include "gstspeechencoderconfig.h" @@ -55,7 +55,7 @@ speech_encoder_config_type = g_type_register_static (G_TYPE_INTERFACE, "GstSpeechEncoderConfig", - &speech_encoder_config_info, 0); + &speech_encoder_config_info, (GTypeFlags)0); } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/tsrc/gstreamertestmodule/group/GStreamerTestClass.mmp --- a/gst_plugins_symbian/tsrc/gstreamertestmodule/group/GStreamerTestClass.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/tsrc/gstreamertestmodule/group/GStreamerTestClass.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -50,10 +50,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE - -USERINCLUDE ../../../../include/gstreamer -USERINCLUDE ../../../../include/gstreamer/gst -USERINCLUDE ../../../../include/gstreamer/gst/base +MW_LAYER_GSTREAMER_SYSTEMINCLUDE // FIXME Fix this path when we check in this project. USERINCLUDE ../../../gst/devsound diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/tsrc/gstreamertestmodule/inc/GStreamerTestClass.h --- a/gst_plugins_symbian/tsrc/gstreamertestmodule/inc/GStreamerTestClass.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/tsrc/gstreamertestmodule/inc/GStreamerTestClass.h Thu Jul 22 16:36:00 2010 +0100 @@ -468,6 +468,7 @@ TInt SetMainLoopRun( CStifItemParser& aItem ); TInt GetConfigureData(); TInt SetConfigureData(); + TInt PlayBack( CStifItemParser& aItem ); diff -r fae53e47b8b4 -r 7ce29e50e9e1 gst_plugins_symbian/tsrc/gstreamertestmodule/src/GStreamerTestClassBlocks.cpp --- a/gst_plugins_symbian/tsrc/gstreamertestmodule/src/GStreamerTestClassBlocks.cpp Fri Jun 11 16:24:58 2010 +0100 +++ b/gst_plugins_symbian/tsrc/gstreamertestmodule/src/GStreamerTestClassBlocks.cpp Thu Jul 22 16:36:00 2010 +0100 @@ -281,6 +281,7 @@ ENTRY( "CheckProperties", CGStreamerTestClass::CheckProperties ), ENTRY( "GstReliabilitytestPlaypause", CGStreamerTestClass::GstReliabilitytestPlaypause ), ENTRY( "GstReliabilitytestRecording", CGStreamerTestClass::GstReliabilitytestRecording ), + ENTRY( "PlayBack", CGStreamerTestClass::PlayBack ), }; const TInt count = sizeof( KFunctions ) / @@ -593,6 +594,142 @@ return KErrNone; } +/*** block b from ../../../docs/manual/highlevel-components.xml ***/ +static gboolean +my_bus_callback (GstBus *bus, + GstMessage *message, + gpointer data) +{ + + GMainLoop *loop = ( GMainLoop * )data; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR: { + GError *err; + gchar *debug; + + gst_message_parse_error (message, &err, &debug); + g_print ("Error: %s\n", err->message); + g_error_free (err); + g_free (debug); + + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_EOS: + + /* end-of-stream */ + g_main_loop_quit (loop); + break; + default: + /* unhandled message */ + break; + } + + /* remove message from the queue */ + return TRUE; +} + +/*** block c from ../../../docs/manual/highlevel-components.xml ***/ +GstElement *pipeline; +GstPad* devsoundsinkpad = NULL; + +static void +cb_newpad (GstElement *decodebin, + GstPad *pad, + gboolean last, + gpointer data) +{ + GstCaps *caps; + GstStructure *str; + GstPadLinkReturn linkret= GST_PAD_LINK_OK ; + + /* check media type */ + caps = gst_pad_get_caps (pad); + str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "audio")) { + gst_caps_unref (caps); + return; + } + gst_caps_unref (caps); + + /* link'n'play */ + linkret = gst_pad_link (pad, devsoundsinkpad); +} + + +gboolean cb_autoplug( GstBin * *bin, + GstPad *pad, + GstCaps *caps, + gpointer user_data) +{ + + GstCaps* sinkcaps = NULL; + gboolean supported = FALSE; + + sinkcaps = gst_pad_get_caps( devsoundsinkpad ); + + supported = gst_caps_is_subset( caps, sinkcaps ); + + if( supported ) + { + return FALSE; + } + + return TRUE; + +} + + + +TInt CGStreamerTestClass::PlayBack( CStifItemParser& aItem ) +{ + GMainLoop *loop; + GstElement *src, *dec, *sink; + GstBus *bus; + + FTRACE(FPrint(_L("CGStreamerTestClass::PlayBack"))); + + iLog->Log(_L(">>filesrc creation ")); + + src = gst_element_factory_make ("filesrc", "source"); + + iLog->Log(_L("<iPipeline),src, NULL); + + iLog->Log(_L(">>decodebin2 creation ")); + dec = gst_element_factory_make ("decodebin2", "decoder"); + iLog->Log(_L("<iPipeline), src, dec, sink, NULL); + + devsoundsinkpad = gst_element_get_pad( sink, "sink"); + + g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL); + g_signal_connect (dec, "autoplug-continue", G_CALLBACK (cb_autoplug), NULL); + + gst_element_link (src, dec); + + iLog->Log(_L("< #else #include #endif diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/libs/gst/check/gstcheck.h --- a/gstreamer_core/libs/gst/check/gstcheck.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/libs/gst/check/gstcheck.h Thu Jul 22 16:36:00 2010 +0100 @@ -29,10 +29,10 @@ #include #include -#include "check.h" + #include "libgstreamer_wsd_solution.h" - +#include #include G_BEGIN_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/libs/gst/controller/gstcontroller.h --- a/gstreamer_core/libs/gst/controller/gstcontroller.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/libs/gst/controller/gstcontroller.h Thu Jul 22 16:36:00 2010 +0100 @@ -30,8 +30,8 @@ #include #include -#include "gstcontrolsource.h" -#include "gstinterpolationcontrolsource.h" +#include +#include G_BEGIN_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/libs/gst/controller/gstcontrolsource.c --- a/gstreamer_core/libs/gst/controller/gstcontrolsource.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/libs/gst/controller/gstcontrolsource.c Thu Jul 22 16:36:00 2010 +0100 @@ -44,7 +44,7 @@ #include #include -#include "gstcontrolsource.h" +#include "gst/controller/gstcontrolsource.h" #define GST_CAT_DEFAULT controller_debug GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT); diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/libs/gst/controller/gstinterpolationcontrolsource.h --- a/gstreamer_core/libs/gst/controller/gstinterpolationcontrolsource.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/libs/gst/controller/gstinterpolationcontrolsource.h Thu Jul 22 16:36:00 2010 +0100 @@ -27,7 +27,7 @@ #include #include -#include "gstcontrolsource.h" +#include "gst/controller/gstcontrolsource.h" G_BEGIN_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/libs/gst/controller/gstlfocontrolsource.h --- a/gstreamer_core/libs/gst/controller/gstlfocontrolsource.h Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/libs/gst/controller/gstlfocontrolsource.h Thu Jul 22 16:36:00 2010 +0100 @@ -27,7 +27,7 @@ #include #include -#include "gstcontrolsource.h" +//#include "gstcontrolsource.h" G_BEGIN_DECLS diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/grammar.y --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/grammar.y Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,932 @@ +%{ + + +#include +#include +#include +#include +#include + +#include "../gst_private.h" +#include "../gst-i18n-lib.h" + +#include "../gstconfig.h" +#include "../gstparse.h" +#include "../gstinfo.h" +#include "../gsterror.h" +#include "../gsturi.h" +#include "../gstutils.h" +#include "../gstvalue.h" +#include "../gstchildproxy.h" +#include "types.h" + +#include +#include + + + + +/* All error messages in this file are user-visible and need to be translated. + * Don't start the message with a capital, and don't end them with a period, + * as they will be presented inside a sentence/error. + */ + +#define YYERROR_VERBOSE 1 +#define YYLEX_PARAM scanner + +typedef void* yyscan_t; + +int _gst_parse_yylex (void * yylval_param , yyscan_t yyscanner); +int _gst_parse_yylex_init (yyscan_t scanner); +int _gst_parse_yylex_destroy (yyscan_t scanner); +struct yy_buffer_state * _gst_parse_yy_scan_string (char* , yyscan_t); +void _gst_parse_yypush_buffer_state (void * new_buffer ,yyscan_t yyscanner ); +void _gst_parse_yypop_buffer_state (yyscan_t yyscanner ); + + +#ifdef __GST_PARSE_TRACE +static guint __strings; +static guint __links; +static guint __chains; +gchar * +__gst_parse_strdup (gchar *org) +{ + gchar *ret; + __strings++; + ret = g_strdup (org); + /* g_print ("ALLOCATED STR (%3u): %p %s\n", __strings, ret, ret); */ + return ret; +} +void +__gst_parse_strfree (gchar *str) +{ + if (str) { + /* g_print ("FREEING STR (%3u): %p %s\n", __strings - 1, str, str); */ + g_free (str); + g_return_if_fail (__strings > 0); + __strings--; + } +} +link_t *__gst_parse_link_new () +{ + link_t *ret; + __links++; + ret = g_new0 (link_t, 1); + /* g_print ("ALLOCATED LINK (%3u): %p\n", __links, ret); */ + return ret; +} +void +__gst_parse_link_free (link_t *data) +{ + if (data) { + /* g_print ("FREEING LINK (%3u): %p\n", __links - 1, data); */ + g_free (data); + g_return_if_fail (__links > 0); + __links--; + } +} +chain_t * +__gst_parse_chain_new () +{ + chain_t *ret; + __chains++; + ret = g_new0 (chain_t, 1); + /* g_print ("ALLOCATED CHAIN (%3u): %p\n", __chains, ret); */ + return ret; +} +void +__gst_parse_chain_free (chain_t *data) +{ + /* g_print ("FREEING CHAIN (%3u): %p\n", __chains - 1, data); */ + g_free (data); + g_return_if_fail (__chains > 0); + __chains--; +} + +#endif /* __GST_PARSE_TRACE */ + +typedef struct { + gchar *src_pad; + gchar *sink_pad; + GstElement *sink; + GstCaps *caps; + gulong signal_id; + /* FIXME: need to connect to "disposed" signal to clean up, + * but there is no such signal */ +} DelayedLink; + +typedef struct { + GstElement *parent; + gchar *name; + gchar *value_str; + gulong signal_id; +} DelayedSet; + +/*** define SET_ERROR and ERROR macros/functions */ + +#ifdef G_HAVE_ISO_VARARGS + +# define SET_ERROR(error, type, ...) \ +G_STMT_START { \ + GST_CAT_ERROR (GST_CAT_PIPELINE, __VA_ARGS__); \ + if ((error) && !*(error)) { \ + g_set_error ((error), GST_PARSE_ERROR, (type), __VA_ARGS__); \ + } \ +} G_STMT_END + +# define ERROR(type, ...) \ + SET_ERROR (((graph_t *) graph)->error, (type), __VA_ARGS__ ) + +#elif defined(G_HAVE_GNUC_VARARGS) + +# define SET_ERROR(error, type, args...) \ +G_STMT_START { \ + GST_CAT_ERROR (GST_CAT_PIPELINE, args ); \ + if ((error) && !*(error)) { \ + g_set_error ((error), GST_PARSE_ERROR, (type), args ); \ + } \ +} G_STMT_END + +# define ERROR(type, args...) \ + SET_ERROR (((graph_t *) graph)->error,(type) , args ) + +#else + +static inline void +SET_ERROR (GError **error, gint type, const char *format, ...) +{ + if (error) { + if (*error) { + g_warning ("error while parsing"); + } else { + va_list varargs; + char *string; + + va_start (varargs, format); + string = g_strdup_vprintf (format, varargs); + va_end (varargs); + + g_set_error (error, GST_PARSE_ERROR, type, string); + + g_free (string); + } + } +} + +#endif /* G_HAVE_ISO_VARARGS */ + +/*** define YYPRINTF macro/function if we're debugging */ + +/* bison 1.35 calls this macro with side effects, we need to make sure the + side effects work - crappy bison */ + +#ifndef GST_DISABLE_GST_DEBUG +# define YYDEBUG 1 + +# ifdef G_HAVE_ISO_VARARGS + +/* # define YYFPRINTF(a, ...) GST_CAT_DEBUG (GST_CAT_PIPELINE, __VA_ARGS__) */ +# define YYFPRINTF(a, ...) \ +G_STMT_START { \ + gchar *temp = g_strdup_printf (__VA_ARGS__); \ + GST_CAT_LOG (GST_CAT_PIPELINE, temp); \ + g_free (temp); \ +} G_STMT_END + +# elif defined(G_HAVE_GNUC_VARARGS) + +# define YYFPRINTF(a, args...) \ +G_STMT_START { \ + gchar *temp = g_strdup_printf ( args ); \ + GST_CAT_LOG (GST_CAT_PIPELINE, temp); \ + g_free (temp); \ +} G_STMT_END + +# else + +static inline void +YYPRINTF(const char *format, ...) +{ + va_list varargs; + gchar *temp; + + va_start (varargs, format); + temp = g_strdup_vprintf (format, varargs); + GST_CAT_LOG (GST_CAT_PIPELINE, "%s", temp); + g_free (temp); + va_end (varargs); +} + +# endif /* G_HAVE_ISO_VARARGS */ + +#endif /* GST_DISABLE_GST_DEBUG */ + +#define GST_BIN_MAKE(res, type, chainval, assign, free_string) \ +G_STMT_START { \ + chain_t *chain = chainval; \ + GSList *walk; \ + GstBin *bin = (GstBin *) gst_element_factory_make (type, NULL); \ + if (!chain) { \ + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_EMPTY_BIN, \ + _("specified empty bin \"%s\", not allowed"), type); \ + g_slist_foreach (assign, (GFunc) gst_parse_strfree, NULL); \ + g_slist_free (assign); \ + gst_object_unref (bin); \ + if (free_string) \ + gst_parse_strfree (type); /* Need to clean up the string */ \ + YYERROR; \ + } else if (!bin) { \ + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, \ + _("no bin \"%s\", skipping"), type); \ + g_slist_foreach (assign, (GFunc) gst_parse_strfree, NULL); \ + g_slist_free (assign); \ + res = chain; \ + } else { \ + for (walk = chain->elements; walk; walk = walk->next ) \ + gst_bin_add (bin, GST_ELEMENT (walk->data)); \ + g_slist_free (chain->elements); \ + chain->elements = g_slist_prepend (NULL, bin); \ + res = chain; \ + /* set the properties now */ \ + for (walk = assign; walk; walk = walk->next) \ + gst_parse_element_set ((gchar *) walk->data, GST_ELEMENT (bin), graph); \ + g_slist_free (assign); \ + } \ +} G_STMT_END + +#define MAKE_LINK(link, _src, _src_name, _src_pads, _sink, _sink_name, _sink_pads) \ +G_STMT_START { \ + link = gst_parse_link_new (); \ + link->src = _src; \ + link->sink = _sink; \ + link->src_name = _src_name; \ + link->sink_name = _sink_name; \ + link->src_pads = _src_pads; \ + link->sink_pads = _sink_pads; \ + link->caps = NULL; \ +} G_STMT_END + +#define MAKE_REF(link, _src, _pads) \ +G_STMT_START { \ + gchar *padname = _src; \ + GSList *pads = _pads; \ + if (padname) { \ + while (*padname != '.') padname++; \ + *padname = '\0'; \ + padname++; \ + if (*padname != '\0') \ + pads = g_slist_prepend (pads, gst_parse_strdup (padname)); \ + } \ + MAKE_LINK (link, NULL, _src, pads, NULL, NULL, NULL); \ +} G_STMT_END + +static void gst_parse_new_child(GstChildProxy *child_proxy, GObject *object, + gpointer data) +{ + DelayedSet *set = (DelayedSet *) data; + GParamSpec *pspec; + GValue v = { 0, }; + GstObject *target = NULL; + GType value_type; + + if (gst_child_proxy_lookup (GST_OBJECT (set->parent), set->name, &target, &pspec)) { + value_type = G_PARAM_SPEC_VALUE_TYPE (pspec); + + GST_CAT_LOG (GST_CAT_PIPELINE, "parsing delayed property %s as a %s from %s", pspec->name, + g_type_name (value_type), set->value_str); + g_value_init (&v, value_type); + if (gst_value_deserialize (&v, set->value_str)) { + g_object_set_property (G_OBJECT (target), pspec->name, &v); + } + g_signal_handler_disconnect (child_proxy, set->signal_id); + g_free(set->name); + g_free(set->value_str); + g_free(set); + } + + if (G_IS_VALUE (&v)) + g_value_unset (&v); + if (target) + gst_object_unref (target); + return; +} + + +static void +gst_parse_element_set (gchar *value, GstElement *element, graph_t *graph) +{ + GParamSpec *pspec; + gchar *pos = value; + GValue v = { 0, }; + GstObject *target = NULL; + GType value_type; + + /* parse the string, so the property name is null-terminated an pos points + to the beginning of the value */ + while (!g_ascii_isspace (*pos) && (*pos != '=')) pos++; + if (*pos == '=') { + *pos = '\0'; + } else { + *pos = '\0'; + pos++; + while (g_ascii_isspace (*pos)) pos++; + } + pos++; + while (g_ascii_isspace (*pos)) pos++; + if (*pos == '"') { + pos++; + pos[strlen (pos) - 1] = '\0'; + } + gst_parse_unescape (pos); + + if (gst_child_proxy_lookup (GST_OBJECT (element), value, &target, &pspec)) { + value_type = G_PARAM_SPEC_VALUE_TYPE (pspec); + GST_CAT_LOG (GST_CAT_PIPELINE, "parsing property %s as a %s", pspec->name, + g_type_name (value_type)); + g_value_init (&v, value_type); + if (!gst_value_deserialize (&v, pos)) + goto error; + g_object_set_property (G_OBJECT (target), pspec->name, &v); + } else { + /* do a delayed set */ + if (GST_IS_CHILD_PROXY (element)) { + DelayedSet *data = g_new (DelayedSet, 1); + + data->parent = element; + data->name = g_strdup(value); + data->value_str = g_strdup(pos); + data->signal_id = g_signal_connect(GST_OBJECT (element),"child-added", G_CALLBACK (gst_parse_new_child), data); + } + else { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_PROPERTY, \ + _("no property \"%s\" in element \"%s\""), value, \ + GST_ELEMENT_NAME (element)); + } + } + +out: + gst_parse_strfree (value); + if (G_IS_VALUE (&v)) + g_value_unset (&v); + if (target) + gst_object_unref (target); + return; + +error: + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY, + _("could not set property \"%s\" in element \"%s\" to \"%s\""), + value, GST_ELEMENT_NAME (element), pos); + goto out; +} +static inline void +gst_parse_free_link (link_t *link) +{ + gst_parse_strfree (link->src_name); + gst_parse_strfree (link->sink_name); + g_slist_foreach (link->src_pads, (GFunc) gst_parse_strfree, NULL); + g_slist_foreach (link->sink_pads, (GFunc) gst_parse_strfree, NULL); + g_slist_free (link->src_pads); + g_slist_free (link->sink_pads); + if (link->caps) gst_caps_unref (link->caps); + gst_parse_link_free (link); +} + +static void +gst_parse_found_pad (GstElement *src, GstPad *pad, gpointer data) +{ + DelayedLink *link = (DelayedLink *) data; + + GST_CAT_INFO (GST_CAT_PIPELINE, "trying delayed linking %s:%s to %s:%s", + GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (link->src_pad), + GST_STR_NULL (GST_ELEMENT_NAME (link->sink)), GST_STR_NULL (link->sink_pad)); + + if (gst_element_link_pads_filtered (src, link->src_pad, link->sink, + link->sink_pad, link->caps)) { + /* do this here, we don't want to get any problems later on when + * unlocking states */ + GST_CAT_DEBUG (GST_CAT_PIPELINE, "delayed linking %s:%s to %s:%s worked", + GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (link->src_pad), + GST_STR_NULL (GST_ELEMENT_NAME (link->sink)), GST_STR_NULL (link->sink_pad)); + g_signal_handler_disconnect (src, link->signal_id); + g_free (link->src_pad); + g_free (link->sink_pad); + if (link->caps) gst_caps_unref (link->caps); + g_free (link); + } +} +/* both padnames and the caps may be NULL */ +static gboolean +gst_parse_perform_delayed_link (GstElement *src, const gchar *src_pad, + GstElement *sink, const gchar *sink_pad, + GstCaps *caps) +{ + GList *templs = gst_element_class_get_pad_template_list ( + GST_ELEMENT_GET_CLASS (src)); + + for (; templs; templs = templs->next) { + GstPadTemplate *templ = (GstPadTemplate *) templs->data; + if ((GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SRC) && + (GST_PAD_TEMPLATE_PRESENCE(templ) == GST_PAD_SOMETIMES)) + { + DelayedLink *data = g_new (DelayedLink, 1); + + /* TODO: maybe we should check if src_pad matches this template's names */ + + GST_CAT_DEBUG (GST_CAT_PIPELINE, "trying delayed link %s:%s to %s:%s", + GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (src_pad), + GST_STR_NULL (GST_ELEMENT_NAME (sink)), GST_STR_NULL (sink_pad)); + + data->src_pad = g_strdup (src_pad); + data->sink = sink; + data->sink_pad = g_strdup (sink_pad); + if (caps) { + data->caps = gst_caps_copy (caps); + } else { + data->caps = NULL; + } + data->signal_id = g_signal_connect (G_OBJECT (src), "pad-added", + G_CALLBACK (gst_parse_found_pad), data); + return TRUE; + } + } + return FALSE; +} +/* + * performs a link and frees the struct. src and sink elements must be given + * return values 0 - link performed + * 1 - link delayed + * <0 - error + */ +static gint +gst_parse_perform_link (link_t *link, graph_t *graph) +{ + GstElement *src = link->src; + GstElement *sink = link->sink; + GSList *srcs = link->src_pads; + GSList *sinks = link->sink_pads; + g_assert (GST_IS_ELEMENT (src)); + g_assert (GST_IS_ELEMENT (sink)); + + GST_CAT_INFO (GST_CAT_PIPELINE, + "linking %s:%s to %s:%s (%u/%u) with caps \"%" GST_PTR_FORMAT "\"", + GST_ELEMENT_NAME (src), link->src_name ? link->src_name : "(any)", + GST_ELEMENT_NAME (sink), link->sink_name ? link->sink_name : "(any)", + g_slist_length (srcs), g_slist_length (sinks), link->caps); + + if (!srcs || !sinks) { + if (gst_element_link_pads_filtered (src, + srcs ? (const gchar *) srcs->data : NULL, sink, + sinks ? (const gchar *) sinks->data : NULL, link->caps)) { + goto success; + } else { + if (gst_parse_perform_delayed_link (src, + srcs ? (const gchar *) srcs->data : NULL, + sink, sinks ? (const gchar *) sinks->data : NULL, link->caps)) { + goto success; + } else { + goto error; + } + } + } + if (g_slist_length (link->src_pads) != g_slist_length (link->src_pads)) { + goto error; + } + while (srcs && sinks) { + const gchar *src_pad = (const gchar *) srcs->data; + const gchar *sink_pad = (const gchar *) sinks->data; + srcs = g_slist_next (srcs); + sinks = g_slist_next (sinks); + if (gst_element_link_pads_filtered (src, src_pad, sink, sink_pad, + link->caps)) { + continue; + } else { + if (gst_parse_perform_delayed_link (src, src_pad, + sink, sink_pad, + link->caps)) { + continue; + } else { + goto error; + } + } + } + +success: + gst_parse_free_link (link); + return 0; + +error: + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, + _("could not link %s to %s"), GST_ELEMENT_NAME (src), + GST_ELEMENT_NAME (sink)); + gst_parse_free_link (link); + return -1; +} + + +static int yyerror (void *scanner, graph_t *graph, const char *s); +%} + +%union { + gchar *s; + chain_t *c; + link_t *l; + GstElement *e; + GSList *p; + graph_t *g; +} + +%token PARSE_URL +%token IDENTIFIER +%left REF PADREF BINREF +%token ASSIGNMENT +%token LINK + +%type graph +%type chain bin +%type reference +%type linkpart link +%type

linklist +%type element +%type

padlist pads assignments + +%left '(' ')' +%left ',' +%right '.' +%left '!' '=' + +%parse-param { void *scanner } +%parse-param { graph_t *graph } +%pure-parser + +%start graph +%% + +element: IDENTIFIER { $$ = gst_element_factory_make ($1, NULL); + if ($$ == NULL) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no element \"%s\""), $1); + gst_parse_strfree ($1); + YYERROR; + } + gst_parse_strfree ($1); + } + | element ASSIGNMENT { gst_parse_element_set ($2, $1, graph); + $$ = $1; + } + ; +assignments: /* NOP */ { $$ = NULL; } + | assignments ASSIGNMENT { $$ = g_slist_prepend ($1, $2); } + ; +bin: '(' assignments chain ')' { GST_BIN_MAKE ($$, "bin", $3, $2, FALSE); } + | BINREF assignments chain ')' { GST_BIN_MAKE ($$, $1, $3, $2, TRUE); + gst_parse_strfree ($1); + } + | BINREF assignments ')' { GST_BIN_MAKE ($$, $1, NULL, $2, TRUE); + gst_parse_strfree ($1); + } + | BINREF assignments error ')' { GST_BIN_MAKE ($$, $1, NULL, $2, TRUE); + gst_parse_strfree ($1); + } + ; + +pads: PADREF { $$ = g_slist_prepend (NULL, $1); } + | PADREF padlist { $$ = $2; + $$ = g_slist_prepend ($$, $1); + } + ; +padlist: ',' IDENTIFIER { $$ = g_slist_prepend (NULL, $2); } + | ',' IDENTIFIER padlist { $$ = g_slist_prepend ($3, $2); } + ; + +reference: REF { MAKE_REF ($$, $1, NULL); } + | REF padlist { MAKE_REF ($$, $1, $2); } + ; + +linkpart: reference { $$ = $1; } + | pads { MAKE_REF ($$, NULL, $1); } + | /* NOP */ { MAKE_REF ($$, NULL, NULL); } + ; + +link: linkpart LINK linkpart { $$ = $1; + if ($2) { + $$->caps = gst_caps_from_string ($2); + if ($$->caps == NULL) + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("could not parse caps \"%s\""), $2); + gst_parse_strfree ($2); + } + $$->sink_name = $3->src_name; + $$->sink_pads = $3->src_pads; + gst_parse_link_free ($3); + } + ; + +linklist: link { $$ = g_slist_prepend (NULL, $1); } + | link linklist { $$ = g_slist_prepend ($2, $1); } + | linklist error { $$ = $1; } + ; + +chain: element { $$ = gst_parse_chain_new (); + $$->first = $$->last = $1; + $$->front = $$->back = NULL; + $$->elements = g_slist_prepend (NULL, $1); + } + | bin { $$ = $1; } + | chain chain { if ($1->back && $2->front) { + if (!$1->back->sink_name) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element")); + gst_parse_free_link ($1->back); + } else { + ((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $1->back); + } + if (!$2->front->src_name) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without sink element")); + gst_parse_free_link ($2->front); + } else { + ((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $2->front); + } + $1->back = NULL; + } else if ($1->back) { + if (!$1->back->sink_name) { + $1->back->sink = $2->first; + } + } else if ($2->front) { + if (!$2->front->src_name) { + $2->front->src = $1->last; + } + $1->back = $2->front; + } + + if ($1->back) { + ((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $1->back); + } + $1->last = $2->last; + $1->back = $2->back; + $1->elements = g_slist_concat ($1->elements, $2->elements); + if ($2) + gst_parse_chain_free ($2); + $$ = $1; + } + | chain linklist { GSList *walk; + if ($1->back) { + $2 = g_slist_prepend ($2, $1->back); + $1->back = NULL; + } else { + if (!((link_t *) $2->data)->src_name) { + ((link_t *) $2->data)->src = $1->last; + } + } + for (walk = $2; walk; walk = walk->next) { + link_t *link = (link_t *) walk->data; + if (!link->sink_name && walk->next) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without sink element")); + gst_parse_free_link (link); + } else if (!link->src_name && !link->src) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element")); + gst_parse_free_link (link); + } else { + if (walk->next) { + ((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, link); + } else { + $1->back = link; + } + } + } + g_slist_free ($2); + $$ = $1; + } + | chain error { $$ = $1; } + | link chain { if ($2->front) { + if (!$2->front->src_name) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element")); + gst_parse_free_link ($2->front); + } else { + ((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $2->front); + } + } + if (!$1->sink_name) { + $1->sink = $2->first; + } + $2->front = $1; + $$ = $2; + } + | PARSE_URL chain { $$ = $2; + if ($$->front) { + GstElement *element = + gst_element_make_from_uri (GST_URI_SRC, $1, NULL); + if (!element) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, + _("no source element for URI \"%s\""), $1); + } else { + $$->front->src = element; + ((graph_t *) graph)->links = g_slist_prepend ( + ((graph_t *) graph)->links, $$->front); + $$->front = NULL; + $$->elements = g_slist_prepend ($$->elements, element); + } + } else { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, + _("no element to link URI \"%s\" to"), $1); + } + g_free ($1); + } + | link PARSE_URL { GstElement *element = + gst_element_make_from_uri (GST_URI_SINK, $2, NULL); + if (!element) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, + _("no sink element for URI \"%s\""), $2); + gst_parse_link_free ($1); + g_free ($2); + YYERROR; + } else if ($1->sink_name || $1->sink_pads) { + gst_object_unref (element); + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, + _("could not link sink element for URI \"%s\""), $2); + gst_parse_link_free ($1); + g_free ($2); + YYERROR; + } else { + $$ = gst_parse_chain_new (); + $$->first = $$->last = element; + $$->front = $1; + $$->front->sink = element; + $$->elements = g_slist_prepend (NULL, element); + } + g_free ($2); + } + ; +graph: /* NOP */ { SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_EMPTY, _("empty pipeline not allowed")); + $$ = (graph_t *) graph; + } + | chain { $$ = (graph_t *) graph; + if ($1->front) { + if (!$1->front->src_name) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element")); + gst_parse_free_link ($1->front); + } else { + $$->links = g_slist_prepend ($$->links, $1->front); + } + $1->front = NULL; + } + if ($1->back) { + if (!$1->back->sink_name) { + SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without sink element")); + gst_parse_free_link ($1->back); + } else { + $$->links = g_slist_prepend ($$->links, $1->back); + } + $1->back = NULL; + } + $$->chain = $1; + } + ; + +%% + + +static int +yyerror (void *scanner, graph_t *graph, const char *s) +{ + /* FIXME: This should go into the GError somehow, but how? */ + GST_WARNING ("Error during parsing: %s", s); + return -1; +} + + +GstElement * +_gst_parse_launch (const gchar *str, GError **error) +{ + graph_t g; + gchar *dstr; + GSList *walk; + GstBin *bin = NULL; + GstElement *ret; + yyscan_t scanner; + + g_return_val_if_fail (str != NULL, NULL); + + g.chain = NULL; + g.links = NULL; + g.error = error; + +#ifdef __GST_PARSE_TRACE + GST_CAT_DEBUG (GST_CAT_PIPELINE, "TRACE: tracing enabled"); + __strings = __chains = __links = 0; +#endif /* __GST_PARSE_TRACE */ + + dstr = g_strdup (str); + _gst_parse_yylex_init (&scanner); + _gst_parse_yy_scan_string (dstr, scanner); + +#ifndef YYDEBUG + yydebug = 1; +#endif + + if (yyparse (scanner, &g) != 0) { + SET_ERROR (error, GST_PARSE_ERROR_SYNTAX, + "Unrecoverable syntax error while parsing pipeline %s", str); + + _gst_parse_yylex_destroy (scanner); + g_free (dstr); + + goto error1; + } + _gst_parse_yylex_destroy (scanner); + g_free (dstr); + + GST_CAT_DEBUG (GST_CAT_PIPELINE, "got %u elements and %u links", + g.chain ? g_slist_length (g.chain->elements) : 0, + g_slist_length (g.links)); + + if (!g.chain) { + ret = NULL; + } else if (!(((chain_t *) g.chain)->elements->next)) { + /* only one toplevel element */ + ret = (GstElement *) ((chain_t *) g.chain)->elements->data; + g_slist_free (((chain_t *) g.chain)->elements); + if (GST_IS_BIN (ret)) + bin = GST_BIN (ret); + gst_parse_chain_free (g.chain); + } else { + /* put all elements in our bin */ + bin = GST_BIN (gst_element_factory_make ("pipeline", NULL)); + g_assert (bin); + + for (walk = g.chain->elements; walk; walk = walk->next) { + if (walk->data != NULL) + gst_bin_add (bin, GST_ELEMENT (walk->data)); + } + + g_slist_free (g.chain->elements); + ret = GST_ELEMENT (bin); + gst_parse_chain_free (g.chain); + } + + /* remove links */ + for (walk = g.links; walk; walk = walk->next) { + link_t *l = (link_t *) walk->data; + if (!l->src) { + if (l->src_name) { + if (bin) { + l->src = gst_bin_get_by_name_recurse_up (bin, l->src_name); + if (l->src) + gst_object_unref (l->src); + } else { + l->src = strcmp (GST_ELEMENT_NAME (ret), l->src_name) == 0 ? ret : NULL; + } + } + if (!l->src) { + SET_ERROR (error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, + "No element named \"%s\" - omitting link", l->src_name); + gst_parse_free_link (l); + continue; + } + } + if (!l->sink) { + if (l->sink_name) { + if (bin) { + l->sink = gst_bin_get_by_name_recurse_up (bin, l->sink_name); + if (l->sink) + gst_object_unref (l->sink); + } else { + l->sink = strcmp (GST_ELEMENT_NAME (ret), l->sink_name) == 0 ? ret : NULL; + } + } + if (!l->sink) { + SET_ERROR (error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, + "No element named \"%s\" - omitting link", l->sink_name); + gst_parse_free_link (l); + continue; + } + } + gst_parse_perform_link (l, &g); + } + g_slist_free (g.links); + +out: +#ifdef __GST_PARSE_TRACE + GST_CAT_DEBUG (GST_CAT_PIPELINE, + "TRACE: %u strings, %u chains and %u links left", __strings, __chains, + __links); + if (__strings || __chains || __links) { + g_warning ("TRACE: %u strings, %u chains and %u links left", __strings, + __chains, __links); + } +#endif /* __GST_PARSE_TRACE */ + + return ret; + +error1: + if (g.chain) { + g_slist_foreach (g.chain->elements, (GFunc)gst_object_unref, NULL); + g_slist_free (g.chain->elements); + gst_parse_chain_free (g.chain); + } + + g_slist_foreach (g.links, (GFunc)gst_parse_free_link, NULL); + g_slist_free (g.links); + + if (error) + g_assert (*error); + ret = NULL; + + goto out; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/group/bld.inf Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,28 @@ + +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + + +PRJ_MMPFILES +gst-inspect.mmp +gst-typefind.mmp +gst-launch.mmp \ No newline at end of file diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/group/gst-inspect.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/group/gst-inspect.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,79 @@ +//createelementcore.mmp +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + +#include + +TARGET gst-inspect.exe +TARGETTYPE exe +UID 0 0x0AB230B2 + +#ifdef EKA2 +LANG SC +CAPABILITY All -Tcb +//VENDORID VID_DEFAULT +#endif + + +MACRO __SYMBIAN32__ +MACRO HAVE_CONFIG_H +MACRO DISABLE_FAULT_HANDLER + + + + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE + +OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + + +USERINCLUDE ../ +USERINCLUDE ../../ +USERINCLUDE ../../gst +SOURCEPATH ../ +SOURCE gst-inspect.c + +LIBRARY libgstreamer.lib +LIBRARY euser.lib +LIBRARY libc.lib +LIBRARY libpthread.lib +LIBRARY libdl.lib +LIBRARY libm.lib +LIBRARY libz.lib +LIBRARY libglib.lib +LIBRARY libgmodule.lib +LIBRARY libgobject.lib +LIBRARY libgthread.lib + + +LIBRARY libgstnet.lib +LIBRARY libgstbase.lib +LIBRARY libgstcontroller.lib +LIBRARY libgstdataprotocol.lib + +STATICLIBRARY libcrt0.lib + +EPOCSTACKSIZE 0x5000 + +EPOCHEAPSIZE 0x500 0x1000000 diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/group/gst-launch.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/group/gst-launch.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,77 @@ +//createelementcore.mmp +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + +#include + +TARGET gst-launch.exe +TARGETTYPE exe +UID 0 0x0AB230B3 + +#ifdef EKA2 +LANG SC +CAPABILITY All -Tcb +//VENDORID VID_DEFAULT +#endif + + +MACRO __SYMBIAN32__ +MACRO HAVE_CONFIG_H +MACRO __SYMBIAN32__ DISABLE_FAULT_HANDLER + + + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE + +OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + +USERINCLUDE ../ +USERINCLUDE ../../ +USERINCLUDE ../../gst +SOURCEPATH ../ + +SOURCE gst-launch.c + +LIBRARY libgstreamer.lib +LIBRARY euser.lib +LIBRARY libc.lib +LIBRARY libpthread.lib +LIBRARY libdl.lib +LIBRARY libglib.lib +LIBRARY libgmodule.lib +LIBRARY libgobject.lib +LIBRARY libgthread.lib +LIBRARY libm.lib +LIBRARY libz.lib + +LIBRARY libgstnet.lib +LIBRARY libgstbase.lib +LIBRARY libgstcontroller.lib +LIBRARY libgstdataprotocol.lib + +STATICLIBRARY libcrt0.lib + +EPOCSTACKSIZE 0x5000 + +EPOCHEAPSIZE 0x500 0x1000000 diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/group/gst-typefind.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/group/gst-typefind.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,78 @@ +//createelementcore.mmp +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + +#include + +TARGET gst-typefind.exe +TARGETTYPE exe +UID 0 0x0AB230B4 + +#ifdef EKA2 +LANG SC +CAPABILITY All -Tcb +//VENDORID VID_DEFAULT +#endif + + +MACRO __SYMBIAN32__ +MACRO HAVE_CONFIG_H +MACRO __SYMBIAN32__ DISABLE_FAULT_HANDLER + + + + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE + +OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + +USERINCLUDE ../ +USERINCLUDE ../../ +USERINCLUDE ../../gst +SOURCEPATH ../ + +SOURCE gst-typefind.c + +LIBRARY libgstreamer.lib +LIBRARY euser.lib +LIBRARY libc.lib +LIBRARY libpthread.lib +LIBRARY libdl.lib +LIBRARY libglib.lib +LIBRARY libgmodule.lib +LIBRARY libgobject.lib +LIBRARY libgthread.lib +LIBRARY libm.lib +LIBRARY libz.lib + +LIBRARY libgstnet.lib +LIBRARY libgstbase.lib +LIBRARY libgstcontroller.lib +LIBRARY libgstdataprotocol.lib + +STATICLIBRARY libcrt0.lib + +EPOCSTACKSIZE 0x5000 + +EPOCHEAPSIZE 0x500 0x1000000 diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/group/testgstreamer.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/group/testgstreamer.pkg Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,36 @@ +; ============================================================================ +; Name : gstreamer.pkg +; Part of : Gstreamer project +; Description : Package file for all gstreamer libraries +; +; Version : %version: da1mmcf#3 % +; +; Copyright © 2002-2006 Nokia. All rights reserved. +; This material, including documentation and any related computer +; programs, is protected by copyright controlled by Nokia. All +; rights are reserved. Copying, including reproducing, storing, +; adapting or translating, any or all of this material requires the +; prior written consent of Nokia. This material also contains +; confidential information which may not be disclosed to others +; without the prior written consent of Nokia. +; ============================================================================ + +;Languages +&EN + +;Header +#{"testgstreamer.pkg"},(0x2001F47C),1,0,0 + +;Supports S60 3.0 +[0x101F7961], 0, 0, 0, {"S60ProductID"} + +;Localised Vendor name +%{"Nokia Testing EN"} + +;Unique Vendor name +:"Vendor" + + +"\epoc32\release\armv5\urel\gst-inspect.exe"-"!:\sys\bin\gst-inspect.exe" +"\epoc32\release\armv5\urel\gst-typefind.exe"-"!:\sys\bin\gst-typefind.exe" +"\epoc32\release\armv5\urel\gst-launch.exe"-"!:\sys\bin\gst-launch.exe" \ No newline at end of file diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/group/tools.pkg Binary file gstreamer_core/tools/group/tools.pkg has changed diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/gst-inspect.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/gst-inspect.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,1401 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2004 Thomas Vander Stichele + * + * gst-inspect.c: tool to inspect the GStreamer registry + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + + +#include +#include "tools.h" + +#include +#include +#include +#include +#include + +static char *_name = NULL; + +static int print_element_info (GstElementFactory * factory, + gboolean print_names); + +static void +n_print (const char *format, ...) +{ + va_list args; + gint retval; + + if (_name) + g_print (_name); + + va_start (args, format); + retval = g_vprintf (format, args); + va_end (args); +} + +static gboolean +print_field (GQuark field, const GValue * value, gpointer pfx) +{ + gchar *str = gst_value_serialize (value); + + n_print ("%s %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str); + g_free (str); + return TRUE; +} + +static void +print_caps (const GstCaps * caps, const gchar * pfx) +{ + guint i; + + g_return_if_fail (caps != NULL); + + if (gst_caps_is_any (caps)) { + n_print ("%sANY\n", pfx); + return; + } + if (gst_caps_is_empty (caps)) { + n_print ("%sEMPTY\n", pfx); + return; + } + + for (i = 0; i < gst_caps_get_size (caps); i++) { + GstStructure *structure = gst_caps_get_structure (caps, i); + + n_print ("%s%s\n", pfx, gst_structure_get_name (structure)); + gst_structure_foreach (structure, print_field, (gpointer) pfx); + } +} + +#if 0 +static void +print_formats (const GstFormat * formats) +{ + while (formats && *formats) { + const GstFormatDefinition *definition; + + definition = gst_format_get_details (*formats); + if (definition) + n_print ("\t\t(%d):\t%s (%s)\n", *formats, + definition->nick, definition->description); + else + n_print ("\t\t(%d):\tUnknown format\n", *formats); + + formats++; + } +} +#endif + +static void +print_query_types (const GstQueryType * types) +{ + while (types && *types) { + const GstQueryTypeDefinition *definition; + + definition = gst_query_type_get_details (*types); + if (definition) + n_print ("\t\t(%d):\t%s (%s)\n", *types, + definition->nick, definition->description); + else + n_print ("\t\t(%d):\tUnknown query format\n", *types); + + types++; + } +} + +#ifndef GST_DISABLE_ENUMTYPES +#if 0 +static void +print_event_masks (const GstEventMask * masks) +{ + GType event_type; + GEnumClass *klass; + GType event_flags; + GFlagsClass *flags_class = NULL; + + event_type = gst_event_type_get_type (); + klass = (GEnumClass *) g_type_class_ref (event_type); + + while (masks && masks->type) { + GEnumValue *value; + gint flags = 0, index = 0; + + switch (masks->type) { + case GST_EVENT_SEEK: + flags = masks->flags; + event_flags = gst_seek_type_get_type (); + flags_class = (GFlagsClass *) g_type_class_ref (event_flags); + break; + default: + break; + } + + value = g_enum_get_value (klass, masks->type); + g_print ("\t\t%s ", value->value_nick); + + while (flags) { + GFlagsValue *value; + + if (flags & 1) { + value = g_flags_get_first_value (flags_class, 1 << index); + + if (value) + g_print ("| %s ", value->value_nick); + else + g_print ("| ? "); + } + flags >>= 1; + index++; + } + g_print ("\n"); + + masks++; + } +} +#endif +#else +static void +print_event_masks (const GstEventMask * masks) +{ +} +#endif + +static char * +get_rank_name (gint rank) +{ + switch (rank) { + case GST_RANK_NONE: + return "none"; + case GST_RANK_MARGINAL: + return "marginal"; + case GST_RANK_SECONDARY: + return "secondary"; + case GST_RANK_PRIMARY: + return "primary"; + default: + return "unknown"; + } +} + +static void +print_factory_details_info (GstElementFactory * factory) +{ + n_print ("Factory Details:\n"); + n_print (" Long name:\t%s\n", factory->details.longname); + n_print (" Class:\t%s\n", factory->details.klass); + n_print (" Description:\t%s\n", factory->details.description); + n_print (" Author(s):\t%s\n", factory->details.author); + n_print (" Rank:\t\t%s (%d)\n", + get_rank_name (GST_PLUGIN_FEATURE (factory)->rank), + GST_PLUGIN_FEATURE (factory)->rank); + n_print ("\n"); +} + +static void +print_hierarchy (GType type, gint level, gint * maxlevel) +{ + GType parent; + gint i; + + parent = g_type_parent (type); + + *maxlevel = *maxlevel + 1; + level++; + + if (parent) + print_hierarchy (parent, level, maxlevel); + + if (_name) + g_print (_name); + + for (i = 1; i < *maxlevel - level; i++) + g_print (" "); + if (*maxlevel - level) + g_print (" +----"); + + g_print ("%s\n", g_type_name (type)); + + if (level == 1) + n_print ("\n"); +} + +static void +print_interfaces (GType type) +{ + guint n_ifaces; + GType *iface, *ifaces = g_type_interfaces (type, &n_ifaces); + + if (ifaces) { + if (n_ifaces) { + if (_name) + g_print (_name); + g_print (_("Implemented Interfaces:\n")); + iface = ifaces; + while (*iface) { + if (_name) + g_print (_name); + g_print (" %s\n", g_type_name (*iface)); + iface++; + } + if (_name) + g_print (_name); + g_print ("\n"); + } + g_free (ifaces); + } +} + +static void +print_element_properties_info (GstElement * element) +{ + GParamSpec **property_specs; + guint num_properties, i; + gboolean readable; + gboolean first_flag; + + property_specs = g_object_class_list_properties + (G_OBJECT_GET_CLASS (element), &num_properties); + n_print ("\n"); + n_print ("Element Properties:\n"); + + for (i = 0; i < num_properties; i++) { + GValue value = { 0, }; + GParamSpec *param = property_specs[i]; + + readable = FALSE; + + g_value_init (&value, param->value_type); + + n_print (" %-20s: %s\n", g_param_spec_get_name (param), + g_param_spec_get_blurb (param)); + + first_flag = TRUE; + n_print ("%-23.23s flags: ", ""); + if (param->flags & G_PARAM_READABLE) { + g_object_get_property (G_OBJECT (element), param->name, &value); + readable = TRUE; + if (!first_flag) + g_print (", "); + else + first_flag = FALSE; + g_print (_("readable")); + } + if (param->flags & G_PARAM_WRITABLE) { + if (!first_flag) + g_print (", "); + else + first_flag = FALSE; + g_print (_("writable")); + } + if (param->flags & GST_PARAM_CONTROLLABLE) { + if (!first_flag) + g_print (", "); + else + first_flag = FALSE; + g_print (_("controllable")); + } + n_print ("\n"); + + switch (G_VALUE_TYPE (&value)) { + case G_TYPE_STRING: + { + GParamSpecString *pstring = G_PARAM_SPEC_STRING (param); + + n_print ("%-23.23s String. ", ""); + + if (pstring->default_value == NULL) + g_print ("Default: null "); + else + g_print ("Default: \"%s\" ", pstring->default_value); + + if (readable) { + const char *string_val = g_value_get_string (&value); + + if (string_val == NULL) + g_print ("Current: null"); + else + g_print ("Current: \"%s\"", string_val); + } + break; + } + case G_TYPE_BOOLEAN: + { + GParamSpecBoolean *pboolean = G_PARAM_SPEC_BOOLEAN (param); + + n_print ("%-23.23s Boolean. ", ""); + g_print ("Default: %s ", (pboolean->default_value ? "true" : "false")); + if (readable) + g_print ("Current: %s", + (g_value_get_boolean (&value) ? "true" : "false")); + break; + } + case G_TYPE_ULONG: + { + GParamSpecULong *pulong = G_PARAM_SPEC_ULONG (param); + + n_print ("%-23.23s Unsigned Long. ", ""); + g_print ("Range: %lu - %lu Default: %lu ", + pulong->minimum, pulong->maximum, pulong->default_value); + if (readable) + g_print ("Current: %lu", g_value_get_ulong (&value)); + break; + } + case G_TYPE_LONG: + { + GParamSpecLong *plong = G_PARAM_SPEC_LONG (param); + + n_print ("%-23.23s Long. ", ""); + g_print ("Range: %ld - %ld Default: %ld ", + plong->minimum, plong->maximum, plong->default_value); + if (readable) + g_print ("Current: %ld", g_value_get_long (&value)); + break; + } + case G_TYPE_UINT: + { + GParamSpecUInt *puint = G_PARAM_SPEC_UINT (param); + + n_print ("%-23.23s Unsigned Integer. ", ""); + g_print ("Range: %u - %u Default: %u ", + puint->minimum, puint->maximum, puint->default_value); + if (readable) + g_print ("Current: %u", g_value_get_uint (&value)); + break; + } + case G_TYPE_INT: + { + GParamSpecInt *pint = G_PARAM_SPEC_INT (param); + + n_print ("%-23.23s Integer. ", ""); + g_print ("Range: %d - %d Default: %d ", + pint->minimum, pint->maximum, pint->default_value); + if (readable) + g_print ("Current: %d", g_value_get_int (&value)); + break; + } + case G_TYPE_UINT64: + { + GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64 (param); + + n_print ("%-23.23s Unsigned Integer64. ", ""); + g_print ("Range: %" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT + " Default: %" G_GUINT64_FORMAT " ", + puint64->minimum, puint64->maximum, puint64->default_value); + if (readable) + g_print ("Current: %" G_GUINT64_FORMAT, g_value_get_uint64 (&value)); + break; + } + case G_TYPE_INT64: + { + GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64 (param); + + n_print ("%-23.23s Integer64. ", ""); + g_print ("Range: %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT + " Default: %" G_GINT64_FORMAT " ", + pint64->minimum, pint64->maximum, pint64->default_value); + if (readable) + g_print ("Current: %" G_GINT64_FORMAT, g_value_get_int64 (&value)); + break; + } + case G_TYPE_FLOAT: + { + GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT (param); + + n_print ("%-23.23s Float. ", ""); + g_print ("Range: %15.7g - %15.7g Default: %15.7g ", + pfloat->minimum, pfloat->maximum, pfloat->default_value); + if (readable) + g_print ("Current: %15.7g", g_value_get_float (&value)); + break; + } + case G_TYPE_DOUBLE: + { + GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE (param); + + n_print ("%-23.23s Double. ", ""); + g_print ("Range: %15.7g - %15.7g Default: %15.7g ", + pdouble->minimum, pdouble->maximum, pdouble->default_value); + if (readable) + g_print ("Current: %15.7g", g_value_get_double (&value)); + break; + } + default: + if (param->value_type == GST_TYPE_CAPS) { + const GstCaps *caps = gst_value_get_caps (&value); + + if (!caps) + n_print ("%-23.23s Caps (NULL)", ""); + else { + print_caps (caps, " "); + } + } else if (G_IS_PARAM_SPEC_ENUM (param)) { + GParamSpecEnum *penum = G_PARAM_SPEC_ENUM (param); + GEnumValue *values; + guint j = 0; + gint enum_value; + const gchar *def_val_nick = "", *cur_val_nick = ""; + + values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values; + enum_value = g_value_get_enum (&value); + + while (values[j].value_name) { + if (values[j].value == enum_value) + cur_val_nick = values[j].value_nick; + if (values[j].value == penum->default_value) + def_val_nick = values[j].value_nick; + j++; + } + + n_print + ("%-23.23s Enum \"%s\" Default: %d, \"%s\" Current: %d, \"%s\"", + "", g_type_name (G_VALUE_TYPE (&value)), penum->default_value, + def_val_nick, enum_value, cur_val_nick); + + j = 0; + while (values[j].value_name) { + g_print ("\n"); + if (_name) + g_print (_name); + g_print ("%-23.23s (%d): %-16s - %s", "", + values[j].value, values[j].value_nick, values[j].value_name); + j++; + } + /* g_type_class_unref (ec); */ + } else if (G_IS_PARAM_SPEC_FLAGS (param)) { + GParamSpecFlags *pflags = G_PARAM_SPEC_FLAGS (param); + GFlagsValue *values; + guint j = 0; + gint flags_value; + GString *cur_flags = NULL, *def_flags = NULL; + + values = G_FLAGS_CLASS (g_type_class_ref (param->value_type))->values; + flags_value = g_value_get_flags (&value); + + while (values[j].value_name) { + if (values[j].value & flags_value) { + if (cur_flags) { + g_string_append_printf (cur_flags, " | %s", + values[j].value_nick); + } else { + cur_flags = g_string_new (values[j].value_nick); + } + } + if (values[j].value & pflags->default_value) { + if (def_flags) { + g_string_append_printf (def_flags, " | %s", + values[j].value_nick); + } else { + def_flags = g_string_new (values[j].value_nick); + } + } + j++; + } + + n_print + ("%-23.23s Flags \"%s\" Default: 0x%08x, \"%s\" Current: 0x%08x, \"%s\"", + "", g_type_name (G_VALUE_TYPE (&value)), pflags->default_value, + (def_flags ? def_flags->str : "(none)"), flags_value, + (cur_flags ? cur_flags->str : "(none)")); + + j = 0; + while (values[j].value_name) { + g_print ("\n"); + if (_name) + g_print (_name); + g_print ("%-23.23s (0x%08x): %-16s - %s", "", + values[j].value, values[j].value_nick, values[j].value_name); + j++; + } + + if (cur_flags) + g_string_free (cur_flags, TRUE); + if (def_flags) + g_string_free (def_flags, TRUE); + } else if (G_IS_PARAM_SPEC_OBJECT (param)) { + n_print ("%-23.23s Object of type \"%s\"", "", + g_type_name (param->value_type)); + } else if (G_IS_PARAM_SPEC_BOXED (param)) { + n_print ("%-23.23s Boxed pointer of type \"%s\"", "", + g_type_name (param->value_type)); + } else if (G_IS_PARAM_SPEC_POINTER (param)) { + if (param->value_type != G_TYPE_POINTER) { + n_print ("%-23.23s Pointer of type \"%s\".", "", + g_type_name (param->value_type)); + } else { + n_print ("%-23.23s Pointer.", ""); + } + } else if (param->value_type == G_TYPE_VALUE_ARRAY) { + n_print ("%-23.23s Array of GValues", ""); + } else if (GST_IS_PARAM_SPEC_FRACTION (param)) { + GstParamSpecFraction *pfraction = GST_PARAM_SPEC_FRACTION (param); + + n_print ("%-23.23s Fraction. ", ""); + + g_print ("Range: %d/%d - %d/%d Default: %d/%d ", + pfraction->min_num, pfraction->min_den, + pfraction->max_num, pfraction->max_den, + pfraction->def_num, pfraction->def_den); + if (readable) + g_print ("Current: %d/%d", + gst_value_get_fraction_numerator (&value), + gst_value_get_fraction_denominator (&value)); + + } else { + n_print ("%-23.23s Unknown type %ld \"%s\"", "", param->value_type, + g_type_name (param->value_type)); + } + break; + } + if (!readable) + g_print (" Write only\n"); + else + g_print ("\n"); + + g_value_reset (&value); + } + if (num_properties == 0) + n_print (" none\n"); + + g_free (property_specs); +} + +static void +print_pad_templates_info (GstElement * element, GstElementFactory * factory) +{ + GstElementClass *gstelement_class; + const GList *pads; + GstStaticPadTemplate *padtemplate; + + n_print ("Pad Templates:\n"); + if (!factory->numpadtemplates) { + n_print (" none\n"); + return; + } + + gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); + + pads = factory->staticpadtemplates; + while (pads) { + padtemplate = (GstStaticPadTemplate *) (pads->data); + pads = g_list_next (pads); + + if (padtemplate->direction == GST_PAD_SRC) + n_print (" SRC template: '%s'\n", padtemplate->name_template); + else if (padtemplate->direction == GST_PAD_SINK) + n_print (" SINK template: '%s'\n", padtemplate->name_template); + else + n_print (" UNKNOWN!!! template: '%s'\n", padtemplate->name_template); + + if (padtemplate->presence == GST_PAD_ALWAYS) + n_print (" Availability: Always\n"); + else if (padtemplate->presence == GST_PAD_SOMETIMES) + n_print (" Availability: Sometimes\n"); + else if (padtemplate->presence == GST_PAD_REQUEST) { + n_print (" Availability: On request\n"); + n_print (" Has request_new_pad() function: %s\n", + GST_DEBUG_FUNCPTR_NAME (gstelement_class->request_new_pad)); + } else + n_print (" Availability: UNKNOWN!!!\n"); + + if (padtemplate->static_caps.string) { + n_print (" Capabilities:\n"); + print_caps (gst_static_caps_get (&padtemplate->static_caps), " "); + } + + n_print ("\n"); + } +} + +static void +print_element_flag_info (GstElement * element) +{ + gboolean have_flags = FALSE; + + n_print ("\n"); + n_print ("Element Flags:\n"); + + if (!have_flags) + n_print (" no flags set\n"); + + if (GST_IS_BIN (element)) { + n_print ("\n"); + n_print ("Bin Flags:\n"); + if (!have_flags) + n_print (" no flags set\n"); + } +} + +static void +print_implementation_info (GstElement * element) +{ + GstObjectClass *gstobject_class; + GstElementClass *gstelement_class; + + gstobject_class = GST_OBJECT_CLASS (G_OBJECT_GET_CLASS (element)); + gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); + + n_print ("\n"); + n_print ("Element Implementation:\n"); + + n_print (" Has change_state() function: %s\n", + GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state)); +#ifndef GST_DISABLE_LOADSAVE + n_print (" Has custom save_thyself() function: %s\n", + GST_DEBUG_FUNCPTR_NAME (gstobject_class->save_thyself)); + n_print (" Has custom restore_thyself() function: %s\n", + GST_DEBUG_FUNCPTR_NAME (gstobject_class->restore_thyself)); +#endif +} + +static void +print_clocking_info (GstElement * element) +{ + if (!gst_element_requires_clock (element) && + !(gst_element_provides_clock (element) && + gst_element_get_clock (element))) { + n_print ("\n"); + n_print ("Element has no clocking capabilities."); + return; + } + + n_print ("\n"); + n_print ("Clocking Interaction:\n"); + if (gst_element_requires_clock (element)) { + n_print (" element requires a clock\n"); + } + + if (gst_element_provides_clock (element)) { + GstClock *clock; + + clock = gst_element_get_clock (element); + if (clock) + n_print (" element provides a clock: %s\n", GST_OBJECT_NAME (clock)); + else + n_print (" element is supposed to provide a clock but returned NULL\n"); + } +} + +#ifndef GST_DISABLE_INDEX +static void +print_index_info (GstElement * element) +{ + if (gst_element_is_indexable (element)) { + n_print ("\n"); + n_print ("Indexing capabilities:\n"); + n_print (" element can do indexing\n"); + } else { + n_print ("\n"); + n_print ("Element has no indexing capabilities.\n"); + } +} +#else +static void +print_index_info (GstElement * element) +{ +} +#endif + +static void +print_pad_info (GstElement * element) +{ + const GList *pads; + GstPad *pad; + + n_print ("\n"); + n_print ("Pads:\n"); + + if (!element->numpads) { + n_print (" none\n"); + return; + } + + pads = element->pads; + while (pads) { + gchar *name; + + pad = GST_PAD (pads->data); + pads = g_list_next (pads); + + n_print (""); + + name = gst_pad_get_name (pad); + if (gst_pad_get_direction (pad) == GST_PAD_SRC) + g_print (" SRC: '%s'", name); + else if (gst_pad_get_direction (pad) == GST_PAD_SINK) + g_print (" SINK: '%s'", name); + else + g_print (" UNKNOWN!!!: '%s'", name); + + g_free (name); + + g_print ("\n"); + + n_print (" Implementation:\n"); + if (pad->chainfunc) + n_print (" Has chainfunc(): %s\n", + GST_DEBUG_FUNCPTR_NAME (pad->chainfunc)); + if (pad->getrangefunc) + n_print (" Has getrangefunc(): %s\n", + GST_DEBUG_FUNCPTR_NAME (pad->getrangefunc)); + if (pad->eventfunc != gst_pad_event_default) + n_print (" Has custom eventfunc(): %s\n", + GST_DEBUG_FUNCPTR_NAME (pad->eventfunc)); + if (pad->queryfunc != gst_pad_query_default) + n_print (" Has custom queryfunc(): %s\n", + GST_DEBUG_FUNCPTR_NAME (pad->queryfunc)); + if (pad->querytypefunc != gst_pad_get_query_types_default) { + n_print (" Provides query types:\n"); + print_query_types (gst_pad_get_query_types (pad)); + } + + if (pad->intlinkfunc != gst_pad_get_internal_links_default) + n_print (" Has custom intconnfunc(): %s\n", + GST_DEBUG_FUNCPTR_NAME (pad->intlinkfunc)); + + if (pad->bufferallocfunc) + n_print (" Has bufferallocfunc(): %s\n", + GST_DEBUG_FUNCPTR_NAME (pad->bufferallocfunc)); + + if (pad->padtemplate) + n_print (" Pad Template: '%s'\n", pad->padtemplate->name_template); + + if (pad->caps) { + n_print (" Capabilities:\n"); + print_caps (pad->caps, " "); + } + } +} + +#if 0 +static gint +compare_signal_names (GSignalQuery * a, GSignalQuery * b) +{ + return strcmp (a->signal_name, b->signal_name); +} +#endif + +static void +print_signal_info (GstElement * element) +{ + /* Signals/Actions Block */ + guint *signals; + guint nsignals; + gint i = 0, j, k; + GSignalQuery *query = NULL; + GType type; + GSList *found_signals, *l; + + for (k = 0; k < 2; k++) { + found_signals = NULL; + for (type = G_OBJECT_TYPE (element); type; type = g_type_parent (type)) { + if (type == GST_TYPE_ELEMENT || type == GST_TYPE_OBJECT) + break; + + if (type == GST_TYPE_BIN && G_OBJECT_TYPE (element) != GST_TYPE_BIN) + continue; + + signals = g_signal_list_ids (type, &nsignals); + for (i = 0; i < nsignals; i++) { + query = g_new0 (GSignalQuery, 1); + g_signal_query (signals[i], query); + + if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) || + (k == 1 && (query->signal_flags & G_SIGNAL_ACTION))) + found_signals = g_slist_append (found_signals, query); + else + g_free (query); + } + g_free (signals); + signals = NULL; + } + + if (found_signals) { + n_print ("\n"); + if (k == 0) + n_print ("Element Signals:\n"); + else + n_print ("Element Actions:\n"); + } else { + continue; + } + + for (l = found_signals; l; l = l->next) { + gchar *indent; + int indent_len; + + query = (GSignalQuery *) l->data; + indent_len = strlen (query->signal_name) + + strlen (g_type_name (query->return_type)) + 24; + + indent = g_new0 (gchar, indent_len + 1); + memset (indent, ' ', indent_len); + + n_print (" \"%s\" : %s user_function (%s* object", + query->signal_name, + g_type_name (query->return_type), g_type_name (type)); + + for (j = 0; j < query->n_params; j++) { + if (_name) + g_print (_name); + if (G_TYPE_IS_FUNDAMENTAL (query->param_types[j])) { + g_print (",\n%s%s arg%d", indent, + g_type_name (query->param_types[j]), j); + } else if (G_TYPE_IS_ENUM (query->param_types[j])) { + g_print (",\n%s%s arg%d", indent, + g_type_name (query->param_types[j]), j); + } else { + g_print (",\n%s%s* arg%d", indent, + g_type_name (query->param_types[j]), j); + } + } + + if (k == 0) { + if (_name) + g_print (_name); + g_print (",\n%sgpointer user_data);\n", indent); + } else + g_print (");\n"); + + g_free (indent); + } + + if (found_signals) { + g_slist_foreach (found_signals, (GFunc) g_free, NULL); + g_slist_free (found_signals); + } + } +} + +static void +print_children_info (GstElement * element) +{ + GList *children; + + if (!GST_IS_BIN (element)) + return; + + children = (GList *) GST_BIN (element)->children; + if (children) { + n_print ("\n"); + g_print ("Children:\n"); + } + + while (children) { + n_print (" %s\n", GST_ELEMENT_NAME (GST_ELEMENT (children->data))); + children = g_list_next (children); + } +} + +static void +print_element_list (gboolean print_all) +{ + int plugincount = 0, featurecount = 0; + GList *plugins, *orig_plugins; + + orig_plugins = plugins = gst_default_registry_get_plugin_list (); + while (plugins) { + GList *features, *orig_features; + GstPlugin *plugin; + + plugin = (GstPlugin *) (plugins->data); + plugins = g_list_next (plugins); + plugincount++; + + orig_features = 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); + featurecount++; + + if (GST_IS_ELEMENT_FACTORY (feature)) { + GstElementFactory *factory; + + factory = GST_ELEMENT_FACTORY (feature); + if (print_all) + print_element_info (factory, TRUE); + else + g_print ("%s: %s: %s\n", plugin->desc.name, + GST_PLUGIN_FEATURE_NAME (factory), + gst_element_factory_get_longname (factory)); + } +#ifndef GST_DISABLE_INDEX + else if (GST_IS_INDEX_FACTORY (feature)) { + GstIndexFactory *factory; + + factory = GST_INDEX_FACTORY (feature); + if (!print_all) + g_print ("%s: %s: %s\n", plugin->desc.name, + GST_PLUGIN_FEATURE_NAME (factory), factory->longdesc); + } +#endif + else if (GST_IS_TYPE_FIND_FACTORY (feature)) { + GstTypeFindFactory *factory; + + factory = GST_TYPE_FIND_FACTORY (feature); + if (!print_all) + g_print ("%s: %s: ", plugin->desc.name, + gst_plugin_feature_get_name (feature)); + if (factory->extensions) { + guint i = 0; + + while (factory->extensions[i]) { + if (!print_all) + g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]); + i++; + } + if (!print_all) + g_print ("\n"); + } else { + if (!print_all) + g_print ("no extensions\n"); + } + } else { + if (!print_all) + n_print ("%s: %s (%s)\n", plugin->desc.name, + GST_PLUGIN_FEATURE_NAME (feature), + g_type_name (G_OBJECT_TYPE (feature))); + } + + features = g_list_next (features); + } + + gst_plugin_feature_list_free (orig_features); + } + + gst_plugin_list_free (orig_plugins); + + g_print ("\n"); + g_print (_("Total count: ")); + g_print (ngettext ("%d plugin", "%d plugins", plugincount), plugincount); + g_print (", "); + g_print (ngettext ("%d feature", "%d features", featurecount), featurecount); + g_print ("\n"); +} + +static void +print_plugin_info (GstPlugin * plugin) +{ + n_print ("Plugin Details:\n"); + n_print (" Name:\t\t\t%s\n", plugin->desc.name); + n_print (" Description:\t\t%s\n", plugin->desc.description); + n_print (" Filename:\t\t%s\n", + plugin->filename ? plugin->filename : "(null)"); + n_print (" Version:\t\t%s\n", plugin->desc.version); + n_print (" License:\t\t%s\n", plugin->desc.license); + n_print (" Source module:\t%s\n", plugin->desc.source); + n_print (" Binary package:\t%s\n", plugin->desc.package); + n_print (" Origin URL:\t\t%s\n", plugin->desc.origin); + n_print ("\n"); +} + +static void +print_plugin_features (GstPlugin * plugin) +{ + GList *features; + gint num_features = 0; + gint num_elements = 0; + gint num_types = 0; + gint num_indexes = 0; + gint num_other = 0; + + 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); + + if (GST_IS_ELEMENT_FACTORY (feature)) { + GstElementFactory *factory; + + factory = GST_ELEMENT_FACTORY (feature); + n_print (" %s: %s\n", GST_PLUGIN_FEATURE_NAME (factory), + gst_element_factory_get_longname (factory)); + num_elements++; + } +#ifndef GST_DISABLE_INDEX + else if (GST_IS_INDEX_FACTORY (feature)) { + GstIndexFactory *factory; + + factory = GST_INDEX_FACTORY (feature); + n_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc); + num_indexes++; + } +#endif + else if (GST_IS_TYPE_FIND_FACTORY (feature)) { + GstTypeFindFactory *factory; + + factory = GST_TYPE_FIND_FACTORY (feature); + if (factory->extensions) { + guint i = 0; + + g_print ("%s: %s: ", plugin->desc.name, + gst_plugin_feature_get_name (feature)); + while (factory->extensions[i]) { + g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]); + i++; + } + g_print ("\n"); + } else + g_print ("%s: %s: no extensions\n", plugin->desc.name, + gst_plugin_feature_get_name (feature)); + + num_types++; + } else { + n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)), + g_type_name (G_OBJECT_TYPE (feature))); + num_other++; + } + num_features++; + features = g_list_next (features); + } + n_print ("\n"); + n_print (" %d features:\n", num_features); + if (num_elements > 0) + n_print (" +-- %d elements\n", num_elements); + if (num_types > 0) + n_print (" +-- %d types\n", num_types); + if (num_indexes > 0) + n_print (" +-- %d indexes\n", num_indexes); + if (num_other > 0) + n_print (" +-- %d other objects\n", num_other); + + n_print ("\n"); +} + +static int +print_element_features (const gchar * element_name) +{ + GstPluginFeature *feature; + + /* FIXME implement other pretty print function for these */ +#ifndef GST_DISABLE_INDEX + feature = gst_default_registry_find_feature (element_name, + GST_TYPE_INDEX_FACTORY); + if (feature) { + n_print ("%s: an index\n", element_name); + return 0; + } +#endif + feature = gst_default_registry_find_feature (element_name, + GST_TYPE_TYPE_FIND_FACTORY); + if (feature) { + n_print ("%s: a typefind function\n", element_name); + return 0; + } + + return -1; +} + +static int +print_element_info (GstElementFactory * factory, gboolean print_names) +{ + GstElement *element; + gint maxlevel = 0; + + factory = + GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE + (factory))); + + if (!factory) { + g_print ("element plugin couldn't be loaded\n"); + return -1; + } + + element = gst_element_factory_create (factory, NULL); + if (!element) { + g_print ("couldn't construct element for some reason\n"); + return -1; + } + + if (print_names) + _name = g_strdup_printf ("%s: ", GST_PLUGIN_FEATURE (factory)->name); + else + _name = NULL; + + print_factory_details_info (factory); + if (GST_PLUGIN_FEATURE (factory)->plugin_name) { + GstPlugin *plugin; + + plugin = gst_registry_find_plugin (gst_registry_get_default (), + GST_PLUGIN_FEATURE (factory)->plugin_name); + if (plugin) { + print_plugin_info (plugin); + } + } + + print_hierarchy (G_OBJECT_TYPE (element), 0, &maxlevel); + print_interfaces (G_OBJECT_TYPE (element)); + + print_pad_templates_info (element, factory); + print_element_flag_info (element); + print_implementation_info (element); + print_clocking_info (element); + print_index_info (element); + print_pad_info (element); + print_element_properties_info (element); + print_signal_info (element); + print_children_info (element); + + gst_object_unref (element); + gst_object_unref (factory); + g_free (_name); + + return 0; +} + + +static void +print_plugin_automatic_install_info_codecs (GstElementFactory * factory) +{ + GstPadDirection direction; + const gchar *type_name; + const gchar *klass; + const GList *static_templates, *l; + GstCaps *caps = NULL; + guint i, num; + + klass = gst_element_factory_get_klass (factory); + g_return_if_fail (klass != NULL); + + if (strstr (klass, "Demuxer") || + strstr (klass, "Decoder") || + strstr (klass, "Depay") || strstr (klass, "Parser")) { + type_name = "decoder"; + direction = GST_PAD_SINK; + } else if (strstr (klass, "Muxer") || + strstr (klass, "Encoder") || strstr (klass, "Pay")) { + type_name = "encoder"; + direction = GST_PAD_SRC; + } else { + return; + } + + /* decoder/demuxer sink pads should always be static and there should only + * be one, the same applies to encoders/muxers and source pads */ + static_templates = gst_element_factory_get_static_pad_templates (factory); + for (l = static_templates; l != NULL; l = l->next) { + GstStaticPadTemplate *tmpl = NULL; + + tmpl = (GstStaticPadTemplate *) l->data; + if (tmpl->direction == direction) { + caps = gst_static_pad_template_get_caps (tmpl); + break; + } + } + + if (caps == NULL) { + g_printerr ("Couldn't find static pad template for %s '%s'\n", + type_name, GST_PLUGIN_FEATURE_NAME (factory)); + return; + } + + caps = gst_caps_make_writable (caps); + num = gst_caps_get_size (caps); + for (i = 0; i < num; ++i) { + GstStructure *s; + gchar *s_str; + + s = gst_caps_get_structure (caps, i); + /* remove fields that are almost always just MIN-MAX of some sort + * in order to make the caps look less messy */ + gst_structure_remove_field (s, "pixel-aspect-ratio"); + gst_structure_remove_field (s, "framerate"); + gst_structure_remove_field (s, "channels"); + gst_structure_remove_field (s, "width"); + gst_structure_remove_field (s, "height"); + gst_structure_remove_field (s, "rate"); + gst_structure_remove_field (s, "depth"); + gst_structure_remove_field (s, "clock-rate"); + s_str = gst_structure_to_string (s); + g_print ("%s-%s\n", type_name, s_str); + g_free (s_str); + } + gst_caps_unref (caps); +} + +static void +print_plugin_automatic_install_info_protocols (GstElementFactory * factory) +{ + gchar **protocols, **p; + + protocols = gst_element_factory_get_uri_protocols (factory); + if (protocols != NULL && *protocols != NULL) { + switch (gst_element_factory_get_uri_type (factory)) { + case GST_URI_SINK: + for (p = protocols; *p != NULL; ++p) + g_print ("urisink-%s\n", *p); + break; + case GST_URI_SRC: + for (p = protocols; *p != NULL; ++p) + g_print ("urisource-%s\n", *p); + break; + default: + break; + } + g_strfreev (protocols); + } +} + +static void +print_plugin_automatic_install_info (GstPlugin * plugin) +{ + const gchar *plugin_name; + GList *features, *l; + + plugin_name = gst_plugin_get_name (plugin); + + /* not interested in typefind factories, only element factories */ + features = gst_registry_get_feature_list (gst_registry_get_default (), + GST_TYPE_ELEMENT_FACTORY); + + for (l = features; l != NULL; l = l->next) { + GstPluginFeature *feature; + + feature = GST_PLUGIN_FEATURE (l->data); + + /* only interested in the ones that are in the plugin we just loaded */ + if (g_str_equal (plugin_name, feature->plugin_name)) { + GstElementFactory *factory; + + g_print ("element-%s\n", gst_plugin_feature_get_name (feature)); + + factory = GST_ELEMENT_FACTORY (feature); + print_plugin_automatic_install_info_protocols (factory); + print_plugin_automatic_install_info_codecs (factory); + } + } + + g_list_foreach (features, (GFunc) gst_object_unref, NULL); + g_list_free (features); +} + +int +main (int argc, char *argv[]) +{ + static gboolean print_all = FALSE; + static gboolean print_aii = FALSE; + GOptionEntry options[] = { + {"print-all", 'a', 0, G_OPTION_ARG_NONE, &print_all, + N_("Print all elements"), NULL}, + {"print-plugin-auto-install-info", '\0', 0, G_OPTION_ARG_NONE, &print_aii, + N_("Print a machine-parsable list of features the specified plugin " + "provides.\n " + "Useful in connection with external automatic plugin " + "installation mechanisms"), NULL}, + GST_TOOLS_GOPTION_VERSION, + {NULL} + }; + GOptionContext *ctx; + GError *err = NULL; + +#ifdef ENABLE_NLS + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); +#endif + + if (!g_thread_supported ()) + g_thread_init (NULL); + + ctx = g_option_context_new ("[ELEMENT-NAME | PLUGIN-NAME]"); + g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", err->message); + exit (1); + } + g_option_context_free (ctx); + + gst_tools_print_version ("gst-inspect"); + + if (print_all && argc > 2) { + g_print ("-a requires no extra arguments\n"); + return 1; + } + + /* if no arguments, print out list of elements */ + if (argc == 1 || print_all) { + print_element_list (print_all); + /* else we try to get a factory */ + } else { + GstElementFactory *factory; + GstPlugin *plugin; + const char *arg = argv[argc - 1]; + int retval; + + factory = gst_element_factory_find (arg); + /* if there's a factory, print out the info */ + if (factory) { + retval = print_element_info (factory, print_all); + gst_object_unref (factory); + } else { + retval = print_element_features (arg); + } + + /* otherwise check if it's a plugin */ + if (retval) { + plugin = gst_default_registry_find_plugin (arg); + + /* if there is such a plugin, print out info */ + if (plugin) { + if (print_aii) { + print_plugin_automatic_install_info (plugin); + } else { + print_plugin_info (plugin); + print_plugin_features (plugin); + } + } else { + GError *error = NULL; + + if (g_file_test (arg, G_FILE_TEST_EXISTS)) { + plugin = gst_plugin_load_file (arg, &error); + + if (plugin) { + if (print_aii) { + print_plugin_automatic_install_info (plugin); + } else { + print_plugin_info (plugin); + print_plugin_features (plugin); + } + } else { + g_print (_("Could not load plugin file: %s\n"), error->message); + g_error_free (error); + return -1; + } + } else { + g_print (_("No such element or plugin '%s'\n"), arg); + return -1; + } + } + } + } + + return 0; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/gst-launch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/gst-launch.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,808 @@ +/* GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2004 Thomas Vander Stichele + * + * gst-launch.c: tool to launch GStreamer pipelines from the command line + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* FIXME: hack alert */ +#ifdef WIN32 +#define DISABLE_FAULT_HANDLER +#endif + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifndef DISABLE_FAULT_HANDLER +#include +#endif +#include /* for LC_ALL */ +#include "tools.h" +#include +#include "../gst/gst-i18n-app.h" + +/* FIXME: This is just a temporary hack. We should have a better + * check for siginfo handling. */ +#ifdef SA_SIGINFO +#define USE_SIGINFO +#endif + +//extern volatile gboolean glib_on_error_halt; + +#ifndef DISABLE_FAULT_HANDLER +static void fault_restore (void); +static void fault_spin (void); +static void sigint_restore (void); +static gboolean caught_intr = FALSE; +#endif + +static GstElement *pipeline; +static gboolean caught_error = FALSE; +static gboolean tags = FALSE; +static gboolean messages = FALSE; +static gboolean is_live = FALSE; + + +#ifndef GST_DISABLE_LOADSAVE +static GstElement * +xmllaunch_parse_cmdline (const gchar ** argv) +{ + GstElement *pipeline = NULL, *e; + GstXML *xml; + gboolean err; + const gchar *arg; + gchar *element, *property, *value; + GList *l; + gint i = 0; + + if (!(arg = argv[0])) { + g_print (_ + ("Usage: gst-xmllaunch [ element.property=value ... ]\n")); + exit (1); + } + + xml = gst_xml_new (); + /* FIXME guchar from gstxml.c */ + err = gst_xml_parse_file (xml, (guchar *) arg, NULL); + + if (err != TRUE) { + fprintf (stderr, _("ERROR: parse of xml file '%s' failed.\n"), arg); + exit (1); + } + + l = gst_xml_get_topelements (xml); + if (!l) { + fprintf (stderr, _("ERROR: no toplevel pipeline element in file '%s'.\n"), + arg); + exit (1); + } + + if (l->next) + fprintf (stderr, + _("WARNING: only one toplevel element is supported at this time.")); + + pipeline = GST_ELEMENT (l->data); + + while ((arg = argv[++i])) { + element = g_strdup (arg); + property = strchr (element, '.'); + value = strchr (element, '='); + + if (!(element < property && property < value)) { + fprintf (stderr, + _("ERROR: could not parse command line argument %d: %s.\n"), i, + element); + g_free (element); + exit (1); + } + + *property++ = '\0'; + *value++ = '\0'; + + e = gst_bin_get_by_name (GST_BIN (pipeline), element); + if (!e) { + fprintf (stderr, _("WARNING: element named '%s' not found.\n"), element); + } else { + gst_util_set_object_arg (G_OBJECT (e), property, value); + } + g_free (element); + } + + if (!l) + return NULL; + + gst_object_ref (pipeline); + gst_object_unref (xml); + return pipeline; +} +#endif + +#ifndef DISABLE_FAULT_HANDLER +#ifndef USE_SIGINFO +static void +fault_handler_sighandler (int signum) +{ + fault_restore (); + + /* printf is used instead of g_print(), since it's less likely to + * deadlock */ + switch (signum) { + case SIGSEGV: + printf ("Caught SIGSEGV\n"); + break; + case SIGQUIT: + printf ("Caught SIGQUIT\n"); + break; + default: + printf ("signo: %d\n", signum); + break; + } + + fault_spin (); +} + +#else /* USE_SIGINFO */ + +static void +fault_handler_sigaction (int signum, siginfo_t * si, void *misc) +{ + fault_restore (); + + /* printf is used instead of g_print(), since it's less likely to + * deadlock */ + switch (si->si_signo) { + case SIGSEGV: + printf ("Caught SIGSEGV accessing address %p\n", si->si_addr); + break; + case SIGQUIT: + printf ("Caught SIGQUIT\n"); + break; + default: + printf ("signo: %d\n", si->si_signo); + printf ("errno: %d\n", si->si_errno); + printf ("code: %d\n", si->si_code); + break; + } + + fault_spin (); +} +#endif /* USE_SIGINFO */ + +static void +fault_spin (void) +{ + int spinning = TRUE; + + glib_on_error_halt = FALSE; + g_on_error_stack_trace ("gst-launch"); + + wait (NULL); + + /* FIXME how do we know if we were run by libtool? */ + printf ("Spinning. Please run 'gdb gst-launch %d' to continue debugging, " + "Ctrl-C to quit, or Ctrl-\\ to dump core.\n", (gint) getpid ()); + while (spinning) + g_usleep (1000000); +} + +static void +fault_restore (void) +{ + struct sigaction action; + + memset (&action, 0, sizeof (action)); + action.sa_handler = SIG_DFL; + + sigaction (SIGSEGV, &action, NULL); + sigaction (SIGQUIT, &action, NULL); +} + +static void +fault_setup (void) +{ + struct sigaction action; + + memset (&action, 0, sizeof (action)); +#ifdef USE_SIGINFO + action.sa_sigaction = fault_handler_sigaction; + action.sa_flags = SA_SIGINFO; +#else + action.sa_handler = fault_handler_sighandler; +#endif + + sigaction (SIGSEGV, &action, NULL); + sigaction (SIGQUIT, &action, NULL); +} +#endif /* DISABLE_FAULT_HANDLER */ + +static void +print_tag (const GstTagList * list, const gchar * tag, gpointer unused) +{ + gint i, count; + + count = gst_tag_list_get_tag_size (list, tag); + + for (i = 0; i < count; i++) { + gchar *str; + + if (gst_tag_get_type (tag) == G_TYPE_STRING) { + if (!gst_tag_list_get_string_index (list, tag, i, &str)) + g_assert_not_reached (); + } else if (gst_tag_get_type (tag) == GST_TYPE_BUFFER) { + GstBuffer *img; + + img = gst_value_get_buffer (gst_tag_list_get_value_index (list, tag, i)); + if (img) { + gchar *caps_str; + + caps_str = GST_BUFFER_CAPS (img) ? + gst_caps_to_string (GST_BUFFER_CAPS (img)) : g_strdup ("unknown"); + str = g_strdup_printf ("buffer of %u bytes, type: %s", + GST_BUFFER_SIZE (img), caps_str); + g_free (caps_str); + } else { + str = g_strdup ("NULL buffer"); + } + } else { + str = + g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i)); + } + + if (i == 0) { + g_print ("%16s: %s\n", gst_tag_get_nick (tag), str); + } else { + g_print ("%16s: %s\n", "", str); + } + + g_free (str); + } +} + +#ifndef DISABLE_FAULT_HANDLER +/* we only use sighandler here because the registers are not important */ +static void +sigint_handler_sighandler (int signum) +{ + g_print ("Caught interrupt -- "); + + sigint_restore (); + + /* we set a flag that is checked by the mainloop, we cannot do much in the + * interrupt handler (no mutex or other blocking stuff) */ + caught_intr = TRUE; +} + +/* is called every 50 milliseconds (20 times a second), the interrupt handler + * will set a flag for us. We react to this by posting a message. */ +static gboolean +check_intr (GstElement * pipeline) +{ + if (!caught_intr) { + return TRUE; + } else { + caught_intr = FALSE; + g_print ("handling interrupt.\n"); + + /* post an application specific message */ + gst_element_post_message (GST_ELEMENT (pipeline), + gst_message_new_application (GST_OBJECT (pipeline), + gst_structure_new ("GstLaunchInterrupt", + "message", G_TYPE_STRING, "Pipeline interrupted", NULL))); + + /* remove timeout handler */ + return FALSE; + } +} + +static void +sigint_setup (void) +{ + struct sigaction action; + + memset (&action, 0, sizeof (action)); + action.sa_handler = sigint_handler_sighandler; + + sigaction (SIGINT, &action, NULL); +} + +static void +sigint_restore (void) +{ + struct sigaction action; + + memset (&action, 0, sizeof (action)); + action.sa_handler = SIG_DFL; + + sigaction (SIGINT, &action, NULL); +} + +static void +play_handler (int signum) +{ + switch (signum) { + case SIGUSR1: + g_print ("Caught SIGUSR1 - Play request.\n"); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + break; + case SIGUSR2: + g_print ("Caught SIGUSR2 - Stop request.\n"); + gst_element_set_state (pipeline, GST_STATE_NULL); + break; + } +} + +static void +play_signal_setup (void) +{ + struct sigaction action; + + memset (&action, 0, sizeof (action)); + action.sa_handler = play_handler; + sigaction (SIGUSR1, &action, NULL); + sigaction (SIGUSR2, &action, NULL); +} +#endif /* DISABLE_FAULT_HANDLER */ + +/* returns TRUE if there was an error or we caught a keyboard interrupt. */ +static gboolean +event_loop (GstElement * pipeline, gboolean blocking, GstState target_state) +{ + GstBus *bus; + GstMessage *message = NULL; + gboolean res = FALSE; + gboolean buffering = FALSE; + + bus = gst_element_get_bus (GST_ELEMENT (pipeline)); + +#ifndef DISABLE_FAULT_HANDLER + g_timeout_add (50, (GSourceFunc) check_intr, pipeline); +#endif + + while (TRUE) { + message = gst_bus_poll (bus, GST_MESSAGE_ANY, blocking ? -1 : 0); + + /* if the poll timed out, only when !blocking */ + if (message == NULL) + goto exit; + + /* check if we need to dump messages to the console */ + if (messages) { + const GstStructure *s; + + s = gst_message_get_structure (message); + + g_print (_("Got Message from element \"%s\" (%s): "), + GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))), + gst_message_type_get_name (GST_MESSAGE_TYPE (message))); + if (s) { + gchar *sstr; + + sstr = gst_structure_to_string (s); + g_print ("%s\n", sstr); + g_free (sstr); + } else { + g_print ("no message details\n"); + } + } + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_NEW_CLOCK: + { + GstClock *clock; + + gst_message_parse_new_clock (message, &clock); + + g_print ("New clock: %s\n", (clock ? GST_OBJECT_NAME (clock) : "NULL")); + break; + } + case GST_MESSAGE_EOS: + g_print (_ + ("Got EOS from element \"%s\".\n"), + GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)))); + goto exit; + case GST_MESSAGE_TAG: + if (tags) { + GstTagList *tags; + + gst_message_parse_tag (message, &tags); + g_print (_("FOUND TAG : found by element \"%s\".\n"), + GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)))); + gst_tag_list_foreach (tags, print_tag, NULL); + gst_tag_list_free (tags); + } + break; + case GST_MESSAGE_INFO:{ + GError *gerror; + gchar *debug; + gchar *name = gst_object_get_path_string (GST_MESSAGE_SRC (message)); + + gst_message_parse_info (message, &gerror, &debug); + if (debug) { + g_print (_("INFO:\n%s\n"), debug); + } + g_error_free (gerror); + g_free (debug); + g_free (name); + break; + } + case GST_MESSAGE_WARNING:{ + GError *gerror; + gchar *debug; + gchar *name = gst_object_get_path_string (GST_MESSAGE_SRC (message)); + + /* dump graph on warning */ + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), + GST_DEBUG_GRAPH_SHOW_ALL, "gst-launch.warning"); + + gst_message_parse_warning (message, &gerror, &debug); + g_print (_("WARNING: from element %s: %s\n"), name, gerror->message); + if (debug) { + g_print (_("Additional debug info:\n%s\n"), debug); + } + g_error_free (gerror); + g_free (debug); + g_free (name); + break; + } + case GST_MESSAGE_ERROR:{ + GError *gerror; + gchar *debug; + + /* dump graph on error */ + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), + GST_DEBUG_GRAPH_SHOW_ALL, "gst-launch.error"); + + gst_message_parse_error (message, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug); + g_error_free (gerror); + g_free (debug); + /* we have an error */ + res = TRUE; + goto exit; + } + case GST_MESSAGE_STATE_CHANGED:{ + GstState old, new, pending; + + gst_message_parse_state_changed (message, &old, &new, &pending); + + /* we only care about pipeline state change messages */ + if (GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (pipeline)) + break; + + /* dump graph for pipeline state changes */ + { + gchar *dump_name = g_strdup_printf ("gst-launch.%s_%s", + gst_element_state_get_name (old), + gst_element_state_get_name (new)); + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), + GST_DEBUG_GRAPH_SHOW_ALL, dump_name); + g_free (dump_name); + } + + /* ignore when we are buffering since then we mess with the states + * ourselves. */ + if (buffering) { + fprintf (stderr, + _("Prerolled, waiting for buffering to finish...\n")); + break; + } + + /* if we reached the final target state, exit */ + if (target_state == GST_STATE_PAUSED && new == target_state) + goto exit; + + /* else not an interesting message */ + break; + } + case GST_MESSAGE_BUFFERING:{ + gint percent; + + gst_message_parse_buffering (message, &percent); + fprintf (stderr, _("buffering... %d \r"), percent); + + /* no state management needed for live pipelines */ + if (is_live) + break; + + if (percent == 100) { + /* a 100% message means buffering is done */ + buffering = FALSE; + /* if the desired state is playing, go back */ + if (target_state == GST_STATE_PLAYING) { + fprintf (stderr, + _("Done buffering, setting pipeline to PLAYING ...\n")); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + } else + goto exit; + } else { + /* buffering busy */ + if (buffering == FALSE && target_state == GST_STATE_PLAYING) { + /* we were not buffering but PLAYING, PAUSE the pipeline. */ + fprintf (stderr, _("Buffering, setting pipeline to PAUSED ...\n")); + gst_element_set_state (pipeline, GST_STATE_PAUSED); + } + buffering = TRUE; + } + break; + } + case GST_MESSAGE_APPLICATION:{ + const GstStructure *s; + + s = gst_message_get_structure (message); + + if (gst_structure_has_name (s, "GstLaunchInterrupt")) { + /* this application message is posted when we caught an interrupt and + * we need to stop the pipeline. */ + fprintf (stderr, _("Interrupt: Stopping pipeline ...\n")); + /* return TRUE when we caught an interrupt */ + res = TRUE; + goto exit; + } + } + default: + /* just be quiet by default */ + break; + } + if (message) + gst_message_unref (message); + } + g_assert_not_reached (); + +exit: + { + if (message) + gst_message_unref (message); + gst_object_unref (bus); + return res; + } +} + +int +main (int argc, char *argv[]) +{ + /* options */ + static gboolean verbose = FALSE; + static gboolean no_fault = FALSE; + static gboolean trace = FALSE; + gchar *savefile = NULL; + static gchar *exclude_args = NULL; + GOptionEntry options[] = { + {"tags", 't', 0, G_OPTION_ARG_NONE, &tags, + N_("Output tags (also known as metadata)"), NULL}, + {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, + N_("Output status information and property notifications"), NULL}, + {"messages", 'm', 0, G_OPTION_ARG_NONE, &messages, + N_("Output messages"), NULL}, + {"exclude", 'X', 0, G_OPTION_ARG_NONE, &exclude_args, + N_("Do not output status information of TYPE"), N_("TYPE1,TYPE2,...")}, +#ifndef GST_DISABLE_LOADSAVE + {"output", 'o', 0, G_OPTION_ARG_STRING, &savefile, + N_("Save xml representation of pipeline to FILE and exit"), N_("FILE")}, +#endif + {"no-fault", 'f', 0, G_OPTION_ARG_NONE, &no_fault, + N_("Do not install a fault handler"), NULL}, + {"trace", 'T', 0, G_OPTION_ARG_NONE, &trace, + N_("Print alloc trace (if enabled at compile time)"), NULL}, + GST_TOOLS_GOPTION_VERSION, + {NULL} + }; + GOptionContext *ctx; + GError *err = NULL; + gchar **argvn; + GError *error = NULL; + gint res = 0; + + free (malloc (8)); /* -lefence */ + +#ifdef ENABLE_NLS + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); +#endif + + if (!g_thread_supported ()) + g_thread_init (NULL); + + gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE); + + ctx = g_option_context_new ("PIPELINE-DESCRIPTION"); + g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + if (err) + g_print ("Error initializing: %s\n", GST_STR_NULL (err->message)); + else + g_print ("Error initializing: Unknown error!\n"); + exit (1); + } + g_option_context_free (ctx); + + gst_tools_print_version ("gst-launch"); + +#ifndef DISABLE_FAULT_HANDLER + if (!no_fault) + fault_setup (); + + sigint_setup (); + play_signal_setup (); +#endif + + if (trace) { + if (!gst_alloc_trace_available ()) { + g_warning ("Trace not available (recompile with trace enabled)."); + } + gst_alloc_trace_print_live (); + } + + /* make a null-terminated version of argv */ + argvn = g_new0 (char *, argc); + memcpy (argvn, argv + 1, sizeof (char *) * (argc - 1)); +#ifndef GST_DISABLE_LOADSAVE + if (strstr (argv[0], "gst-xmllaunch")) { + pipeline = xmllaunch_parse_cmdline ((const gchar **) argvn); + } else +#endif + { + pipeline = + (GstElement *) gst_parse_launchv ((const gchar **) argvn, &error); + } + g_free (argvn); + + if (!pipeline) { + if (error) { + fprintf (stderr, _("ERROR: pipeline could not be constructed: %s.\n"), + GST_STR_NULL (error->message)); + g_error_free (error); + } else { + fprintf (stderr, _("ERROR: pipeline could not be constructed.\n")); + } + return 1; + } else if (error) { + fprintf (stderr, _("WARNING: erroneous pipeline: %s\n"), + GST_STR_NULL (error->message)); + g_error_free (error); + return 1; + } + + if (verbose) { + gchar **exclude_list = + exclude_args ? g_strsplit (exclude_args, ",", 0) : NULL; + g_signal_connect (pipeline, "deep_notify", + G_CALLBACK (gst_object_default_deep_notify), exclude_list); + } +#ifndef GST_DISABLE_LOADSAVE + if (savefile) { + gst_xml_write_file (GST_ELEMENT (pipeline), fopen (savefile, "w")); + } +#endif + + if (!savefile) { + GstState state, pending; + GstStateChangeReturn ret; + + /* If the top-level object is not a pipeline, place it in a pipeline. */ + if (!GST_IS_PIPELINE (pipeline)) { + GstElement *real_pipeline = gst_element_factory_make ("pipeline", NULL); + + if (real_pipeline == NULL) { + fprintf (stderr, _("ERROR: the 'pipeline' element wasn't found.\n")); + return 1; + } + gst_bin_add (GST_BIN (real_pipeline), pipeline); + pipeline = real_pipeline; + } + fprintf (stderr, _("Setting pipeline to PAUSED ...\n")); + ret = gst_element_set_state (pipeline, GST_STATE_PAUSED); + + switch (ret) { + case GST_STATE_CHANGE_FAILURE: + fprintf (stderr, _("ERROR: Pipeline doesn't want to pause.\n")); + res = -1; + event_loop (pipeline, FALSE, GST_STATE_VOID_PENDING); + goto end; + case GST_STATE_CHANGE_NO_PREROLL: + fprintf (stderr, _("Pipeline is live and does not need PREROLL ...\n")); + is_live = TRUE; + break; + case GST_STATE_CHANGE_ASYNC: + fprintf (stderr, _("Pipeline is PREROLLING ...\n")); + caught_error = event_loop (pipeline, TRUE, GST_STATE_PAUSED); + if (caught_error) { + fprintf (stderr, _("ERROR: pipeline doesn't want to preroll.\n")); + goto end; + } + state = GST_STATE_PAUSED; + /* fallthrough */ + case GST_STATE_CHANGE_SUCCESS: + fprintf (stderr, _("Pipeline is PREROLLED ...\n")); + break; + } + + caught_error = event_loop (pipeline, FALSE, GST_STATE_PLAYING); + + if (caught_error) { + fprintf (stderr, _("ERROR: pipeline doesn't want to preroll.\n")); + } else { + GstClockTime tfthen, tfnow; + GstClockTimeDiff diff; + + fprintf (stderr, _("Setting pipeline to PLAYING ...\n")); + if (gst_element_set_state (pipeline, + GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { + GstMessage *err_msg; + GstBus *bus; + + fprintf (stderr, _("ERROR: pipeline doesn't want to play.\n")); + bus = gst_element_get_bus (pipeline); + if ((err_msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0))) { + GError *gerror; + gchar *debug; + + gst_message_parse_error (err_msg, &gerror, &debug); + gst_object_default_error (GST_MESSAGE_SRC (err_msg), gerror, debug); + gst_message_unref (err_msg); + g_error_free (gerror); + g_free (debug); + } + gst_object_unref (bus); + res = -1; + goto end; + } + + tfthen = gst_util_get_timestamp (); + caught_error = event_loop (pipeline, TRUE, GST_STATE_PLAYING); + tfnow = gst_util_get_timestamp (); + + diff = GST_CLOCK_DIFF (tfthen, tfnow); + + g_print (_("Execution ended after %" G_GUINT64_FORMAT " ns.\n"), diff); + } + + /* iterate mainloop to process pending stuff */ + while (g_main_context_iteration (NULL, FALSE)); + + fprintf (stderr, _("Setting pipeline to PAUSED ...\n")); + gst_element_set_state (pipeline, GST_STATE_PAUSED); + if (!caught_error) + gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE); + fprintf (stderr, _("Setting pipeline to READY ...\n")); + gst_element_set_state (pipeline, GST_STATE_READY); + gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE); + + end: + fprintf (stderr, _("Setting pipeline to NULL ...\n")); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE); + } + + fprintf (stderr, _("FREEING pipeline ...\n")); + gst_object_unref (pipeline); + + gst_deinit (); + if (trace) + gst_alloc_trace_print_live (); + + return res; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/gst-run.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/gst-run.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,383 @@ +/* GStreamer + * Copyright (C) 2004 Thomas Vander Stichele + * + * gst-run.c: tool to launch GStreamer tools with correct major/minor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include +#include + +/* global statics for option parsing */ +static gboolean _print = FALSE; +static gchar *_arg_mm = NULL; +static gboolean _arg_list_mm = FALSE; + +/* popt options table for the wrapper */ +static GOptionEntry wrapper_options[] = { + {"print", 'p', 0, G_OPTION_ARG_NONE, &_print, + "print wrapped command line options", NULL}, + {"gst-mm", 0, 0, G_OPTION_ARG_STRING, &_arg_mm, + "Force major/minor version", "VERSION"}, + {"gst-list-mm", 0, 0, G_OPTION_ARG_NONE, &_arg_list_mm, + "List found major/minor versions", NULL}, + {NULL} +}; + +/* print out the major/minor, which is the hash key */ +static void +hash_print_key (gchar * key, gchar * value) +{ + g_print ("%s\n", (gchar *) key); +} + +/* return value like strcmp, but compares major/minor numerically */ +static gint +compare_major_minor (const gchar * first, const gchar * second) +{ + gchar **firsts, **seconds; + gint fmaj, fmin, smaj, smin; + gint ret = 0; + + firsts = g_strsplit (first, ".", 0); + seconds = g_strsplit (second, ".", 0); + + if (firsts[0] == NULL || firsts[1] == NULL) { + ret = -1; + goto beach; + } + if (seconds[0] == NULL || seconds[1] == NULL) { + ret = 1; + goto beach; + } + + fmaj = atoi (firsts[0]); + fmin = atoi (firsts[1]); + smaj = atoi (seconds[0]); + smin = atoi (seconds[1]); + + if (fmaj < smaj) { + ret = -1; + goto beach; + } + if (fmaj > smaj) { + ret = 1; + goto beach; + } + + /* fmaj == smaj */ + if (fmin < smin) { + ret = -1; + goto beach; + } + if (fmin > smin) { + ret = 1; + goto beach; + } + ret = 0; + +beach: + g_strfreev (firsts); + g_strfreev (seconds); + return ret; +} + +static void +find_highest_version (gchar * key, gchar * value, gchar ** highest) +{ + if (*highest == NULL) { + /* first value, so just set it */ + *highest = key; + } + if (compare_major_minor (key, *highest) > 0) + *highest = key; +} + +/* Libtool creates shell scripts named "base" that calls actual binaries as + * .libs/lt-base. If we detect this is a libtool script, unmangle so we + * find the right binaries */ +static void +unmangle_libtool (gchar ** dir, gchar ** base) +{ + gchar *new_dir, *new_base; + + if (!*dir) + return; + if (!*base) + return; + + /* we assume libtool when base starts with lt- and dir ends with .libs */ + if (!g_str_has_prefix (*base, "lt-")) + return; + if (!g_str_has_suffix (*dir, ".libs")) + return; + + new_base = g_strdup (&((*base)[3])); + new_dir = g_path_get_dirname (*dir); + g_free (*base); + g_free (*dir); + *base = new_base; + *dir = new_dir; +} + +/* Returns a directory path that contains the binary given as an argument. + * If the binary given contains a path, it gets looked for in that path. + * If it doesn't contain a path, it gets looked for in the standard path. + * + * The returned string is newly allocated. + */ +static gchar * +get_dir_of_binary (const gchar * binary) +{ + gchar *base, *dir; + gchar *full; + + base = g_path_get_basename (binary); + dir = g_path_get_dirname (binary); + + /* if putting these two together yields the same as binary, + * then we have the right breakup. If not, it's because no path was + * specified which caused get_basename to return "." */ + full = g_build_filename (dir, base, NULL); + + if (strcmp (full, binary) != 0) { + if (strcmp (dir, ".") != 0) { + g_warning ("This should not happen, g_path_get_dirname () has changed."); + g_free (base); + g_free (dir); + g_free (full); + return NULL; + } + + /* we know no path was specified, so search standard path for binary */ + g_free (full); + full = g_find_program_in_path (base); + if (!full) { + g_warning ("This should not happen, %s not in standard path.", base); + g_free (base); + g_free (dir); + return NULL; + } + } + + g_free (base); + g_free (dir); + dir = g_path_get_dirname (full); + g_free (full); + + return dir; +} + +/* Search the given directory for candidate binaries matching the base binary. + * Return a GHashTable of major/minor -> directory pairs + */ +static GHashTable * +get_candidates (const gchar * dir, const gchar * base) +{ + GDir *gdir; + GError *error = NULL; + const gchar *entry; + gchar *path; + gchar *suffix, *copy; + + gchar *pattern; + GPatternSpec *spec, *specexe; + + gchar **dirs; + gchar **cur; + + GHashTable *candidates = NULL; + + candidates = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + + /* compile our pattern specs */ + pattern = g_strdup_printf ("%s-*.*", base); + spec = g_pattern_spec_new (pattern); + g_free (pattern); + pattern = g_strdup_printf ("%s-*.*.exe", base); + specexe = g_pattern_spec_new (pattern); + g_free (pattern); + + /* get all dirs from the path and prepend with given dir */ + if (dir) + path = g_strdup_printf ("%s%c%s", + dir, G_SEARCHPATH_SEPARATOR, g_getenv ("PATH")); + else + path = (gchar *) g_getenv ("PATH"); + dirs = g_strsplit (path, G_SEARCHPATH_SEPARATOR_S, 0); + if (dir) + g_free (path); + + /* check all of these in reverse order by winding to bottom and going up */ + cur = &dirs[0]; + while (*cur) + ++cur; + + while (cur != &dirs[0]) { + --cur; + if (!g_file_test (*cur, G_FILE_TEST_EXISTS) || + !g_file_test (*cur, G_FILE_TEST_IS_DIR)) { + continue; + } + + gdir = g_dir_open (*cur, 0, &error); + if (!gdir) { + g_warning ("Could not open dir %s: %s", *cur, error->message); + g_error_free (error); + return NULL; + } + while ((entry = g_dir_read_name (gdir))) { + if (g_pattern_match_string (spec, entry) + || g_pattern_match_string (specexe, entry)) { + gchar *full; + + /* is it executable ? */ + full = g_build_filename (*cur, entry, NULL); + if (!g_file_test (full, G_FILE_TEST_IS_EXECUTABLE)) { + g_free (full); + continue; + } + g_free (full); + + /* strip base and dash from it */ + suffix = g_strdup (&(entry[strlen (base) + 1])); + copy = g_strdup (suffix); + + /* strip possible .exe from copy */ + if (g_strrstr (copy, ".exe")) + g_strrstr (copy, ".exe")[0] = '\0'; + + /* stricter pattern check: check if it only contains digits or dots */ + g_strcanon (copy, "0123456789.", 'X'); + if (strstr (copy, "X")) { + g_free (suffix); + g_free (copy); + continue; + } + g_free (copy); + g_hash_table_insert (candidates, suffix, g_strdup (*cur)); + } + } + } + + g_strfreev (dirs); + g_pattern_spec_free (spec); + return candidates; +} + +int +main (int argc, char **argv) +{ + GHashTable *candidates; + gchar *dir; + gchar *base; + gchar *highest = NULL; + gchar *binary; /* actual binary we're going to run */ + gchar *path = NULL; /* and its path */ + gchar *desc; + GOptionContext *ctx; + GError *err = NULL; + + /* detect stuff */ + dir = get_dir_of_binary (argv[0]); + base = g_path_get_basename (argv[0]); + + /* parse command line options */ + desc = g_strdup_printf ("wrapper to call versioned %s", base); + ctx = g_option_context_new (desc); + g_free (desc); + g_option_context_set_ignore_unknown_options (ctx, TRUE); + g_option_context_add_main_entries (ctx, wrapper_options, GETTEXT_PACKAGE); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", err->message); + exit (1); + } + g_option_context_free (ctx); + + /* unmangle libtool if necessary */ + unmangle_libtool (&dir, &base); + + /* get all candidate binaries */ + candidates = get_candidates (dir, base); + g_free (dir); + + if (_arg_mm) { + /* if a version was forced, look it up in the hash table */ + dir = g_hash_table_lookup (candidates, _arg_mm); + if (!dir) { + g_print ("ERROR: Major/minor %s of tool %s not found.\n", _arg_mm, base); + return 1; + } + binary = g_strdup_printf ("%s-%s", base, _arg_mm); + } else { + highest = NULL; + + /* otherwise, just look up the highest version */ + if (candidates) { + g_hash_table_foreach (candidates, (GHFunc) find_highest_version, + &highest); + } + + if (highest == NULL) { + g_print ("ERROR: No version of tool %s found.\n", base); + return 1; + } + dir = g_hash_table_lookup (candidates, highest); + binary = g_strdup_printf ("%s-%s", base, highest); + } + + g_free (base); + + path = g_build_filename (dir, binary, NULL); + g_free (binary); + + /* print out list of major/minors we found if asked for */ + /* FIXME: do them in order by creating a GList of keys and sort them */ + if (_arg_list_mm) { + g_hash_table_foreach (candidates, (GHFunc) hash_print_key, NULL); + g_hash_table_destroy (candidates); + return 0; + } + + /* print out command line if asked for */ + argv[0] = path; + if (_print) { + int i; + + for (i = 0; i < argc; ++i) { + g_print ("%s", argv[i]); + if (i < argc - 1) + g_print (" "); + } + g_print ("\n"); + } + + /* execute */ + if (execv (path, argv) == -1) { + g_warning ("Error executing %s: %s (%d)", path, g_strerror (errno), errno); + } + g_free (path); + + return 0; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/gst-typefind.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/gst-typefind.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,184 @@ +/* GStreamer + * Copyright (C) 2003 Thomas Vander Stichele + * 2003 Benjamin Otte + * 2005 Andy Wingo + * + * gst-typefind.c: Use GStreamer to find the type of a file + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "tools.h" + +static void +have_type_handler (GstElement * typefind, guint probability, + const GstCaps * caps, GstCaps ** p_caps) +{ + if (p_caps) { + *p_caps = gst_caps_copy (caps); + } +} + +static void +typefind_file (const gchar * filename) +{ + GstStateChangeReturn sret; + GstElement *pipeline; + GstElement *source; + GstElement *typefind; + GstElement *fakesink; + GstState state; + GstCaps *caps = NULL; + GDir *dir; + + if ((dir = g_dir_open (filename, 0, NULL))) { + const gchar *entry; + + while ((entry = g_dir_read_name (dir))) { + gchar *path; + + path = g_strconcat (filename, G_DIR_SEPARATOR_S, entry, NULL); + typefind_file (path); + g_free (path); + } + + g_dir_close (dir); + return; + } + + pipeline = gst_pipeline_new ("pipeline"); + + source = gst_element_factory_make ("filesrc", "source"); + g_assert (GST_IS_ELEMENT (source)); + typefind = gst_element_factory_make ("typefind", "typefind"); + g_assert (GST_IS_ELEMENT (typefind)); + fakesink = gst_element_factory_make ("fakesink", "fakesink"); + g_assert (GST_IS_ELEMENT (typefind)); + + gst_bin_add_many (GST_BIN (pipeline), source, typefind, fakesink, NULL); + gst_element_link_many (source, typefind, fakesink, NULL); + + g_signal_connect (G_OBJECT (typefind), "have-type", + G_CALLBACK (have_type_handler), &caps); + + g_object_set (source, "location", filename, NULL); + + GST_DEBUG ("Starting typefinding for %s", filename); + + /* typefind will only commit to PAUSED if it actually finds a type; + * otherwise the state change fails */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); + + /* wait until state change either completes or fails */ + sret = gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL, -1); + + switch (sret) { + case GST_STATE_CHANGE_FAILURE:{ + GstMessage *msg; + GstBus *bus; + GError *err = NULL; + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); + gst_object_unref (bus); + + if (msg) { + gst_message_parse_error (msg, &err, NULL); + g_printerr ("%s - FAILED: %s\n", filename, err->message); + g_error_free (err); + gst_message_unref (msg); + } else { + g_printerr ("%s - FAILED: unknown error\n", filename); + } + break; + } + case GST_STATE_CHANGE_SUCCESS:{ + if (caps) { + gchar *caps_str; + + caps_str = gst_caps_to_string (caps); + g_print ("%s - %s\n", filename, caps_str); + g_free (caps_str); + gst_caps_unref (caps); + } else { + g_print ("%s - %s\n", filename, "No type found"); + } + break; + } + default: + g_assert_not_reached (); + } + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); +} + +int +main (int argc, char *argv[]) +{ + static gchar **filenames = NULL; + guint num, i; + GError *err = NULL; + GOptionContext *ctx; + GOptionEntry options[] = { + GST_TOOLS_GOPTION_VERSION, + {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}, + {NULL} + }; + +#ifdef ENABLE_NLS + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); +#endif + + if (!g_thread_supported ()) + g_thread_init (NULL); + + ctx = g_option_context_new ("FILES"); + g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", GST_STR_NULL (err->message)); + exit (1); + } + g_option_context_free (ctx); + + gst_tools_print_version ("gst-typefind"); + + if (filenames == NULL || *filenames == NULL) { + g_print ("Please give a filename to typefind\n\n"); + return 1; + } + + num = g_strv_length (filenames); + + for (i = 0; i < num; ++i) { + typefind_file (filenames[i]); + } + + g_strfreev (filenames); + + return 0; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/gst-xmlinspect.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/gst-xmlinspect.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,856 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include "tools.h" + +#define PUT_START_TAG(pfx,tag) \ +G_STMT_START{ \ + g_print ("%*.*s<%s>\n", pfx, pfx, "", tag); \ +}G_STMT_END + +#define PUT_END_TAG(pfx,tag) \ +G_STMT_START{ \ + g_print ("%*.*s\n", pfx, pfx, "", tag); \ +}G_STMT_END + +#define PUT_ESCAPED(pfx,tag,value) \ +G_STMT_START{ \ + const gchar *toconv = value; \ + if (value) { \ + gchar *v = g_markup_escape_text (toconv, strlen (toconv)); \ + g_print ("%*.*s<%s>%s\n", pfx, pfx, "", tag, v, tag); \ + g_free (v); \ + } \ +}G_STMT_END + +#ifdef G_HAVE_ISO_VARARGS + +#define PUT_STRING(pfx, ...) \ +G_STMT_START{ \ + gchar *ps_val = g_strdup_printf(__VA_ARGS__); \ + g_print ("%*.*s%s\n", pfx, pfx, "", ps_val); \ + g_free(ps_val); \ +}G_STMT_END + +#elif defined(G_HAVE_GNUC_VARARGS) + +#define PUT_STRING(pfx, str, a...) \ +G_STMT_START{ \ + g_print ("%*.*s"str"\n", pfx, pfx, "" , ##a); \ +}G_STMT_END + +#else + +static inline void +PUT_STRING (int pfx, const char *format, ...) +{ + va_list varargs; + + g_print ("%*.*s", pfx, pfx, ""); + va_start (varargs, format); + g_vprintf (format, varargs); + va_end (varargs); + g_print ("\n"); +} + +#endif + +static void +print_caps (const GstCaps * caps, gint pfx) +{ + char *s; + + if (!caps) + return; + + s = gst_caps_to_string (caps); + PUT_ESCAPED (pfx, "caps", s); + g_free (s); +} + +#if 0 +static void +print_formats (const GstFormat * formats, gint pfx) +{ + while (formats && *formats) { + const GstFormatDefinition *definition; + + definition = gst_format_get_details (*formats); + if (definition) + PUT_STRING (pfx, "%s", + *formats, definition->nick, definition->description); + else + PUT_STRING (pfx, "unknown", *formats); + + formats++; + } +} +#endif + +static void +print_query_types (const GstQueryType * types, gint pfx) +{ + while (types && *types) { + const GstQueryTypeDefinition *definition; + + definition = gst_query_type_get_details (*types); + if (definition) + PUT_STRING (pfx, "%s", + *types, definition->nick, definition->description); + else + PUT_STRING (pfx, "unknown", *types); + + types++; + } +} + +#if 0 +static void +print_event_masks (const GstEventMask * masks, gint pfx) +{ +#ifndef GST_DISABLE_ENUMTYPES + GType event_type; + GEnumClass *klass; + GType event_flags; + GFlagsClass *flags_class = NULL; + + event_type = gst_event_type_get_type (); + klass = (GEnumClass *) g_type_class_ref (event_type); + + while (masks && masks->type) { + GEnumValue *value; + gint flags = 0, index = 0; + + switch (masks->type) { + case GST_EVENT_SEEK: + flags = masks->flags; + event_flags = gst_seek_type_get_type (); + flags_class = (GFlagsClass *) g_type_class_ref (event_flags); + break; + default: + break; + } + + value = g_enum_get_value (klass, masks->type); + PUT_STRING (pfx, "", value->value_nick); + + while (flags) { + GFlagsValue *value; + + if (flags & 1) { + value = g_flags_get_first_value (flags_class, 1 << index); + + if (value) + PUT_ESCAPED (pfx + 1, "flag", value->value_nick); + else + PUT_ESCAPED (pfx + 1, "flag", "?"); + } + flags >>= 1; + index++; + } + PUT_END_TAG (pfx, "event"); + + masks++; + } +#endif +} +#endif + +static void +output_hierarchy (GType type, gint level, gint * maxlevel) +{ + GType parent; + + parent = g_type_parent (type); + + *maxlevel = *maxlevel + 1; + level++; + + PUT_STRING (level, "", g_type_name (type)); + + if (parent) + output_hierarchy (parent, level, maxlevel); + + PUT_END_TAG (level, "object"); +} + +static void +print_element_properties (GstElement * element, gint pfx) +{ + GParamSpec **property_specs; + guint num_properties; + gint i; + gboolean readable; + + property_specs = g_object_class_list_properties + (G_OBJECT_GET_CLASS (element), &num_properties); + + PUT_START_TAG (pfx, "element-properties"); + + for (i = 0; i < num_properties; i++) { + GValue value = { 0, }; + GParamSpec *param = property_specs[i]; + + readable = FALSE; + + g_value_init (&value, param->value_type); + if (param->flags & G_PARAM_READABLE) { + g_object_get_property (G_OBJECT (element), param->name, &value); + readable = TRUE; + } + PUT_START_TAG (pfx + 1, "element-property"); + PUT_ESCAPED (pfx + 2, "name", g_param_spec_get_name (param)); + PUT_ESCAPED (pfx + 2, "type", g_type_name (param->value_type)); + PUT_ESCAPED (pfx + 2, "nick", g_param_spec_get_nick (param)); + PUT_ESCAPED (pfx + 2, "blurb", g_param_spec_get_blurb (param)); + if (readable) { + PUT_ESCAPED (pfx + 2, "flags", "RW"); + } else { + PUT_ESCAPED (pfx + 2, "flags", "W"); + } + + switch (G_VALUE_TYPE (&value)) { + case G_TYPE_STRING: + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + case G_TYPE_BOOLEAN: + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + case G_TYPE_ULONG: + { + GParamSpecULong *pulong = G_PARAM_SPEC_ULONG (param); + + PUT_STRING (pfx + 2, "", + pulong->minimum, pulong->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_LONG: + { + GParamSpecLong *plong = G_PARAM_SPEC_LONG (param); + + PUT_STRING (pfx + 2, "", + plong->minimum, plong->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_UINT: + { + GParamSpecUInt *puint = G_PARAM_SPEC_UINT (param); + + PUT_STRING (pfx + 2, "", + puint->minimum, puint->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_INT: + { + GParamSpecInt *pint = G_PARAM_SPEC_INT (param); + + PUT_STRING (pfx + 2, "", + pint->minimum, pint->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_UINT64: + { + GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64 (param); + + PUT_STRING (pfx + 2, + "", puint64->minimum, puint64->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_INT64: + { + GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64 (param); + + PUT_STRING (pfx + 2, + "", pint64->minimum, pint64->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_FLOAT: + { + GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT (param); + + PUT_STRING (pfx + 2, "", + pfloat->minimum, pfloat->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + case G_TYPE_DOUBLE: + { + GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE (param); + + PUT_STRING (pfx + 2, "", + pdouble->minimum, pdouble->maximum); + PUT_ESCAPED (pfx + 2, "default", g_strdup_value_contents (&value)); + break; + } + default: + if (param->value_type == GST_TYPE_CAPS) { + GstCaps *caps = g_value_peek_pointer (&value); + + if (!caps) + PUT_ESCAPED (pfx + 2, "default", "NULL"); + else { + print_caps (caps, 2); + } + } else if (G_IS_PARAM_SPEC_ENUM (param)) { + GEnumValue *values; + guint j = 0; + gint enum_value; + + values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values; + enum_value = g_value_get_enum (&value); + + while (values[j].value_name) { + if (values[j].value == enum_value) + break; + j++; + } + PUT_STRING (pfx + 2, "%d", values[j].value); + + PUT_START_TAG (pfx + 2, "enum-values"); + j = 0; + while (values[j].value_name) { + PUT_STRING (pfx + 3, "", + values[j].value, values[j].value_nick); + j++; + } + PUT_END_TAG (pfx + 2, "enum-values"); + } else if (G_IS_PARAM_SPEC_FLAGS (param)) { + GFlagsValue *values; + guint j = 0; + gint flags_value; + + values = G_FLAGS_CLASS (g_type_class_ref (param->value_type))->values; + flags_value = g_value_get_flags (&value); + + PUT_STRING (pfx + 2, "%d", flags_value); + + PUT_START_TAG (pfx + 2, "flags"); + j = 0; + while (values[j].value_name) { + PUT_STRING (pfx + 3, "", + values[j].value, values[j].value_nick); + j++; + } + PUT_END_TAG (pfx + 2, "flags"); + } else if (G_IS_PARAM_SPEC_OBJECT (param)) { + PUT_ESCAPED (pfx + 2, "object-type", g_type_name (param->value_type)); + } + break; + } + + PUT_END_TAG (pfx + 1, "element-property"); + } + PUT_END_TAG (pfx, "element-properties"); + g_free (property_specs); +} + +static void +print_element_signals (GstElement * element, gint pfx) +{ + guint *signals; + guint nsignals; + gint i, k; + GSignalQuery *query; + + signals = g_signal_list_ids (G_OBJECT_TYPE (element), &nsignals); + for (k = 0; k < 2; k++) { + gint counted = 0; + + if (k == 0) + PUT_START_TAG (pfx, "element-signals"); + else + PUT_START_TAG (pfx, "element-actions"); + + for (i = 0; i < nsignals; i++) { + gint n_params; + GType return_type; + const GType *param_types; + gint j; + + query = g_new0 (GSignalQuery, 1); + g_signal_query (signals[i], query); + + if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) || + (k == 1 && (query->signal_flags & G_SIGNAL_ACTION))) { + n_params = query->n_params; + return_type = query->return_type; + param_types = query->param_types; + + PUT_START_TAG (pfx + 1, "signal"); + PUT_ESCAPED (pfx + 2, "name", query->signal_name); + PUT_ESCAPED (pfx + 2, "return-type", g_type_name (return_type)); + PUT_ESCAPED (pfx + 2, "object-type", + g_type_name (G_OBJECT_TYPE (element))); + + PUT_START_TAG (pfx + 2, "params"); + for (j = 0; j < n_params; j++) { + PUT_ESCAPED (pfx + 3, "type", g_type_name (param_types[j])); + } + + PUT_END_TAG (pfx + 2, "params"); + + PUT_END_TAG (pfx + 1, "signal"); + + counted++; + } + + g_free (query); + } + if (k == 0) + PUT_END_TAG (pfx, "element-signals"); + else + PUT_END_TAG (pfx, "element-actions"); + } +} + +static gint +print_element_info (GstElementFactory * factory) +{ + GstElement *element; + GstObjectClass *gstobject_class; + GstElementClass *gstelement_class; + GList *pads; + GstPad *pad; + GstStaticPadTemplate *padtemplate; + gint maxlevel = 0; + + element = gst_element_factory_create (factory, "element"); + if (!element) { + g_print ("couldn't construct element for some reason\n"); + return -1; + } + PUT_START_TAG (0, "element"); + PUT_ESCAPED (1, "name", GST_PLUGIN_FEATURE_NAME (factory)); + + gstobject_class = GST_OBJECT_CLASS (G_OBJECT_GET_CLASS (element)); + gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); + + PUT_START_TAG (1, "details"); + PUT_ESCAPED (2, "long-name", factory->details.longname); + PUT_ESCAPED (2, "class", factory->details.klass); + PUT_ESCAPED (2, "description", factory->details.description); + PUT_ESCAPED (2, "authors", factory->details.author); + PUT_END_TAG (1, "details"); + + output_hierarchy (G_OBJECT_TYPE (element), 0, &maxlevel); + + PUT_START_TAG (1, "pad-templates"); + if (factory->numpadtemplates) { + pads = factory->staticpadtemplates; + while (pads) { + padtemplate = (GstStaticPadTemplate *) (pads->data); + pads = g_list_next (pads); + + PUT_START_TAG (2, "pad-template"); + PUT_ESCAPED (3, "name", padtemplate->name_template); + + if (padtemplate->direction == GST_PAD_SRC) + PUT_ESCAPED (3, "direction", "src"); + else if (padtemplate->direction == GST_PAD_SINK) + PUT_ESCAPED (3, "direction", "sink"); + else + PUT_ESCAPED (3, "direction", "unknown"); + + if (padtemplate->presence == GST_PAD_ALWAYS) + PUT_ESCAPED (3, "presence", "always"); + else if (padtemplate->presence == GST_PAD_SOMETIMES) + PUT_ESCAPED (3, "presence", "sometimes"); + else if (padtemplate->presence == GST_PAD_REQUEST) { + PUT_ESCAPED (3, "presence", "request"); + PUT_ESCAPED (3, "request-function", + GST_DEBUG_FUNCPTR_NAME (gstelement_class->request_new_pad)); + } else + PUT_ESCAPED (3, "presence", "unknown"); + + if (padtemplate->static_caps.string) { + print_caps (gst_static_caps_get (&padtemplate->static_caps), 3); + } + PUT_END_TAG (2, "pad-template"); + } + } + PUT_END_TAG (1, "pad-templates"); + + PUT_START_TAG (1, "element-flags"); + PUT_END_TAG (1, "element-flags"); + + if (GST_IS_BIN (element)) { + PUT_START_TAG (1, "bin-flags"); + + PUT_END_TAG (1, "bin-flags"); + } + + + PUT_START_TAG (1, "element-implementation"); + + PUT_STRING (2, "", + GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state)); + +#ifndef GST_DISABLE_LOADSAVE + PUT_STRING (2, "", + GST_DEBUG_FUNCPTR_NAME (gstobject_class->save_thyself)); + PUT_STRING (2, "", + GST_DEBUG_FUNCPTR_NAME (gstobject_class->restore_thyself)); +#endif + PUT_END_TAG (1, "element-implementation"); + + PUT_START_TAG (1, "clocking-interaction"); + if (gst_element_requires_clock (element)) { + PUT_STRING (2, ""); + } + if (gst_element_provides_clock (element)) { + GstClock *clock; + + clock = gst_element_get_clock (element); + if (clock) + PUT_STRING (2, "", GST_OBJECT_NAME (clock)); + } + PUT_END_TAG (1, "clocking-interaction"); + +#ifndef GST_DISABLE_INDEX + if (gst_element_is_indexable (element)) { + PUT_STRING (1, ""); + } +#endif + + PUT_START_TAG (1, "pads"); + if (element->numpads) { + const GList *pads; + + pads = element->pads; + while (pads) { + pad = GST_PAD (pads->data); + pads = g_list_next (pads); + + PUT_START_TAG (2, "pad"); + PUT_ESCAPED (3, "name", gst_pad_get_name (pad)); + + if (gst_pad_get_direction (pad) == GST_PAD_SRC) + PUT_ESCAPED (3, "direction", "src"); + else if (gst_pad_get_direction (pad) == GST_PAD_SINK) + PUT_ESCAPED (3, "direction", "sink"); + else + PUT_ESCAPED (3, "direction", "unknown"); + + if (pad->padtemplate) + PUT_ESCAPED (3, "template", pad->padtemplate->name_template); + + PUT_START_TAG (3, "implementation"); + if (pad->chainfunc) + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->chainfunc)); + if (pad->getrangefunc) + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->getrangefunc)); + if (pad->eventfunc != gst_pad_event_default) + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->eventfunc)); + if (pad->queryfunc != gst_pad_query_default) + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->queryfunc)); + if (pad->querytypefunc != gst_pad_get_query_types_default) { + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->querytypefunc)); + print_query_types (gst_pad_get_query_types (pad), 5); + PUT_END_TAG (4, "query-type-func"); + } + + if (pad->intlinkfunc != gst_pad_get_internal_links_default) + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->intlinkfunc)); + + if (pad->bufferallocfunc) + PUT_STRING (4, "", + GST_DEBUG_FUNCPTR_NAME (pad->bufferallocfunc)); + PUT_END_TAG (3, "implementation"); + + if (pad->caps) { + print_caps (pad->caps, 3); + } + PUT_END_TAG (2, "pad"); + } + } + PUT_END_TAG (1, "pads"); + + print_element_properties (element, 1); + print_element_signals (element, 1); + + /* for compound elements */ + /* FIXME: gst_bin_get_list does not exist anymore + if (GST_IS_BIN (element)) { + GList *children; + GstElement *child; + PUT_START_TAG (1, "children"); + children = (GList *) gst_bin_get_list (GST_BIN (element)); + while (children) { + child = GST_ELEMENT (children->data); + children = g_list_next (children); + + PUT_ESCAPED (2, "child", GST_ELEMENT_NAME (child)); + } + PUT_END_TAG (1, "children"); + } + */ + PUT_END_TAG (0, "element"); + + return 0; +} + +static void +print_element_list (void) +{ + GList *plugins; + + plugins = gst_default_registry_get_plugin_list (); + while (plugins) { + GList *features; + GstPlugin *plugin; + + plugin = (GstPlugin *) (plugins->data); + plugins = g_list_next (plugins); + + 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); + + if (GST_IS_ELEMENT_FACTORY (feature)) { + GstElementFactory *factory; + + factory = GST_ELEMENT_FACTORY (feature); + g_print ("%s: %s: %s\n", plugin->desc.name, + GST_PLUGIN_FEATURE_NAME (factory), + gst_element_factory_get_longname (factory)); + } +#ifndef GST_DISABLE_INDEX + else if (GST_IS_INDEX_FACTORY (feature)) { + GstIndexFactory *factory; + + factory = GST_INDEX_FACTORY (feature); + g_print ("%s: %s: %s\n", plugin->desc.name, + GST_PLUGIN_FEATURE_NAME (factory), factory->longdesc); + } +#endif + else if (GST_IS_TYPE_FIND_FACTORY (feature)) { + GstTypeFindFactory *factory; + + factory = GST_TYPE_FIND_FACTORY (feature); + if (factory->extensions) { + guint i = 0; + + g_print ("%s type: ", plugin->desc.name); + while (factory->extensions[i]) { + g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]); + i++; + } + } else + g_print ("%s type: N/A\n", plugin->desc.name); + } else { + g_print ("%s: %s (%s)\n", plugin->desc.name, + GST_PLUGIN_FEATURE_NAME (feature), + g_type_name (G_OBJECT_TYPE (feature))); + } + + features = g_list_next (features); + } + } +} + +static void +print_plugin_info (GstPlugin * plugin) +{ + GList *features; + gint num_features = 0; + gint num_elements = 0; + gint num_autoplug = 0; + gint num_types = 0; + gint num_indexes = 0; + gint num_other = 0; + + g_print ("Plugin Details:\n"); + g_print (" Name:\t\t%s\n", plugin->desc.name); + g_print (" Description:\t%s\n", plugin->desc.description); + g_print (" Filename:\t%s\n", plugin->filename); + g_print (" Version:\t%s\n", plugin->desc.version); + g_print (" License:\t%s\n", plugin->desc.license); + g_print (" Package:\t%s\n", plugin->desc.package); + g_print (" Origin URL:\t%s\n", plugin->desc.origin); + g_print ("\n"); + + 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); + + if (GST_IS_ELEMENT_FACTORY (feature)) { + GstElementFactory *factory; + + factory = GST_ELEMENT_FACTORY (feature); + g_print (" %s: %s\n", GST_OBJECT_NAME (factory), + gst_element_factory_get_longname (factory)); + num_elements++; + } +#ifndef GST_DISABLE_INDEX + else if (GST_IS_INDEX_FACTORY (feature)) { + GstIndexFactory *factory; + + factory = GST_INDEX_FACTORY (feature); + g_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc); + num_indexes++; + } +#endif + else if (GST_IS_TYPE_FIND_FACTORY (feature)) { + GstTypeFindFactory *factory; + + factory = GST_TYPE_FIND_FACTORY (feature); + if (factory->extensions) { + guint i = 0; + + g_print ("%s type: ", plugin->desc.name); + while (factory->extensions[i]) { + g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]); + i++; + } + } else + g_print ("%s type: N/A\n", plugin->desc.name); + num_types++; + } else { + g_print (" %s (%s)\n", GST_OBJECT_NAME (feature), + g_type_name (G_OBJECT_TYPE (feature))); + num_other++; + } + num_features++; + features = g_list_next (features); + } + g_print ("\n %d features:\n", num_features); + if (num_elements > 0) + g_print (" +-- %d elements\n", num_elements); + if (num_autoplug > 0) + g_print (" +-- %d autopluggers\n", num_autoplug); + if (num_types > 0) + g_print (" +-- %d types\n", num_types); + if (num_indexes > 0) + g_print (" +-- %d indexes\n", num_indexes); + if (num_other > 0) + g_print (" +-- %d other objects\n", num_other); + + g_print ("\n"); +} + + +int +main (int argc, char *argv[]) +{ + GstElementFactory *factory; + GstPlugin *plugin; + gchar *so; + GOptionEntry options[] = { + {"gst-inspect-plugin", 'p', 0, G_OPTION_ARG_STRING, + "Show plugin details", NULL}, + {"gst-inspect-scheduler", 's', 0, G_OPTION_ARG_STRING, + "Show scheduler details", NULL}, + GST_TOOLS_GOPTION_VERSION, + {NULL} + }; + GOptionContext *ctx; + GError *err = NULL; + + setlocale (LC_ALL, ""); + + if (!g_thread_supported ()) + g_thread_init (NULL); + + ctx = g_option_context_new ("[ELEMENT-NAME | PLUGIN-NAME]"); + g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", err->message); + exit (1); + } + g_option_context_free (ctx); + + gst_tools_print_version ("gst-xmlinspect"); + + PUT_STRING (0, ""); + + /* if no arguments, print out list of elements */ + if (argc == 1) { + print_element_list (); + + /* else we try to get a factory */ + } else { + /* first check for help */ + if (strstr (argv[1], "-help")) { + g_print ("Usage: %s\t\t\tList all registered elements\n", argv[0]); + g_print (" %s element-name\tShow element details\n", argv[0]); + g_print (" %s plugin-name[.so]\tShow information about plugin\n", + argv[0]); + return 0; + } + + /* only search for a factory if there's not a '.so' */ + if (!strstr (argv[1], ".so")) { + factory = gst_element_factory_find (argv[1]); + + /* if there's a factory, print out the info */ + if (factory) + return print_element_info (factory); + else { + GstPluginFeature *feature; + + /* FIXME implement other pretty print function for these */ +#ifndef GST_DISABLE_INDEX + feature = gst_default_registry_find_feature (argv[1], + GST_TYPE_INDEX_FACTORY); + if (feature) { + g_print ("%s: an index\n", argv[1]); + return 0; + } +#endif + feature = gst_default_registry_find_feature (argv[1], + GST_TYPE_TYPE_FIND_FACTORY); + if (feature) { + g_print ("%s: a type find function\n", argv[1]); + return 0; + } + } + } else { + /* strip the .so */ + so = strstr (argv[1], ".so"); + so[0] = '\0'; + } + + /* otherwise assume it's a plugin */ + plugin = gst_default_registry_find_plugin (argv[1]); + + /* if there is such a plugin, print out info */ + + if (plugin) { + print_plugin_info (plugin); + } else { + g_print ("no such element or plugin '%s'\n", argv[1]); + return -1; + } + } + + return 0; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/tools.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/tools.bat Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,3 @@ +gst-launch filesrc location=c:\\data\\warning.wav ! wavparse ! audioconvert ! audioresample ! devsoundsink +gst-launch filesrc location=c:\\data\\Crnival.mp3 ! devsoundsink +gst-launch filesrc location=c:\\data\\test.raw ! devsoundsink diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tools/tools.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tools/tools.h Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,66 @@ +/* GStreamer + * Copyright (C) 2005 Benjamin Otte + * + * tools.h: header for common stuff of all GStreamer tools + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + +#ifndef __GST_TOOLS_H__ +#define __GST_TOOLS_H__ + +#include + +#include +#include "gst/gst-i18n-app.h" + +/* + * This is a kind of hacky way to make all the tools use the same version code. + * If anyone knows a less hacky way to get this done, feel free to implement it. + * + * It also includes all the files that all the tools require. + */ + +static gboolean __gst_tools_version = FALSE; + +#define GST_TOOLS_GOPTION_VERSION \ + { "version", 0, 0, G_OPTION_ARG_NONE, &__gst_tools_version, \ + N_("Print version information and exit"), NULL } + +static void +gst_tools_print_version (const gchar * tool) +{ + gchar *s; + + s = g_strdup_printf ("%s-%u.%u", tool, GST_VERSION_MAJOR, GST_VERSION_MINOR); + g_set_prgname (s); + g_free (s); + + if (__gst_tools_version) { + gchar *version_str; + + version_str = gst_version_string (); + g_print ("%s version %u.%u.%u\n", g_get_prgname (), + GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO); + g_print ("%s\n", version_str); + g_print ("%s\n", GST_PACKAGE_ORIGIN); + g_free (version_str); + exit (0); + } +} + +#endif /* __GST_TOOLS_H__ */ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/createelementcore/group/createelementcore.mmp --- a/gstreamer_core/tsrc/check/elements/createelementcore/group/createelementcore.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/createelementcore/group/createelementcore.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/fakesink/group/fakesink.mmp --- a/gstreamer_core/tsrc/check/elements/fakesink/group/fakesink.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/fakesink/group/fakesink.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/fakesink/src/fakesink.c --- a/gstreamer_core/tsrc/check/elements/fakesink/src/fakesink.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/fakesink/src/fakesink.c Thu Jul 22 16:36:00 2010 +0100 @@ -25,6 +25,7 @@ #include #include + #define LOG_FILE "c:\\logs\\fakesink_log1.txt" #include "std_log_result.h" #define LOG_FILENAME_LINE __FILE__, __LINE__ diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/fakesrc/group/fakesrc.mmp --- a/gstreamer_core/tsrc/check/elements/fakesrc/group/fakesrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/fakesrc/group/fakesrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/fdsrc/group/fdsrc.mmp --- a/gstreamer_core/tsrc/check/elements/fdsrc/group/fdsrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/fdsrc/group/fdsrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/filesink/group/filesink.mmp --- a/gstreamer_core/tsrc/check/elements/filesink/group/filesink.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/filesink/group/filesink.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/filesrc/group/filesrc.mmp --- a/gstreamer_core/tsrc/check/elements/filesrc/group/filesrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/filesrc/group/filesrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/gstqueue/group/gstqueue.mmp --- a/gstreamer_core/tsrc/check/elements/gstqueue/group/gstqueue.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/gstqueue/group/gstqueue.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/identity/group/identity.mmp --- a/gstreamer_core/tsrc/check/elements/identity/group/identity.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/identity/group/identity.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/multiqueue/group/multiqueue.mmp --- a/gstreamer_core/tsrc/check/elements/multiqueue/group/multiqueue.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/multiqueue/group/multiqueue.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/elements/tee/group/tee.mmp --- a/gstreamer_core/tsrc/check/elements/tee/group/tee.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/elements/tee/group/tee.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/generic/gststates/group/gststates.mmp --- a/gstreamer_core/tsrc/check/generic/gststates/group/gststates.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/generic/gststates/group/gststates.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/generic/sinks/group/sinks.mmp --- a/gstreamer_core/tsrc/check/generic/sinks/group/sinks.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/generic/sinks/group/sinks.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -34,12 +34,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gst/group/gst.mmp --- a/gstreamer_core/tsrc/check/gst/gst/group/gst.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gst/group/gst.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstbin/group/gstbin.mmp --- a/gstreamer_core/tsrc/check/gst/gstbin/group/gstbin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstbin/group/gstbin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstbuffer/group/gstbuffer.mmp --- a/gstreamer_core/tsrc/check/gst/gstbuffer/group/gstbuffer.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstbuffer/group/gstbuffer.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstbus/group/gstbus.mmp --- a/gstreamer_core/tsrc/check/gst/gstbus/group/gstbus.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstbus/group/gstbus.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstcaps/group/gstcaps.mmp --- a/gstreamer_core/tsrc/check/gst/gstcaps/group/gstcaps.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstcaps/group/gstcaps.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstelement/group/gstelement.mmp --- a/gstreamer_core/tsrc/check/gst/gstelement/group/gstelement.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstelement/group/gstelement.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstevent/group/gstevent.mmp --- a/gstreamer_core/tsrc/check/gst/gstevent/group/gstevent.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstevent/group/gstevent.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstghostpad/group/gstghostpad.mmp --- a/gstreamer_core/tsrc/check/gst/gstghostpad/group/gstghostpad.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstghostpad/group/gstghostpad.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstindex/group/gstindex.mmp --- a/gstreamer_core/tsrc/check/gst/gstindex/group/gstindex.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstindex/group/gstindex.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstinterface/group/gstinterface.mmp --- a/gstreamer_core/tsrc/check/gst/gstinterface/group/gstinterface.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstinterface/group/gstinterface.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstiterator/group/gstiterator.mmp --- a/gstreamer_core/tsrc/check/gst/gstiterator/group/gstiterator.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstiterator/group/gstiterator.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -19,12 +19,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstmessage/group/gstmessage.mmp --- a/gstreamer_core/tsrc/check/gst/gstmessage/group/gstmessage.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstmessage/group/gstmessage.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstminiobject/group/gstminiobject.mmp --- a/gstreamer_core/tsrc/check/gst/gstminiobject/group/gstminiobject.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstminiobject/group/gstminiobject.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstobject/group/gstobject.mmp --- a/gstreamer_core/tsrc/check/gst/gstobject/group/gstobject.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstobject/group/gstobject.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstpad/group/gstpad.mmp --- a/gstreamer_core/tsrc/check/gst/gstpad/group/gstpad.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstpad/group/gstpad.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstparamspecs/group/gstparamspecs.mmp --- a/gstreamer_core/tsrc/check/gst/gstparamspecs/group/gstparamspecs.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstparamspecs/group/gstparamspecs.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstpipeline/group/gstpipeline.mmp --- a/gstreamer_core/tsrc/check/gst/gstpipeline/group/gstpipeline.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstpipeline/group/gstpipeline.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstplugin/group/gstplugin.mmp --- a/gstreamer_core/tsrc/check/gst/gstplugin/group/gstplugin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstplugin/group/gstplugin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstpoll/group/gstpoll.mmp --- a/gstreamer_core/tsrc/check/gst/gstpoll/group/gstpoll.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstpoll/group/gstpoll.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstquery/group/gstquery.mmp --- a/gstreamer_core/tsrc/check/gst/gstquery/group/gstquery.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstquery/group/gstquery.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstregistry/group/gstregistry.mmp --- a/gstreamer_core/tsrc/check/gst/gstregistry/group/gstregistry.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstregistry/group/gstregistry.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -35,12 +35,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstsegment/group/gstsegment.mmp --- a/gstreamer_core/tsrc/check/gst/gstsegment/group/gstsegment.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstsegment/group/gstsegment.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gststructure/group/gststructure.mmp --- a/gstreamer_core/tsrc/check/gst/gststructure/group/gststructure.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gststructure/group/gststructure.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gststructure/src/gststructure.c --- a/gstreamer_core/tsrc/check/gst/gststructure/src/gststructure.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gststructure/src/gststructure.c Thu Jul 22 16:36:00 2010 +0100 @@ -36,9 +36,6 @@ #define xmlfile *(get_xmlfile()) #endif - - - #if EMULATOR static GET_GLOBAL_VAR_FROM_TLS(raised_critical,gstcheck,gboolean) #define _gst_check_raised_critical (*GET_GSTREAMER_WSD_VAR_NAME(raised_critical,gstcheck,g)()) diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstsystemclock/group/gstsystemclock.mmp --- a/gstreamer_core/tsrc/check/gst/gstsystemclock/group/gstsystemclock.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstsystemclock/group/gstsystemclock.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -39,12 +39,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SYSTEMINCLUDE ../../../../../libs diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gsttag/group/gsttag.mmp --- a/gstreamer_core/tsrc/check/gst/gsttag/group/gsttag.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gsttag/group/gsttag.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -20,12 +20,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gsttagsetter/group/gsttagsetter.mmp --- a/gstreamer_core/tsrc/check/gst/gsttagsetter/group/gsttagsetter.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gsttagsetter/group/gsttagsetter.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,12 +37,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gsttask/group/gsttask.mmp --- a/gstreamer_core/tsrc/check/gst/gsttask/group/gsttask.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gsttask/group/gsttask.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gsturi/group/gsturi.mmp --- a/gstreamer_core/tsrc/check/gst/gsturi/group/gsturi.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gsturi/group/gsturi.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -21,12 +21,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstutils/group/gstutils.mmp --- a/gstreamer_core/tsrc/check/gst/gstutils/group/gstutils.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstutils/group/gstutils.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -21,12 +21,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/gst/gstvalue/group/gstvalue.mmp --- a/gstreamer_core/tsrc/check/gst/gstvalue/group/gstvalue.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/gst/gstvalue/group/gstvalue.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -38,12 +38,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SYSTEMINCLUDE ../../../../../libs diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/adapter/group/adapter.mmp --- a/gstreamer_core/tsrc/check/libs/adapter/group/adapter.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/adapter/group/adapter.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/basesrc/group/basesrc.mmp --- a/gstreamer_core/tsrc/check/libs/basesrc/group/basesrc.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/basesrc/group/basesrc.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/collectpads/group/collectpads.mmp --- a/gstreamer_core/tsrc/check/libs/collectpads/group/collectpads.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/collectpads/group/collectpads.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,12 +37,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/controller/group/controller.mmp --- a/gstreamer_core/tsrc/check/libs/controller/group/controller.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/controller/group/controller.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/gdp/group/gdp.mmp --- a/gstreamer_core/tsrc/check/libs/gdp/group/gdp.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/gdp/group/gdp.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/gstnetclientclock/group/gstnetclientclock.mmp --- a/gstreamer_core/tsrc/check/libs/gstnetclientclock/group/gstnetclientclock.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/gstnetclientclock/group/gstnetclientclock.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/gstnettimeprovider/group/gstnettimeprovider.mmp --- a/gstreamer_core/tsrc/check/libs/gstnettimeprovider/group/gstnettimeprovider.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/gstnettimeprovider/group/gstnettimeprovider.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/libsabi/group/libsabi.mmp --- a/gstreamer_core/tsrc/check/libs/libsabi/group/libsabi.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/libsabi/group/libsabi.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/libs/typefindhelper/group/typefindhelper.mmp --- a/gstreamer_core/tsrc/check/libs/typefindhelper/group/typefindhelper.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/libs/typefindhelper/group/typefindhelper.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/pipelines/cleanup/group/cleanup.mmp --- a/gstreamer_core/tsrc/check/pipelines/cleanup/group/cleanup.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/pipelines/cleanup/group/cleanup.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/pipelines/core-simple-launch-lines/group/core-simple-launch-lines.mmp --- a/gstreamer_core/tsrc/check/pipelines/core-simple-launch-lines/group/core-simple-launch-lines.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/pipelines/core-simple-launch-lines/group/core-simple-launch-lines.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/pipelines/parse-disabled/group/parse-disabled.mmp --- a/gstreamer_core/tsrc/check/pipelines/parse-disabled/group/parse-disabled.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/pipelines/parse-disabled/group/parse-disabled.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/pipelines/parse-launch/group/parse-launch.mmp --- a/gstreamer_core/tsrc/check/pipelines/parse-launch/group/parse-launch.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/pipelines/parse-launch/group/parse-launch.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/check/pipelines/stress/group/stress.mmp --- a/gstreamer_core/tsrc/check/pipelines/stress/group/stress.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/check/pipelines/stress/group/stress.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/adapter/group/testgstadapter.mmp --- a/gstreamer_core/tsrc/examples/adapter/group/testgstadapter.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/adapter/group/testgstadapter.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -57,12 +57,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/controller/group/testaudioexample.mmp --- a/gstreamer_core/tsrc/examples/controller/group/testaudioexample.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/controller/group/testaudioexample.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -54,12 +54,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/group/bld.inf --- a/gstreamer_core/tsrc/examples/group/bld.inf Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/group/bld.inf Thu Jul 22 16:36:00 2010 +0100 @@ -20,7 +20,7 @@ * */ - +#include "../gstseek/group/bld.inf" #include "../helloworld/group/bld.inf" #include "../controller/group/bld.inf" #include "../adapter/group/bld.inf" diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/gstseek/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tsrc/examples/gstseek/group/bld.inf Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +PRJ_TESTMMPFILES +gstseek.mmp + + + + diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/gstseek/group/gstseek.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tsrc/examples/gstseek/group/gstseek.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + +#include + +TARGET gstseek.exe +TARGETTYPE EXE +UID 0 0x0AB229ED + +EPOCHEAPSIZE 0x10000 0x100000 +#ifdef EKA2 +LANG SC +CAPABILITY All -Tcb +VENDORID VID_DEFAULT + +#endif + + + +MACRO HAVE_CONFIG_H + + +USERINCLUDE .. +USERINCLUDE ../libs/gst/base +USERINCLUDE ../gst +USERINCLUDE ../libs/gst/base +USERINCLUDE ../gst +USERINCLUDE ../../../../.. +USERINCLUDE ../../../../libs/gst/check +USERINCLUDE ../../../../gst +USERINCLUDE ../../../.. +USERINCLUDE ../../../../libs + +MW_LAYER_SYSTEMINCLUDE +OS_LAYER_LIBC_SYSTEMINCLUDE + +OS_LAYER_GLIB_SYSTEMINCLUDE +MW_LAYER_GSTREAMER_SYSTEMINCLUDE + + + + + +SOURCEPATH ../src + +SOURCE gstseek.c + + +LIBRARY euser.lib libc.lib +LIBRARY libpthread.lib +LIBRARY libdl.lib +LIBRARY libglib.lib +LIBRARY libgmodule.lib + +LIBRARY libgobject.lib +LIBRARY libgthread.lib +LIBRARY libm.lib +LIBRARY libz.lib +LIBRARY libgstreamer.lib +LIBRARY libgstbase.lib +LIBRARY libgstcontroller.lib + +STATICLIBRARY libcrt0.lib +//VENDORID VID_DEFAULT +SMPSAFE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/gstseek/src/gstseek.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gstreamer_core/tsrc/examples/gstseek/src/gstseek.c Thu Jul 22 16:36:00 2010 +0100 @@ -0,0 +1,214 @@ + +#include +#include +#include +#include + +#define LOG_FILE "c:\\logs\\launch_logs.txt" +#include "std_log_result.h" +#define LOG_FILENAME_LINE __FILE__, __LINE__ + + +void create_xml(int result) +{ + + if(result) + { + assert_failed = 1; + } + + testResultXml(xmlfile); + close_log_file(); + + if(result) + { + exit (-1); + } + +} + +GstElement *pipeline, *source, *wavparse,*sink,*conv,*resample,*decoder,*audioconvert,*audioresample ; +GstBus *bus; +GMainLoop *loop; + +static gboolean +bus_call (GstBus *bus, + GstMessage *msg, + gpointer data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + case GST_MESSAGE_EOS: + gst_element_set_state (pipeline, GST_STATE_NULL); + g_main_loop_quit(loop); + gst_object_unref (GST_OBJECT (pipeline)); + std_log(LOG_FILENAME_LINE, "Test Successful"); + create_xml(0); + break; + case GST_MESSAGE_ERROR: { + gchar *debug; + GError *err; + gst_message_parse_error (msg, &err, &debug); + g_free (debug); + g_print ("Error: %s\n", err->message); + g_error_free (err); + std_log(LOG_FILENAME_LINE, "Test Failed"); + create_xml(1); + break; + } + default: + break; + } + + return TRUE; +} + +static void +cb_newpad (GstElement *decodebin, + GstPad *pad, + gboolean last, + gpointer data) +{ + GstCaps *caps; + GstStructure *str; + GstPadLinkReturn linkret= GST_PAD_LINK_OK ; + + + GstPad* sinkpad = NULL; + + + /* check media type */ + caps = gst_pad_get_caps (pad); + str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "audio")) { + gst_caps_unref (caps); + return; + } + gst_caps_unref (caps); + +// if( link_with_devsoundsink ) +// { + sinkpad = gst_element_get_pad( sink, "sink"); + //gst_bin_add_many (GST_BIN (pipeline),source, decoder,sink, NULL); + +// } +// else +// { +// audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); +// audioresample = gst_element_factory_make ("audioresample", "audioresample"); +// sinkpad = gst_element_get_pad( audioconvert, "sink"); +// +// gst_bin_add_many (GST_BIN (pipeline),source, decoder,audioconvert,audioresample,sink, NULL); +// +// if (!gst_element_link (audioconvert,audioresample)) +// g_error ("link(audioconvert,audioresample, sink) failed!\n"); +// if (!gst_element_link (audioresample, sink)) +// g_error ("link(audioconvert,audioresample, sink) failed!\n"); +// } + + linkret = gst_pad_link (pad, sinkpad); +} + + +static gboolean +cb_get_position (GstElement* temp /*pipeline*/) +{ + GstFormat fmt = GST_FORMAT_TIME; + gint64 pos = 0, len, time_nanoseconds, diff; + GstState state; + + gst_element_get_state(GST_ELEMENT(pipeline),&state,NULL,-1); + if (gst_element_query_position (pipeline, &fmt, &pos) + && gst_element_query_duration (pipeline, &fmt, &len)) { + g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r", + GST_TIME_ARGS (pos), GST_TIME_ARGS (len)); + } + time_nanoseconds = pos + 1000000000; + + if (!gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, + GST_SEEK_TYPE_SET, time_nanoseconds, + GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) { + g_print ("Seek failed!\n"); + } + + gst_element_get_state(GST_ELEMENT(pipeline),&state,NULL,-1); + + if (gst_element_query_position (pipeline, &fmt, &pos) + && gst_element_query_duration (pipeline, &fmt, &len)) { + g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r", + GST_TIME_ARGS (pos), GST_TIME_ARGS (len)); + } + + diff = pos - time_nanoseconds; + + if( diff > 1000000 ) + { + create_xml( 1 ); + } + + /* call me again */ + return TRUE; +} + +int main (int argc, char *argv[]) +{ + + xmlfile = "launch_logs"; + std_log(LOG_FILENAME_LINE, "Test Started launch"); + + if (argc != 2) { + g_print ("usage: %s \n", argv[0]); + std_log(LOG_FILENAME_LINE, "Test Failed"); + create_xml(1); + exit (-1); + } + //link_with_devsoundsink = FALSE; + gst_init (&argc, &argv); + loop = g_main_loop_new (NULL, FALSE); + + /* create elements */ + pipeline = gst_pipeline_new ("audio-player"); + source = gst_element_factory_make ("filesrc", "file-source"); + decoder = gst_element_factory_make ("decodebin2", "decodebin2-decoder"); + sink = gst_element_factory_make ("devsoundsink", "sink"); +// audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); +// audioresample = gst_element_factory_make ("audioresample", "audioresample"); +// sink = gst_element_factory_make ("devsoundsink", "sink"); + + if (!pipeline || !source || !decoder || !sink) { + g_print ("One element could not be created\n"); + return -1; + } + /* set filename property on the file source. Also add a message handler. */ + g_object_set (G_OBJECT (source), "location", argv[1], NULL); + /* put all elements in a bin */ + gst_bin_add_many (GST_BIN (pipeline),source, decoder,sink, NULL); + /* link together - note that we cannot link the parser and decoder yet, because the parser uses dynamic pads. For that, we set a pad-added signal handler. */ + gst_element_link (source, decoder); + + + + + gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)), bus_call, loop); + + g_signal_connect (decoder, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL); + //g_signal_connect (decoder, "autoplug-continue", G_CALLBACK (cb_autoplug), NULL); + + g_timeout_add (1000/*in mili sec*/, (GSourceFunc) cb_get_position, NULL); + + //g_signal_connect (decoder, "pad-added", G_CALLBACK (new_pad_cb),pipeline); + /* Now set to playing and iterate. */ + g_print ("Setting to PLAYING\n"); + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_print ("Running\n"); + g_main_loop_run (loop); + /* clean up nicely */ + g_print ("Returned, stopping playback\n"); + gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("Deleting pipeline\n"); + gst_object_unref (GST_OBJECT (pipeline)); + + g_print ("completed palying audio\n"); + //std_log(LOG_FILENAME_LINE, "Test Successful"); + //create_xml(0); + return 0; +} diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/helloworld/group/helloworld.mmp --- a/gstreamer_core/tsrc/examples/helloworld/group/helloworld.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/helloworld/group/helloworld.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -54,12 +54,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/launch/group/launch.mmp --- a/gstreamer_core/tsrc/examples/launch/group/launch.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/launch/group/launch.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -54,12 +54,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/launch/group/mp3launch.mmp --- a/gstreamer_core/tsrc/examples/launch/group/mp3launch.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/launch/group/mp3launch.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -54,12 +54,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/launch/src/launch.c --- a/gstreamer_core/tsrc/examples/launch/src/launch.c Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/launch/src/launch.c Thu Jul 22 16:36:00 2010 +0100 @@ -3,12 +3,11 @@ #include #include #include - +#include #define LOG_FILE "c:\\logs\\launch_logs.txt" #include "std_log_result.h" #define LOG_FILENAME_LINE __FILE__, __LINE__ - void create_xml(int result) { @@ -30,7 +29,7 @@ GstElement *pipeline, *source, *wavparse,*sink,*conv,*resample,*decoder,*audioconvert,*audioresample ; GstBus *bus; GMainLoop *loop; - +//gboolean link_with_devsoundsink; //audioconvert ! audioresample static gboolean @@ -43,7 +42,7 @@ gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_quit(loop); gst_object_unref (GST_OBJECT (pipeline)); - std_log(LOG_FILENAME_LINE, "Test Successful"); + //std_log(LOG_FILENAME_LINE, "Test Successful"); create_xml(0); break; case GST_MESSAGE_ERROR: { @@ -53,7 +52,7 @@ g_free (debug); g_print ("Error: %s\n", err->message); g_error_free (err); - std_log(LOG_FILENAME_LINE, "Test Failed"); + //std_log(LOG_FILENAME_LINE, "Test Failed"); create_xml(1); break; } @@ -64,61 +63,144 @@ return TRUE; } -static void -new_pad_cb (GstElement *wavparse, GstPad *new_pad, gpointer pipeline) - { +//static void +//new_pad_cb (GstElement *wavparse, GstPad *new_pad, gpointer pipeline) +// { +// +// gst_element_set_state (pipeline, GST_STATE_PAUSED); +// +// if (!gst_element_link (wavparse, audioconvert)) +// g_error ("link(wavparse, audioconvert) failed!\n"); +// +// gst_element_set_state (pipeline, GST_STATE_PLAYING); +// } + + +static void +cb_newpad (GstElement *decodebin, + GstPad *pad, + gboolean last, + gpointer data) +{ + GstCaps *caps; + GstStructure *str; + GstPadLinkReturn linkret= GST_PAD_LINK_OK ; - gst_element_set_state (pipeline, GST_STATE_PAUSED); + + GstPad* sinkpad = NULL; - if (!gst_element_link (wavparse, audioconvert)) - g_error ("link(wavparse, audioconvert) failed!\n"); + + /* check media type */ + caps = gst_pad_get_caps (pad); + str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "audio")) { + gst_caps_unref (caps); + return; + } + gst_caps_unref (caps); + +// if( link_with_devsoundsink ) +// { + sinkpad = gst_element_get_pad( sink, "sink"); + //gst_bin_add_many (GST_BIN (pipeline),source, decoder,sink, NULL); + +// } +// else +// { +// audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); +// audioresample = gst_element_factory_make ("audioresample", "audioresample"); +// sinkpad = gst_element_get_pad( audioconvert, "sink"); +// +// gst_bin_add_many (GST_BIN (pipeline),source, decoder,audioconvert,audioresample,sink, NULL); +// +// if (!gst_element_link (audioconvert,audioresample)) +// g_error ("link(audioconvert,audioresample, sink) failed!\n"); +// if (!gst_element_link (audioresample, sink)) +// g_error ("link(audioconvert,audioresample, sink) failed!\n"); +// } + + linkret = gst_pad_link (pad, sinkpad); +} - gst_element_set_state (pipeline, GST_STATE_PLAYING); - } +gboolean cb_autoplug( GstBin * *bin, + GstPad *pad, + GstCaps *caps, + gpointer user_data) +{ + GstCaps* sinkcaps = NULL; + gboolean supported = FALSE; + + GstPad* sinkpad = gst_element_get_pad( sink, "sink"); + sinkcaps = gst_pad_get_caps( sinkpad ); + supported = gst_caps_is_subset( caps, sinkcaps ); + + if( supported ) + { + //link_with_devsoundsink = TRUE; + return FALSE; + } + return TRUE; +} int main (int argc, char *argv[]) { - - - xmlfile = "launch_logs"; - std_log(LOG_FILENAME_LINE, "Test Started launch"); + int is_mp3_file = 0; + const char* ext = 0; + //xmlfile = "launch_logs"; + ////std_log(LOG_FILENAME_LINE, "Test Started launch"); if (argc != 2) { - g_print ("usage: %s \n", argv[0]); - std_log(LOG_FILENAME_LINE, "Test Failed"); + g_print ("usage: %s \n", argv[0]); + //std_log(LOG_FILENAME_LINE, "Test Failed"); create_xml(1); exit (-1); } - + ext = strrchr(argv[1],'.'); + if ( ext && ( !strcmp(ext,".mp3") || !strcmp(ext,".Mp3") || !strcmp(ext,".MP3") || !strcmp(ext,".mP3") ) ) + is_mp3_file = 1; + //link_with_devsoundsink = FALSE; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); /* create elements */ pipeline = gst_pipeline_new ("audio-player"); source = gst_element_factory_make ("filesrc", "file-source"); - decoder = gst_element_factory_make ("wavparse", "wavparse-decoder"); - sink = gst_element_factory_make ("devsoundsink", "sink"); - audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); - audioresample = gst_element_factory_make ("audioresample", "audioresample"); - if (!pipeline || !source || !decoder || !audioconvert || !audioresample) { + if (is_mp3_file) + decoder = gst_element_factory_make ("mp3parse", "mp3parse"); + else + decoder = gst_element_factory_make ("decodebin2", "decodebin2-decoder"); + + + sink = gst_element_factory_make ("devsoundsink", "sink"); +// audioconvert = gst_element_factory_make ("audioconvert", "audioconvert"); +// audioresample = gst_element_factory_make ("audioresample", "audioresample"); +// sink = gst_element_factory_make ("devsoundsink", "sink"); + + if (!pipeline || !source || !decoder || !sink) { g_print ("One element could not be created\n"); return -1; } /* set filename property on the file source. Also add a message handler. */ - g_object_set (G_OBJECT (source), "location", "c:\\data\\khuda1.wav", NULL); + g_object_set (G_OBJECT (source), "location", argv[1], NULL); /* put all elements in a bin */ - gst_bin_add_many (GST_BIN (pipeline),source, decoder,audioconvert,audioresample,sink, NULL); - /* link together - note that we cannot link the parser and decoder yet, because the parser uses dynamic pads. For that, we set a pad-added signal handler. */ - gst_element_link (source, decoder); - - if (!gst_element_link (audioconvert,audioresample)) - g_error ("link(audioconvert,audioresample, sink) failed!\n"); - if (!gst_element_link (audioresample, sink)) - g_error ("link(audioconvert,audioresample, sink) failed!\n"); + gst_bin_add_many (GST_BIN (pipeline),source, decoder,sink, NULL); + if (is_mp3_file) + gst_element_link_many (source, decoder, sink, NULL); + else + { + /* link together - note that we cannot link the parser and decoder yet, because the parser uses dynamic pads. For that, we set a pad-added signal handler. */ + gst_element_link (source, decoder); + } + + + gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)), bus_call, loop); + if (!is_mp3_file) + { + g_signal_connect (decoder, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL); + g_signal_connect (decoder, "autoplug-continue", G_CALLBACK (cb_autoplug), NULL); + } - - gst_bus_add_watch (gst_pipeline_get_bus (GST_PIPELINE (pipeline)), bus_call, loop); - g_signal_connect (decoder, "pad-added", G_CALLBACK (new_pad_cb),pipeline); + //g_signal_connect (decoder, "pad-added", G_CALLBACK (new_pad_cb),pipeline); /* Now set to playing and iterate. */ g_print ("Setting to PLAYING\n"); gst_element_set_state (pipeline, GST_STATE_PLAYING); @@ -131,7 +213,7 @@ gst_object_unref (GST_OBJECT (pipeline)); g_print ("completed palying audio\n"); - //std_log(LOG_FILENAME_LINE, "Test Successful"); + ////std_log(LOG_FILENAME_LINE, "Test Successful"); //create_xml(0); return 0; } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/bin/group/bin.mmp --- a/gstreamer_core/tsrc/examples/manual/bin/group/bin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/bin/group/bin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/createelements/group/gstelementcreate.mmp --- a/gstreamer_core/tsrc/examples/manual/createelements/group/gstelementcreate.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/createelements/group/gstelementcreate.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -41,12 +41,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check @@ -78,8 +73,4 @@ STATICLIBRARY libcrt0.lib - - - - SMPSAFE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/elementfactory/group/elementfactory.mmp --- a/gstreamer_core/tsrc/examples/manual/elementfactory/group/elementfactory.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/elementfactory/group/elementfactory.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/getelements/group/gstelementget.mmp --- a/gstreamer_core/tsrc/examples/manual/getelements/group/gstelementget.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/getelements/group/gstelementget.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -41,12 +41,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check @@ -79,8 +74,4 @@ STATICLIBRARY libcrt0.lib - - - - SMPSAFE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/init/group/init.mmp --- a/gstreamer_core/tsrc/examples/manual/init/group/init.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/init/group/init.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/linkelements/group/gstelementgetlink.mmp --- a/gstreamer_core/tsrc/examples/manual/linkelements/group/gstelementgetlink.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/linkelements/group/gstelementgetlink.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -41,12 +41,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check @@ -78,8 +73,4 @@ STATICLIBRARY libcrt0.lib - - - - SMPSAFE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/makeelements/group/gstelementmake.mmp --- a/gstreamer_core/tsrc/examples/manual/makeelements/group/gstelementmake.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/makeelements/group/gstelementmake.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -41,12 +41,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check @@ -76,8 +71,4 @@ STATICLIBRARY libcrt0.lib - - - - SMPSAFE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/manual_decodebin/group/manual_decodebin.mmp --- a/gstreamer_core/tsrc/examples/manual/manual_decodebin/group/manual_decodebin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/manual_decodebin/group/manual_decodebin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/manual_dynamic/group/manual_dynamic.mmp --- a/gstreamer_core/tsrc/examples/manual/manual_dynamic/group/manual_dynamic.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/manual_dynamic/group/manual_dynamic.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -20,12 +20,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/manual_ghostpad/group/manual_ghostpad.mmp --- a/gstreamer_core/tsrc/examples/manual/manual_ghostpad/group/manual_ghostpad.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/manual_ghostpad/group/manual_ghostpad.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -23,12 +23,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/manual_helloworld/group/manual_helloworld.mmp --- a/gstreamer_core/tsrc/examples/manual/manual_helloworld/group/manual_helloworld.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/manual_helloworld/group/manual_helloworld.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -37,12 +37,7 @@ OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/manual_playbin/group/manual_playbin.mmp --- a/gstreamer_core/tsrc/examples/manual/manual_playbin/group/manual_playbin.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/manual_playbin/group/manual_playbin.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/manual_typefind/group/manual_typefind.mmp --- a/gstreamer_core/tsrc/examples/manual/manual_typefind/group/manual_typefind.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/manual_typefind/group/manual_typefind.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -20,12 +20,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/pad/group/pad.mmp --- a/gstreamer_core/tsrc/examples/manual/pad/group/pad.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/pad/group/pad.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/manual/query/group/query.mmp --- a/gstreamer_core/tsrc/examples/manual/query/group/query.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/manual/query/group/query.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -36,12 +36,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../../include/gstreamer -USERINCLUDE ../../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE USERINCLUDE ../../../../../libs/gst/check diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/metadata/group/metadata.mmp --- a/gstreamer_core/tsrc/examples/metadata/group/metadata.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/metadata/group/metadata.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -55,12 +55,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/queue/group/queue.mmp --- a/gstreamer_core/tsrc/examples/queue/group/queue.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/queue/group/queue.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -52,12 +52,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/examples/typefind/group/typefind.mmp --- a/gstreamer_core/tsrc/examples/typefind/group/typefind.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/examples/typefind/group/typefind.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -51,12 +51,7 @@ OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../../../include/gstreamer -USERINCLUDE ../../../../../include/gstreamer/gst -USERINCLUDE ../../../../../include/gstreamer/gst/base -USERINCLUDE ../../../../../include/gstreamer/gst/controller -USERINCLUDE ../../../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_core/tsrc/gstreamertestcases_suite3/conf/gstreamertestcases_suite3.cfg --- a/gstreamer_core/tsrc/gstreamertestcases_suite3/conf/gstreamertestcases_suite3.cfg Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_core/tsrc/gstreamertestcases_suite3/conf/gstreamertestcases_suite3.cfg Thu Jul 22 16:36:00 2010 +0100 @@ -177,4 +177,484 @@ create gstreamertestcases_suite3 foobar foobar Example parse-launch.exe delayed_link delete foobar -[Endtest] \ No newline at end of file +[Endtest] + +/* playback testing */ + + +[Test] +title launch.exe AAC_8k_64kbps_mono_Queen.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_8k_64kbps_mono_Queen.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\AAC_8k_64kbps_mono_Test3.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_8k_64kbps_mono_Test3.aac +delete foobar +[Endtest] + +[Test] +title launch.exe f:\data\AAC_16k_64kbps_mono_Queen.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_16k_64kbps_mono_Queen.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\AAC_16k_64kbps_mono_Test3.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_16k_64kbps_mono_Test3.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_32k_VBR_st_Frederik.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_32k_VBR_st_Frederik.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_32k_VBR_st_Test3.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_32k_VBR_st_Test3.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_44.1k_128kbps_st_music.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_44.1k_128kbps_st_music.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_44.1k_241kbps_st_instrumental.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_44.1k_241kbps_st_instrumental.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_44.1k_264kbps_st_Test3.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_44.1k_264kbps_st_Test3.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_44.1k_264kbps_st_Yo.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_44.1k_264kbps_st_Yo.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_44.1k_VBR_st_Test3.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_44.1k_VBR_st_Test3.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\AAC_44.1k_VBR_st_Yo.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_44.1k_VBR_st_Yo.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\AAC_48k_288kbps_st_Test3.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_48k_288kbps_st_Test3.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\AAC_48k_288kbps_st_Test7.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_48k_288kbps_st_Test7.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\AAC_48k_288kbps_st_Yo.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\AAC_48k_288kbps_st_Yo.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\eAAC_48k_24kbps_st_Frederik.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\eAAC_48k_24kbps_st_Frederik.aac +delete foobar +[Endtest] + +[Test] +title launch.exe f:\data\eAAC_48k_24kbps_st_Test8.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\eAAC_48k_24kbps_st_Test8.aac +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\eAAC_48k_32kbps_st_Test8.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\eAAC_48k_32kbps_st_Test8.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\eAAC_48k_40kbps_st_Test8.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\eAAC_48k_40kbps_st_Test8.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\eAAC_48k_48kbps_st_Frederik.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\eAAC_48k_48kbps_st_Frederik.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\eAAC_48k_48kbps_st_Test8.aac +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\eAAC_48k_48kbps_st_Test8.aac +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\Err_MP3_44.1k_64kbps_mono.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\Err_MP3_44.1k_64kbps_mono.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_11.025k_40kbps_mono_Queen.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_11.025k_40kbps_mono_Queen.mp3 +delete foobar +[Endtest] + + +/* +[Test] +title launch.exe f:\data\MP3_11.025k_40kbps_mono_Test2.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_11.025k_40kbps_mono_Test2.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_16k_96-160kbps_mono_Queen.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_16k_96-160kbps_mono_Queen.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_16k_96-160kbps_mono_Test2.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_16k_96-160kbps_mono_Test2.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_22.05k_8kbps_mono_Test1.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_22.05k_8kbps_mono_Test1.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_22.05k_64kbps_joint_st_Kilpi.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_22.05k_64kbps_joint_st_Kilpi.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_24k_160kbps_st_Test2.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_24k_160kbps_st_Test2.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_32k_48-192kbps_st_Test1.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_32k_48-192kbps_st_Test1.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_mono_0.5k10k_sines.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_mono_0.5k10k_sines.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_Dire.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_Dire.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_Frederik.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_Frederik.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_Queen.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_Queen.mp3 +delete foobar +[Endtest] + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_speech3.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_speech3.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_Test2.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_Test2.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_Test3.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_Test3.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_44.1k_128kbps_st_Test4.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_44.1k_128kbps_st_Test4.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_128kbps_st_Rasmus.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_128kbps_st_Rasmus.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_48k_160-256kbps_st_disco.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_160-256kbps_st_disco.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_160-256kbps_st_Test1.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_160-256kbps_st_Test1.mp3 +delete foobar +[Endtest] + + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_mono_1kHzsine.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_mono_1kHzsine.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_mono_1kHzsine.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_mono_1kHzsine.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_st_1kHzsine.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_st_1kHzsine.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_st_1kHzsine_st2mono.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_st_1kHzsine_st2mono.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_st_dinner_bell.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_st_dinner_bell.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_st_drums.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_st_drums.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_st_flute.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_st_flute.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_256kbps_st_jingle_bells.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_256kbps_st_jingle_bells.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_320kbps_st_ascending.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_320kbps_st_ascending.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_320kbps_st_Queen.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_320kbps_st_Queen.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_320kbps_st_reverb.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_320kbps_st_reverb.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_320kbps_st_stw.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_320kbps_st_stw.mp3 +delete foobar +[Endtest] + + +[Test] +title launch.exe f:\data\MP3_48k_320kbps_st_Test3.mp3 +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\MP3_48k_320kbps_st_Test3.mp3 +delete foobar +[Endtest] + +[Test] +title launch.exe mp3 Reliabity testcase +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\LivingFromMomentToMoment.mp3 +foobar SetTimeout 20 +delete foobar +[Endtest] + +[Test] +title launch.exe AAC Reliabity testcase +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\LivingFromMomentToMoment.aac +foobar SetTimeout 20 +delete foobar +[Endtest] + +[Test] +title launch.exe EAAC Reliabity testcase +create gstreamertestcases_suite3 foobar +foobar Example launch.exe f:\data\LivingFromMomentToMoment.m4a +foobar SetTimeout 20 +delete foobar +[Endtest] + +*/ \ No newline at end of file diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/GLib-Liboil-Sisx/liboil.sisx Binary file gstreamer_test_apps/GLib-Liboil-Sisx/liboil.sisx has changed diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/GLib-Liboil-Sisx/openc_glib_sp.sisx Binary file gstreamer_test_apps/GLib-Liboil-Sisx/openc_glib_sp.sisx has changed diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/QtGSTPlayer/QtGSTPlayer.pro --- a/gstreamer_test_apps/QtGSTPlayer/QtGSTPlayer.pro Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/QtGSTPlayer/QtGSTPlayer.pro Thu Jul 22 16:36:00 2010 +0100 @@ -7,7 +7,7 @@ # Name : QtGSTPlayer.pro # Part of : LibHb / gstplayer # Description : Project definition file for simple gstplayer -# Version : %version: 1 % +# Version : %version: 2 % # # Copyright ? 2008 Nokia. All rights reserved. # This material, including documentation and any related computer @@ -21,13 +21,35 @@ # TEMPLATE = app -TARGET = +TARGET = QtGSTPlayer DEPENDPATH += . -INCLUDEPATH += . - -# Input +HEADERS += folderview.h record_play.h views.h + SOURCES += main.cpp folderview.cpp views.cpp record_play.c -HEADERS += folderview.h views.h RESOURCES += QtGSTPlayer.qrc +DEFINES += HB_GESTURE_FW HB_EFFECTS +INCLUDEPATH += /epoc32/include/mw/hb/hbcore \ + /epoc32/include/mw/hb/hbfeedback \ + /epoc32/include/mw/hb/hbinput \ + /epoc32/include/mw/hb/hbutils \ + /epoc32/include/mw/hb/hbwidgets \ + MW_LAYER_SYSTEMINCLUDE \ + OS_LAYER_LIBC_SYSTEMINCLUDE \ + OS_LAYER_GLIB_SYSTEMINCLUDE \ + MW_LAYER_GSTREAMER_SYSTEMINCLUDE + +#UNIX style Lib inclusion +LIBS += -lhbcore -lhbwidgets -llibglib -llibgobject -llibgthread \ + -llibgstreamer -llibgstbase -llibgstcontroller + + +symbian { + TARGET.UID2 = 0x2002c391 + TARGET.UID3 = 0x2002c392 + TARGET.EPOCHEAPSIZE = 0x100000 0x10000000 + TARGET.CAPABILITY += All -Tcb + } + + diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/QtGSTPlayer/folderview.cpp --- a/gstreamer_test_apps/QtGSTPlayer/folderview.cpp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/QtGSTPlayer/folderview.cpp Thu Jul 22 16:36:00 2010 +0100 @@ -118,11 +118,6 @@ mainWindow()->setCurrentView(Views::folderView()); } -/*void FolderView::settingsViewTriggered() -{ - mainWindow()->setCurrentView(Views::settingsView()); -}*/ - void FolderView::showNote(const int err) { if(err) diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/QtGSTPlayer/views.cpp --- a/gstreamer_test_apps/QtGSTPlayer/views.cpp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/QtGSTPlayer/views.cpp Thu Jul 22 16:36:00 2010 +0100 @@ -18,14 +18,5 @@ // 0 since folderView was added first to the main window return win->viewAt(0); } - -/*! - Returns the pointer to settings view. -*/ - /* HbFormView *settingsView() - { - // 1 since settingsView was the second view added - return static_cast(win->viewAt(1)); - } - */ + } diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/gstplayer/group/gstplayer.mmp --- a/gstreamer_test_apps/gstplayer/group/gstplayer.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/gstplayer/group/gstplayer.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -74,12 +74,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../../include/gstreamer -USERINCLUDE ../../../include/gstreamer/gst -USERINCLUDE ../../../include/gstreamer/gst/base -USERINCLUDE ../../../include/gstreamer/gst/controller -USERINCLUDE ../../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../../include/gstreamer/gst/net +MW_LAYER_GSTREAMER_SYSTEMINCLUDE LIBRARY euser.lib LIBRARY apparc.lib diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/miscfiles/GStreamer_udeb_STUB_SIS.bat --- a/gstreamer_test_apps/miscfiles/GStreamer_udeb_STUB_SIS.bat Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/miscfiles/GStreamer_udeb_STUB_SIS.bat Thu Jul 22 16:36:00 2010 +0100 @@ -1,18 +1,24 @@ -rem -rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -rem All rights reserved. -rem This component and the accompanying materials are made available -rem under the terms of "Eclipse Public License v1.0" -rem which accompanies this distribution, and is available -rem at the URL "http://www.eclipse.org/legal/epl-v10.html". -rem -rem Initial Contributors: -rem Nokia Corporation - initial contribution. -rem -rem Contributors: -rem -rem Description: GStreamer SisStub -rem +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ @echo off echo ---------------------------- diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/miscfiles/GStreamer_urel_STUB_SIS.bat --- a/gstreamer_test_apps/miscfiles/GStreamer_urel_STUB_SIS.bat Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/miscfiles/GStreamer_urel_STUB_SIS.bat Thu Jul 22 16:36:00 2010 +0100 @@ -1,17 +1,24 @@ -rem -rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -rem All rights reserved. -rem This component and the accompanying materials are made available -rem under the terms of "Eclipse Public License v1.0" -rem which accompanies this distribution, and is available -rem at the URL "http://www.eclipse.org/legal/epl-v10.html".rem -rem Initial Contributors: -rem Nokia Corporation - initial contribution. -rem -rem Contributors: -rem -rem Description: GStreamer Sis Stub for UREL -rem +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ @echo off echo ---------------------------- diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/miscfiles/copyplugins.bat --- a/gstreamer_test_apps/miscfiles/copyplugins.bat Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/miscfiles/copyplugins.bat Thu Jul 22 16:36:00 2010 +0100 @@ -1,3 +1,25 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + md \epoc32\release\winscw\udeb\z\sys\bin\plugins COPY \epoc32\release\winscw\udeb\libgstcoreelements.dll \epoc32\release\winscw\udeb\z\sys\bin\plugins\libgstcoreelements.dll diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstreamer_test_apps/miscfiles/createsis.bat --- a/gstreamer_test_apps/miscfiles/createsis.bat Fri Jun 11 16:24:58 2010 +0100 +++ b/gstreamer_test_apps/miscfiles/createsis.bat Thu Jul 22 16:36:00 2010 +0100 @@ -1,3 +1,25 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. +* +* 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 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., 59 Temple Place - Suite 330, +* Boston, MA 02111-1307, USA. +* +* Description: +* +*/ + del ..\..\SIS\gstreamer*.sis* call GStreamer_udeb_STUB_SIS.bat diff -r fae53e47b8b4 -r 7ce29e50e9e1 gstregistrygenerator/group/gstregistrygenerator.mmp --- a/gstregistrygenerator/group/gstregistrygenerator.mmp Fri Jun 11 16:24:58 2010 +0100 +++ b/gstregistrygenerator/group/gstregistrygenerator.mmp Thu Jul 22 16:36:00 2010 +0100 @@ -50,13 +50,7 @@ MW_LAYER_SYSTEMINCLUDE OS_LAYER_LIBC_SYSTEMINCLUDE OS_LAYER_GLIB_SYSTEMINCLUDE -USERINCLUDE ../../include/gstreamer -USERINCLUDE ../../include/gstreamer/gst -USERINCLUDE ../../include/gstreamer/gst/base -USERINCLUDE ../../include/gstreamer/gst/controller -USERINCLUDE ../../include/gstreamer/gst/dataprotocol -USERINCLUDE ../../include/gstreamer/gst/net - +MW_LAYER_GSTREAMER_SYSTEMINCLUDE SOURCEPATH ../src diff -r fae53e47b8b4 -r 7ce29e50e9e1 rom/gstreamer.iby --- a/rom/gstreamer.iby Fri Jun 11 16:24:58 2010 +0100 +++ b/rom/gstreamer.iby Thu Jul 22 16:36:00 2010 +0100 @@ -29,6 +29,7 @@ #define GSTREAMER_IBY #include +#include #ifdef FF_GSTREAMER @@ -47,7 +48,6 @@ file=ABI_DIR\BUILD_DIR\libgstriff.dll SHARED_LIB_DIR\libgstriff.dll file=ABI_DIR\BUILD_DIR\libgsttag.dll SHARED_LIB_DIR\libgsttag.dll file=ABI_DIR\BUILD_DIR\libgstvideo.dll SHARED_LIB_DIR\libgstvideo.dll -file=ABI_DIR\BUILD_DIR\libgstphotography.dll SHARED_LIB_DIR\libgstphotography.dll //file=ABI_DIR\BUILD_DIR\libgstvideorate.dll SHARED_LIB_DIR\libgstvideorate.dll //file=ABI_DIR\BUILD_DIR\libgstvideoscale.dll SHARED_LIB_DIR\libgstvideoscale.dll //file=ABI_DIR\BUILD_DIR\libgstvideotestsrc.dll SHARED_LIB_DIR\libgstvideotestsrc.dll @@ -77,11 +77,13 @@ file=ABI_DIR\BUILD_DIR\libgstrtp.dll SHARED_LIB_DIR\libgstrtp.dll file=ABI_DIR\BUILD_DIR\libgstgdp.dll SHARED_LIB_DIR\libgstgdp.dll file=ABI_DIR\BUILD_DIR\libgstvolume.dll SHARED_LIB_DIR\libgstvolume.dll +file=ABI_DIR\BUILD_DIR\libgstmpegaudioparse.dll SHARED_LIB_DIR\libgstmpegaudioparse.dll +file=ABI_DIR\BUILD_DIR\libgstnokiaaacdec.dll SHARED_LIB_DIR\libgstnokiaaacdec.dll +file=ABI_DIR\BUILD_DIR\libgstqtdemux.dll SHARED_LIB_DIR\libgstqtdemux.dll file=ABI_DIR\BUILD_DIR\libgstamrmux.dll SHARED_LIB_DIR\libgstamrmux.dll -file=ABI_DIR\BUILD_DIR\libgstnokiaaacenc.dll SHARED_LIB_DIR\libgstnokiaaacenc.dll file=ABI_DIR\BUILD_DIR\gstqtmux.dll SHARED_LIB_DIR\gstqtmux.dll +file=ABI_DIR\BUILD_DIR\libgstnokiaaacenc.dll SHARED_LIB_DIR\libgstnokiaaacenc.dll file=ABI_DIR\BUILD_DIR\GstAudioRecordBin.dll SHARED_LIB_DIR\GstAudioRecordBin.dll -//file=ABI_DIR\BUILD_DIR\liboil.dll SHARED_LIB_DIR\liboil.dll //GStreamer_Stub data=ZSYSTEM\install\gstreamer_stub.sis System\Install\gstreamer_stub.sis diff -r fae53e47b8b4 -r 7ce29e50e9e1 sis/gstreamer_framework.pkg Binary file sis/gstreamer_framework.pkg has changed